ReticulumTelemetryHub 0.1.0__py3-none-any.whl → 0.143.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. reticulum_telemetry_hub/api/__init__.py +23 -0
  2. reticulum_telemetry_hub/api/models.py +323 -0
  3. reticulum_telemetry_hub/api/service.py +836 -0
  4. reticulum_telemetry_hub/api/storage.py +528 -0
  5. reticulum_telemetry_hub/api/storage_base.py +156 -0
  6. reticulum_telemetry_hub/api/storage_models.py +118 -0
  7. reticulum_telemetry_hub/atak_cot/__init__.py +49 -0
  8. reticulum_telemetry_hub/atak_cot/base.py +277 -0
  9. reticulum_telemetry_hub/atak_cot/chat.py +506 -0
  10. reticulum_telemetry_hub/atak_cot/detail.py +235 -0
  11. reticulum_telemetry_hub/atak_cot/event.py +181 -0
  12. reticulum_telemetry_hub/atak_cot/pytak_client.py +569 -0
  13. reticulum_telemetry_hub/atak_cot/tak_connector.py +848 -0
  14. reticulum_telemetry_hub/config/__init__.py +25 -0
  15. reticulum_telemetry_hub/config/constants.py +7 -0
  16. reticulum_telemetry_hub/config/manager.py +515 -0
  17. reticulum_telemetry_hub/config/models.py +215 -0
  18. reticulum_telemetry_hub/embedded_lxmd/__init__.py +5 -0
  19. reticulum_telemetry_hub/embedded_lxmd/embedded.py +418 -0
  20. reticulum_telemetry_hub/internal_api/__init__.py +21 -0
  21. reticulum_telemetry_hub/internal_api/bus.py +344 -0
  22. reticulum_telemetry_hub/internal_api/core.py +690 -0
  23. reticulum_telemetry_hub/internal_api/v1/__init__.py +74 -0
  24. reticulum_telemetry_hub/internal_api/v1/enums.py +109 -0
  25. reticulum_telemetry_hub/internal_api/v1/manifest.json +8 -0
  26. reticulum_telemetry_hub/internal_api/v1/schemas.py +478 -0
  27. reticulum_telemetry_hub/internal_api/versioning.py +63 -0
  28. reticulum_telemetry_hub/lxmf_daemon/Handlers.py +122 -0
  29. reticulum_telemetry_hub/lxmf_daemon/LXMF.py +252 -0
  30. reticulum_telemetry_hub/lxmf_daemon/LXMPeer.py +898 -0
  31. reticulum_telemetry_hub/lxmf_daemon/LXMRouter.py +4227 -0
  32. reticulum_telemetry_hub/lxmf_daemon/LXMessage.py +1006 -0
  33. reticulum_telemetry_hub/lxmf_daemon/LXStamper.py +490 -0
  34. reticulum_telemetry_hub/lxmf_daemon/__init__.py +10 -0
  35. reticulum_telemetry_hub/lxmf_daemon/_version.py +1 -0
  36. reticulum_telemetry_hub/lxmf_daemon/lxmd.py +1655 -0
  37. reticulum_telemetry_hub/lxmf_telemetry/model/fields/field_telemetry_stream.py +6 -0
  38. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/__init__.py +3 -0
  39. {lxmf_telemetry → reticulum_telemetry_hub/lxmf_telemetry}/model/persistance/appearance.py +19 -19
  40. {lxmf_telemetry → reticulum_telemetry_hub/lxmf_telemetry}/model/persistance/peer.py +17 -13
  41. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/__init__.py +65 -0
  42. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/acceleration.py +68 -0
  43. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/ambient_light.py +37 -0
  44. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/angular_velocity.py +68 -0
  45. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/battery.py +68 -0
  46. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/connection_map.py +258 -0
  47. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/generic.py +841 -0
  48. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/gravity.py +68 -0
  49. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/humidity.py +37 -0
  50. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/information.py +42 -0
  51. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/location.py +110 -0
  52. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/lxmf_propagation.py +429 -0
  53. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/magnetic_field.py +68 -0
  54. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/physical_link.py +53 -0
  55. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/pressure.py +37 -0
  56. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/proximity.py +37 -0
  57. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/received.py +75 -0
  58. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/rns_transport.py +209 -0
  59. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/sensor.py +65 -0
  60. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/sensor_enum.py +27 -0
  61. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/sensor_mapping.py +58 -0
  62. reticulum_telemetry_hub/lxmf_telemetry/model/persistance/sensors/temperature.py +37 -0
  63. {lxmf_telemetry → reticulum_telemetry_hub/lxmf_telemetry}/model/persistance/sensors/time.py +36 -32
  64. {lxmf_telemetry → reticulum_telemetry_hub/lxmf_telemetry}/model/persistance/telemeter.py +26 -23
  65. reticulum_telemetry_hub/lxmf_telemetry/sampler.py +229 -0
  66. reticulum_telemetry_hub/lxmf_telemetry/telemeter_manager.py +409 -0
  67. reticulum_telemetry_hub/lxmf_telemetry/telemetry_controller.py +804 -0
  68. reticulum_telemetry_hub/northbound/__init__.py +5 -0
  69. reticulum_telemetry_hub/northbound/app.py +195 -0
  70. reticulum_telemetry_hub/northbound/auth.py +119 -0
  71. reticulum_telemetry_hub/northbound/gateway.py +310 -0
  72. reticulum_telemetry_hub/northbound/internal_adapter.py +302 -0
  73. reticulum_telemetry_hub/northbound/models.py +213 -0
  74. reticulum_telemetry_hub/northbound/routes_chat.py +123 -0
  75. reticulum_telemetry_hub/northbound/routes_files.py +119 -0
  76. reticulum_telemetry_hub/northbound/routes_rest.py +345 -0
  77. reticulum_telemetry_hub/northbound/routes_subscribers.py +150 -0
  78. reticulum_telemetry_hub/northbound/routes_topics.py +178 -0
  79. reticulum_telemetry_hub/northbound/routes_ws.py +107 -0
  80. reticulum_telemetry_hub/northbound/serializers.py +72 -0
  81. reticulum_telemetry_hub/northbound/services.py +373 -0
  82. reticulum_telemetry_hub/northbound/websocket.py +855 -0
  83. reticulum_telemetry_hub/reticulum_server/__main__.py +2237 -0
  84. reticulum_telemetry_hub/reticulum_server/command_manager.py +1268 -0
  85. reticulum_telemetry_hub/reticulum_server/command_text.py +399 -0
  86. reticulum_telemetry_hub/reticulum_server/constants.py +1 -0
  87. reticulum_telemetry_hub/reticulum_server/event_log.py +357 -0
  88. reticulum_telemetry_hub/reticulum_server/internal_adapter.py +358 -0
  89. reticulum_telemetry_hub/reticulum_server/outbound_queue.py +312 -0
  90. reticulum_telemetry_hub/reticulum_server/services.py +422 -0
  91. reticulumtelemetryhub-0.143.0.dist-info/METADATA +181 -0
  92. reticulumtelemetryhub-0.143.0.dist-info/RECORD +97 -0
  93. {reticulumtelemetryhub-0.1.0.dist-info → reticulumtelemetryhub-0.143.0.dist-info}/WHEEL +1 -1
  94. reticulumtelemetryhub-0.143.0.dist-info/licenses/LICENSE +277 -0
  95. lxmf_telemetry/model/fields/field_telemetry_stream.py +0 -7
  96. lxmf_telemetry/model/persistance/__init__.py +0 -3
  97. lxmf_telemetry/model/persistance/sensors/location.py +0 -69
  98. lxmf_telemetry/model/persistance/sensors/magnetic_field.py +0 -36
  99. lxmf_telemetry/model/persistance/sensors/sensor.py +0 -44
  100. lxmf_telemetry/model/persistance/sensors/sensor_enum.py +0 -24
  101. lxmf_telemetry/model/persistance/sensors/sensor_mapping.py +0 -9
  102. lxmf_telemetry/telemetry_controller.py +0 -124
  103. reticulum_server/main.py +0 -182
  104. reticulumtelemetryhub-0.1.0.dist-info/METADATA +0 -15
  105. reticulumtelemetryhub-0.1.0.dist-info/RECORD +0 -19
  106. {lxmf_telemetry → reticulum_telemetry_hub}/__init__.py +0 -0
  107. {lxmf_telemetry/model/persistance/sensors → reticulum_telemetry_hub/lxmf_telemetry}/__init__.py +0 -0
  108. {reticulum_server → reticulum_telemetry_hub/reticulum_server}/__init__.py +0 -0
@@ -1,124 +0,0 @@
1
- from typing import Optional
2
- from datetime import datetime
3
- import LXMF
4
- import RNS
5
- from msgpack import packb, unpackb
6
- from lxmf_telemetry.model.persistance import Base
7
- from lxmf_telemetry.model.persistance.sensors.sensor import Sensor
8
- from lxmf_telemetry.model.persistance.telemeter import Telemeter
9
-
10
- from lxmf_telemetry.model.persistance.sensors.sensor_mapping import sid_mapping
11
- from sqlalchemy import create_engine
12
- from sqlalchemy.orm import sessionmaker, Session, joinedload
13
-
14
- _engine = create_engine("sqlite:///telemetry.db")
15
- Base.metadata.create_all(_engine)
16
- Session_cls = sessionmaker(bind=_engine)
17
-
18
-
19
- class TelemetryController:
20
- """This class is responsible for managing the telemetry data."""
21
-
22
- TELEMETRY_REQUEST = 1
23
-
24
- def __init__(self) -> None:
25
- pass
26
-
27
- def get_telemetry(
28
- self, start_time: Optional[datetime] = None, end_time: Optional[datetime] = None
29
- ) -> list[Telemeter]:
30
- """Get the telemetry data."""
31
- with Session_cls() as ses:
32
- query = ses.query(Telemeter)
33
- if start_time:
34
- query = query.filter(Telemeter.time >= start_time)
35
- if end_time:
36
- query = query.filter(Telemeter.time <= end_time)
37
- tels = query.options(joinedload(Telemeter.sensors)).all()
38
- return tels
39
-
40
- def save_telemetry(self, telemetry_data: dict, peer_dest) -> None:
41
- """Save the telemetry data."""
42
- tel = self._deserialize_telemeter(telemetry_data, peer_dest)
43
- with Session_cls() as ses:
44
- ses.add(tel)
45
- ses.commit()
46
-
47
- def handle_message(self, message: LXMF.LXMessage) -> bool:
48
- """Handle the incoming message."""
49
- handled = False
50
- if LXMF.FIELD_TELEMETRY in message.fields:
51
- tel_data: dict = unpackb(
52
- message.fields[LXMF.FIELD_TELEMETRY], strict_map_key=False
53
- )
54
- RNS.log(f"Telemetry data: {tel_data}")
55
- self.save_telemetry(tel_data, RNS.hexrep(message.source_hash, False))
56
- handled = True
57
- if LXMF.FIELD_TELEMETRY_STREAM in message.fields:
58
- tels_data = unpackb(
59
- message.fields[LXMF.FIELD_TELEMETRY_STREAM], strict_map_key=False
60
- )
61
- for tel_data in tels_data:
62
- self.save_telemetry(tel_data, RNS.hexrep(tel_data.pop(0)))
63
- handled = True
64
-
65
- return handled
66
-
67
- def handle_command(self, command: dict, message: LXMF.LXMessage, my_lxm_dest) -> Optional[LXMF.LXMessage]:
68
- """Handle the incoming command."""
69
- if TelemetryController.TELEMETRY_REQUEST in command:
70
- timebase = command[TelemetryController.TELEMETRY_REQUEST]
71
- tels = self.get_telemetry(start_time=datetime.fromtimestamp(timebase))
72
- packed_tels = []
73
- dest = RNS.Destination(
74
- message.source.identity,
75
- RNS.Destination.OUT,
76
- RNS.Destination.SINGLE,
77
- "lxmf",
78
- "delivery",
79
- )
80
- message = LXMF.LXMessage(
81
- dest,
82
- my_lxm_dest,
83
- "Telemetry data",
84
- desired_method=LXMF.LXMessage.DIRECT,
85
- )
86
- for tel in tels:
87
- tel_data = self._serialize_telemeter(tel)
88
- packed_tels.append(
89
- [
90
- bytes.fromhex(tel.peer_dest),
91
- round(tel.time.timestamp()),
92
- packb(tel_data),
93
- ['account', b'\x00\x00\x00', b'\xff\xff\xff'],
94
- ]
95
- )
96
- message.fields[LXMF.FIELD_TELEMETRY_STREAM] = packed_tels
97
- print("+--- Sending telemetry data---------------------------------")
98
- print(f"| Telemetry data: {packed_tels}")
99
- print(f"| Message: {message}")
100
- print("+------------------------------------------------------------")
101
- return message
102
- else:
103
- return None
104
-
105
- def _serialize_telemeter(self, telemeter: Telemeter) -> dict:
106
- """Serialize the telemeter data."""
107
- telemeter_data = {}
108
- for sensor in telemeter.sensors:
109
- sensor_data = sensor.pack()
110
- telemeter_data[sensor.sid] = sensor_data
111
- return telemeter_data
112
-
113
- def _deserialize_telemeter(self, tel_data: dict, peer_dest: str) -> Telemeter:
114
- """Deserialize the telemeter data."""
115
- tel = Telemeter(peer_dest)
116
- for sid in tel_data:
117
- if sid in sid_mapping:
118
- if tel_data[sid] is None:
119
- RNS.log(f"Sensor data for {sid} is None")
120
- continue
121
- sensor = sid_mapping[sid]()
122
- sensor.unpack(tel_data[sid])
123
- tel.sensors.append(sensor)
124
- return tel
reticulum_server/main.py DELETED
@@ -1,182 +0,0 @@
1
- import os
2
- import time
3
- import LXMF
4
- import RNS
5
- from lxmf_telemetry.telemetry_controller import TelemetryController
6
-
7
- # Constants
8
- STORAGE_PATH = "./tmp1" # Path to store temporary files
9
- IDENTITY_PATH = os.path.join(STORAGE_PATH, "identity") # Path to store identity file
10
- APP_NAME = LXMF.APP_NAME + ".delivery" # Application name for LXMF
11
-
12
- tel_controller = TelemetryController()
13
-
14
- class AnnounceHandler:
15
- def __init__(self, connections, my_lxmf_dest, lxm_router):
16
- self.aspect_filter = APP_NAME # Filter for LXMF announcements
17
- self.connections = connections # List to store connections
18
- self.my_lxmf_dest = my_lxmf_dest # LXMF destination
19
- self.lxm_router = lxm_router # LXMF router
20
-
21
- def received_announce(self, destination_hash, announced_identity, app_data):
22
- # Log the received announcement details
23
- RNS.log("\t+--- LXMF Announcement -----------------------------------------")
24
- RNS.log(f"\t| Source hash : {RNS.prettyhexrep(destination_hash)}")
25
- RNS.log(f"\t| Announced identity : {announced_identity}")
26
- RNS.log(f"\t| App data : {app_data}")
27
- RNS.log("\t+---------------------------------------------------------------")
28
-
29
- # Create a new destination from the announced identity
30
- dest = RNS.Destination(
31
- announced_identity,
32
- RNS.Destination.OUT,
33
- RNS.Destination.SINGLE,
34
- "lxmf",
35
- "delivery",
36
- )
37
- self.connections.append(dest) # Add the new destination to connections
38
-
39
- # Create and send a message to the new destination
40
- message = LXMF.LXMessage(
41
- dest, self.my_lxmf_dest, "Hi there", desired_method=LXMF.LXMessage.DIRECT
42
- )
43
- self.lxm_router.handle_outbound(message) # Handle outbound message
44
-
45
- def command_handler(commands: list, message: LXMF.LXMessage, lxm_router, my_lxmf_dest):
46
- for command in commands:
47
- print(f"Command: {command}")
48
- msg = tel_controller.handle_command(command, message, my_lxmf_dest)
49
- if msg:
50
- lxm_router.handle_outbound(msg)
51
-
52
- def delivery_callback(message: LXMF.LXMessage, connections, my_lxmf_dest, lxm_router):
53
- # Format the timestamp of the message
54
- try:
55
- time_string = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(message.timestamp))
56
- signature_string = "Signature is invalid, reason undetermined"
57
-
58
- # Determine the signature validation status
59
- if message.signature_validated:
60
- signature_string = "Validated"
61
- elif message.unverified_reason == LXMF.LXMessage.SIGNATURE_INVALID:
62
- signature_string = "Invalid signature"
63
- elif message.unverified_reason == LXMF.LXMessage.SOURCE_UNKNOWN:
64
- signature_string = "Cannot verify, source is unknown"
65
-
66
- if message.signature_validated and LXMF.FIELD_COMMANDS in message.fields:
67
- command_handler(message.fields[LXMF.FIELD_COMMANDS], message, lxm_router, my_lxmf_dest)
68
- return
69
-
70
- if tel_controller.handle_message(message):
71
- RNS.log("Telemetry data saved")
72
- return
73
-
74
- # Log the delivery details
75
- RNS.log("\t+--- LXMF Delivery ---------------------------------------------")
76
- RNS.log(f"\t| Source hash : {RNS.prettyhexrep(message.source_hash)}")
77
- RNS.log(f"\t| Source instance : {message.get_source()}")
78
- RNS.log(
79
- f"\t| Destination hash : {RNS.prettyhexrep(message.destination_hash)}"
80
- )
81
- #RNS.log(f"\t| Destination identity : {message.source_identity}")
82
- RNS.log(f"\t| Destination instance : {message.get_destination()}")
83
- RNS.log(f"\t| Transport Encryption : {message.transport_encryption}")
84
- RNS.log(f"\t| Timestamp : {time_string}")
85
- RNS.log(f"\t| Title : {message.title_as_string()}")
86
- RNS.log(f"\t| Content : {message.content_as_string()}")
87
- RNS.log(f"\t| Fields : {message.fields}")
88
- RNS.log(f"\t| Message signature : {signature_string}")
89
- RNS.log("\t+---------------------------------------------------------------")
90
- for connection in connections:
91
- if connection.hash != message.source_hash:
92
- response = LXMF.LXMessage(
93
- connection,
94
- my_lxmf_dest,
95
- message.content_as_string(),
96
- desired_method=LXMF.LXMessage.DIRECT,
97
- )
98
- lxm_router.handle_outbound(response) # Handle outbound response
99
- except Exception as e:
100
- RNS.log(f"Error: {e}")
101
-
102
- def load_or_generate_identity(identity_path):
103
- # Load existing identity or generate a new one
104
- if os.path.exists(identity_path):
105
- try:
106
- RNS.log("Loading existing identity")
107
- return RNS.Identity.from_file(identity_path)
108
- except:
109
- RNS.log("Failed to load existing identity, generating new")
110
- else:
111
- RNS.log("Generating new identity")
112
-
113
- identity = RNS.Identity() # Create a new identity
114
- identity.to_file(identity_path) # Save the new identity to file
115
- return identity
116
-
117
-
118
-
119
- def main():
120
- global my_lxmf_dest
121
- connections = [] # List to store connections
122
- r = RNS.Reticulum() # Initialize Reticulum
123
- lxm_router = LXMF.LXMRouter(storagepath=STORAGE_PATH) # Initialize LXMF router
124
- # lxm_router.enable_propagation()
125
- identity = load_or_generate_identity(IDENTITY_PATH) # Load or generate identity
126
- my_lxmf_dest = lxm_router.register_delivery_identity(
127
- identity, "test_server"
128
- ) # Register delivery identity
129
- lxm_router.set_message_storage_limit(megabytes=5)
130
- lxm_router.enable_propagation()
131
-
132
- # Register delivery callback
133
- lxm_router.register_delivery_callback(
134
- lambda msg: delivery_callback(msg, connections, my_lxmf_dest, lxm_router)
135
- )
136
- # Register announce handler
137
- RNS.Transport.register_announce_handler(
138
- AnnounceHandler(connections, my_lxmf_dest, lxm_router)
139
- )
140
-
141
- # Announce LXMF identity
142
- my_lxmf_dest.announce()
143
- lxm_router.announce_propagation_node()
144
- RNS.log("LXMF identity announced")
145
- RNS.log("\t+--- LXMF Identity ---------------------------------------------")
146
- RNS.log(f"\t| Hash : {RNS.prettyhexrep(my_lxmf_dest.hash)}")
147
- RNS.log(
148
- f"\t| Public key : {RNS.prettyhexrep(my_lxmf_dest.identity.pub.public_bytes())}"
149
- )
150
- RNS.log("\t+---------------------------------------------------------------")
151
-
152
- # Periodically announce the LXMF identity
153
- while True:
154
- choice = input("Enter your choice (exit/announce/telemetry): ")
155
-
156
- if choice == "exit":
157
- break
158
- elif choice == "announce":
159
- my_lxmf_dest.announce()
160
- elif choice == "announce_prop":
161
- lxm_router.announce_propagation_node()
162
- elif choice == "telemetry":
163
- connection_hash = input("Enter the connection hash: ")
164
- found = False
165
- for connection in connections:
166
- if connection.hexhash == connection_hash:
167
- message = LXMF.LXMessage(
168
- connection,
169
- my_lxmf_dest,
170
- "Requesting telemetry",
171
- desired_method=LXMF.LXMessage.DIRECT,
172
- fields={LXMF.FIELD_COMMANDS: [{TelemetryController.TELEMETRY_REQUEST: 1000000000}]}
173
- )
174
- lxm_router.handle_outbound(message)
175
- found = True
176
- break
177
- if not found:
178
- print("Connection not found")
179
-
180
-
181
- if __name__ == "__main__":
182
- main()
@@ -1,15 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: ReticulumTelemetryHub
3
- Version: 0.1.0
4
- Summary:
5
- Author: naman108
6
- Requires-Python: >=3.12,<4.0
7
- Classifier: Programming Language :: Python :: 3
8
- Classifier: Programming Language :: Python :: 3.12
9
- Requires-Dist: lxmf (>=0.4.4,<0.5.0)
10
- Requires-Dist: msgpack (>=1.0.8,<2.0.0)
11
- Requires-Dist: pytest (>=8.3.2,<9.0.0)
12
- Requires-Dist: sqlalchemy (>=2.0.32,<3.0.0)
13
- Description-Content-Type: text/markdown
14
-
15
-
@@ -1,19 +0,0 @@
1
- lxmf_telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- lxmf_telemetry/model/fields/field_telemetry_stream.py,sha256=d1cZ4MICGnJLh6n0kG0Rfh27h1rTiSlUNilgFHO9Q8o,139
3
- lxmf_telemetry/model/persistance/__init__.py,sha256=hD85jXD4cCPILUALrU0NB3Cy-bpaxPjkeeUsMYWjkLA,84
4
- lxmf_telemetry/model/persistance/appearance.py,sha256=D_IeRMW3OjdEzJB295h0lIHsRrG6JyeQmoC_Y2k085s,631
5
- lxmf_telemetry/model/persistance/peer.py,sha256=tvTePw_krqGzcZWAc8QI8WwP4BXQ5mgrVsj3gB0TLWs,488
6
- lxmf_telemetry/model/persistance/sensors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- lxmf_telemetry/model/persistance/sensors/location.py,sha256=rMqsfCksHvp-Ol3YkfKHzkDBP4Wv-uki44oCHSHiKzM,2686
8
- lxmf_telemetry/model/persistance/sensors/magnetic_field.py,sha256=n5FBwUgYMTremcUUTp06ZiRE_ZiHtcjP9EUgk6rcd0U,1063
9
- lxmf_telemetry/model/persistance/sensors/sensor.py,sha256=6wajbHL1ns5khwuje7-DSQmUYGsCMclkccsy8LCAe-o,1502
10
- lxmf_telemetry/model/persistance/sensors/sensor_enum.py,sha256=JUjfjg4RKHGhyNjKURPOr1Ij9gge8tD1IBgWXSiRJX0,718
11
- lxmf_telemetry/model/persistance/sensors/sensor_mapping.py,sha256=3FREi7bhgXxSpVH6iZcWznKxvRwEQVCXuyBFwwSeuRk,237
12
- lxmf_telemetry/model/persistance/sensors/time.py,sha256=oor-uHLq05N-5TPvXzBIfTgXH0tAkQ7T61dXGCcyn1o,958
13
- lxmf_telemetry/model/persistance/telemeter.py,sha256=skhoPaifmQsypv11Aon4b8zQg84qohuVmYGJtSmqaU0,973
14
- lxmf_telemetry/telemetry_controller.py,sha256=wMmrNY-CRfbwfQvA4xWT1vPz1VnLER6cRrPictkkPC4,4961
15
- reticulum_server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- reticulum_server/main.py,sha256=BPLcln7ZQgaUREJvFgBZnkfLRtYZnEUx1M96fMq7PYY,7940
17
- reticulumtelemetryhub-0.1.0.dist-info/METADATA,sha256=Qe-h5spqSFpHa-AgNrGGzJ5_cfIf0olBpDu5tn_lTl4,422
18
- reticulumtelemetryhub-0.1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
19
- reticulumtelemetryhub-0.1.0.dist-info/RECORD,,
File without changes