ul-data-logger-api-sdk 3.3.4__tar.gz → 3.4.0__tar.gz

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 (18) hide show
  1. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/PKG-INFO +1 -1
  2. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/data_logger_api_sdk.py +17 -43
  3. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/pyproject.toml +1 -1
  4. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_base_stations.py +3 -32
  5. ul_data_logger_api_sdk-3.4.0/types/api_bs_device_links.py +15 -0
  6. ul_data_logger_api_sdk-3.4.0/types/api_uplink_signal.py +22 -0
  7. ul_data_logger_api_sdk-3.3.4/types/api_bs_device_links.py +0 -25
  8. ul_data_logger_api_sdk-3.3.4/types/api_uplink_signal.py +0 -29
  9. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/.gitignore +0 -0
  10. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/__init__.py +0 -0
  11. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/data_logger_sdk_config.py +0 -0
  12. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/py.typed +0 -0
  13. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/__init__.py +0 -0
  14. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_bs_traffic_stats.py +0 -0
  15. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_device_data_history.py +0 -0
  16. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_last_bs_data_by_device_macs.py +0 -0
  17. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_packet_types.py +0 -0
  18. {ul_data_logger_api_sdk-3.3.4 → ul_data_logger_api_sdk-3.4.0}/types/api_protocol_types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ul-data-logger-api-sdk
3
- Version: 3.3.4
3
+ Version: 3.4.0
4
4
  Summary: Data logger API sdk
5
5
  Author: Unic-lab
6
6
  License-Expression: MIT
@@ -25,7 +25,7 @@ from data_logger_api_sdk.types.api_base_stations import (
25
25
  ApiBaseStationSystemLogResponse,
26
26
  ApiBaseStationSystemLogsListResult,
27
27
  )
28
- from data_logger_api_sdk.types.api_bs_device_links import ApiBsDeviceLinkResponse, ApiBsDeviceLinksListResult
28
+ from data_logger_api_sdk.types.api_bs_device_links import ApiBsDeviceLinkResponse
29
29
  from data_logger_api_sdk.types.api_bs_traffic_stats import ApiBsTrafficStatsResponse, ApiDeviceTrafficStatsQuery
30
30
  from data_logger_api_sdk.types.api_uplink_signal import (
31
31
  ApiDeviceUplinkSignalLatestResponse,
@@ -180,7 +180,6 @@ class DataLoggerApiSdk:
180
180
  serial_number: int | None = None,
181
181
  log_stat_days: int = 0,
182
182
  ) -> ApiBaseStationsListResult:
183
- """GET /base-stations — список базовых станций Data Logger."""
184
183
  query: Dict[str, Any] = {
185
184
  "limit": limit,
186
185
  "offset": offset,
@@ -202,12 +201,7 @@ class DataLoggerApiSdk:
202
201
  offset: int = 0,
203
202
  macs: List[int] | None = None,
204
203
  ) -> ApiDeviceUplinkSignalsListResult:
205
- """GET /uplink-signal-latest — последний uplink-сигнал каждого мака.
206
-
207
- Последний по метеру, группировка по маку (один мак = одна строка);
208
- macs — рантайм-фильтр по конкретным устройствам. bs_id —
209
- идентификатор БС Data Logger (= external_bs_id потребителя).
210
- """
204
+ """Последний uplink-сигнал каждого мака (один мак — одна строка)."""
211
205
  query: Dict[str, Any] = {"limit": limit, "offset": offset}
212
206
  if macs:
213
207
  query["mac"] = macs
@@ -219,28 +213,27 @@ class DataLoggerApiSdk:
219
213
  )
220
214
  return ApiDeviceUplinkSignalsListResult(items=items, total_count=total_count)
221
215
 
222
- def get_bs_device_links(
216
+ def get_bs_device_links_for_bs(
223
217
  self,
218
+ bs_id: UUID,
224
219
  start_at: datetime,
225
220
  end_at: datetime | None = None,
226
- limit: int = 500,
227
- offset: int = 0,
228
- ) -> ApiBsDeviceLinksListResult:
229
- """GET /bs-device-links — связи «мак ↔ БС» за период («когда-либо» при start_at из далёкого прошлого).
221
+ ) -> List[ApiBsDeviceLinkResponse]:
222
+ """GET /bs-device-links?bs_id=… — связи «мак ↔ БС» одной БС за окно (~90 дней ночного синка).
230
223
 
231
- Один запрос по журналу device_log (дистинкт по паре мак+БС) вместо
232
- обхода всех БС; для ночного синка слоя «Объекты и устройства».
224
+ Ответ капится сервером (DL_BS_LINKS_PER_BS_LIMIT, при переполнении
225
+ дробится окно); дедуп между под-окнами — на потребителе.
233
226
  """
234
- query: Dict[str, Any] = {"start_at": start_at.isoformat(), "limit": limit, "offset": offset}
227
+ query: Dict[str, Any] = {"bs_id": str(bs_id), "start_at": start_at.isoformat()}
235
228
  if end_at is not None:
236
229
  query["end_at"] = end_at.isoformat()
237
- items, total_count = self._request_list_payload_once(
238
- ApiMethod.GET,
239
- "/bs-device-links",
240
- List[ApiBsDeviceLinkResponse], # type: ignore
241
- query,
242
- )
243
- return ApiBsDeviceLinksListResult(items=items, total_count=total_count)
230
+ response = self._api.request(
231
+ method=ApiMethod.GET,
232
+ path="/bs-device-links",
233
+ json=None,
234
+ q=query,
235
+ ).typed(List[ApiBsDeviceLinkResponse]).check()
236
+ return response.payload
244
237
 
245
238
  def get_base_station(
246
239
  self,
@@ -248,11 +241,7 @@ class DataLoggerApiSdk:
248
241
  log_stat_days: int = 0,
249
242
  exclude_log_types: List[str] | None = None,
250
243
  ) -> ApiBaseStationDetailResponse:
251
- """GET /base-stations/<uuid> — карточка базовой станции Data Logger.
252
-
253
- exclude_log_types исключает типы из logs_stat (например, ['heartbit']);
254
- без него счётчики включают служебные heartbeat-логи.
255
- """
244
+ """exclude_log_types исключает типы из счётчиков logs_stat (например, ['heartbit'])."""
256
245
  query: Dict[str, Any] = {"log_stat_days": log_stat_days}
257
246
  if exclude_log_types:
258
247
  query["exclude_log_types"] = exclude_log_types
@@ -273,11 +262,6 @@ class DataLoggerApiSdk:
273
262
  exclude_log_types: List[str] | None = None,
274
263
  sort: str | None = None,
275
264
  ) -> ApiBaseStationLogsListResult:
276
- """GET /base-stations/<uuid>/logs — журнал логов базовой станции.
277
-
278
- exclude_log_types передаётся стандартным filter-параметром
279
- (например, ['heartbit'] прячет служебные heartbeat-логи).
280
- """
281
265
  query: Dict[str, Any] = {"limit": limit, "offset": offset}
282
266
  if start_at is not None:
283
267
  query["start_at"] = start_at.isoformat()
@@ -300,7 +284,6 @@ class DataLoggerApiSdk:
300
284
  base_station_id: UUID,
301
285
  log_id: UUID,
302
286
  ) -> ApiBaseStationLogDetailResponse:
303
- """GET /base-stations/<uuid>/logs/<uuid> — конкретный лог БС с сырым JSON пакета."""
304
287
  return self._request_payload_once(
305
288
  ApiMethod.GET,
306
289
  f"/base-stations/{base_station_id}/logs/{log_id}",
@@ -315,7 +298,6 @@ class DataLoggerApiSdk:
315
298
  limit: int = 100,
316
299
  offset: int = 0,
317
300
  ) -> ApiBaseStationSystemLogsListResult:
318
- """GET /base-stations/<uuid>/system-logs — журнал системных логов базовой станции."""
319
301
  query: Dict[str, Any] = {"limit": limit, "offset": offset}
320
302
  if start_at is not None:
321
303
  query["start_at"] = start_at.isoformat()
@@ -335,10 +317,6 @@ class DataLoggerApiSdk:
335
317
  day: date,
336
318
  exclude_log_types: List[str] | None = None,
337
319
  ) -> ApiBaseStationLogsStatResponse:
338
- """GET /base-stations/<uuid>/logs-stat — статистика логов базовой станции за сутки.
339
-
340
- exclude_log_types исключает типы из поминутных счётчиков (['heartbit'] прячет heartbeat).
341
- """
342
320
  query: Dict[str, Any] = {"day": day.isoformat()}
343
321
  if exclude_log_types:
344
322
  query["exclude_log_types"] = exclude_log_types
@@ -355,7 +333,6 @@ class DataLoggerApiSdk:
355
333
  start_at: datetime,
356
334
  end_at: datetime | None = None,
357
335
  ) -> ApiBaseStationDeviceLogsStatResponse:
358
- """GET /base-stations/<uuid>/device-logs-stat — число логов устройств БС по дням."""
359
336
  query: Dict[str, Any] = {"start_at": start_at.isoformat()}
360
337
  if end_at is not None:
361
338
  query["end_at"] = end_at.isoformat()
@@ -372,7 +349,6 @@ class DataLoggerApiSdk:
372
349
  start_at: datetime,
373
350
  end_at: datetime | None = None,
374
351
  ) -> ApiBaseStationLogsStatForIntervalsResponse:
375
- """GET /base-stations/<uuid>/logs-stat-for-intervals — метки времени логов за интервал."""
376
352
  query: Dict[str, Any] = {"start_at": start_at.isoformat()}
377
353
  if end_at is not None:
378
354
  query["end_at"] = end_at.isoformat()
@@ -391,7 +367,6 @@ class DataLoggerApiSdk:
391
367
  limit: int = 100,
392
368
  offset: int = 0,
393
369
  ) -> ApiBaseStationDevicesResponse:
394
- """GET /base-stations/<uuid>/devices — устройства, работающие через базовую станцию."""
395
370
  query: Dict[str, Any] = {"start_at": start_at.isoformat(), "limit": limit, "offset": offset}
396
371
  if end_at is not None:
397
372
  query["end_at"] = end_at.isoformat()
@@ -410,7 +385,6 @@ class DataLoggerApiSdk:
410
385
  limit: int = 100,
411
386
  offset: int = 0,
412
387
  ) -> ApiBaseStationDeviceLogsResponse:
413
- """GET /base-stations/<uuid>/device-logs — логи устройств базовой станции."""
414
388
  query: Dict[str, Any] = {"start_at": start_at.isoformat(), "limit": limit, "offset": offset}
415
389
  if end_at is not None:
416
390
  query["end_at"] = end_at.isoformat()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ul-data-logger-api-sdk"
7
- version = "3.3.4"
7
+ version = "3.4.0"
8
8
  description = "Data logger API sdk"
9
9
  license = "MIT"
10
10
  requires-python = ">=3.14"
@@ -9,29 +9,21 @@ BS__LOG_TYPE__HEARTBIT = "heartbit"
9
9
 
10
10
 
11
11
  class ApiBaseStationsListResult(NamedTuple):
12
- """Результат спискового вызова BS-endpoint Data Logger: страница элементов и total_count."""
13
-
14
12
  items: List["ApiBaseStationResponse"]
15
13
  total_count: int
16
14
 
17
15
 
18
16
  class ApiBaseStationLogsListResult(NamedTuple):
19
- """Результат вызова GET /base-stations/<uuid>/logs."""
20
-
21
17
  items: List["ApiBaseStationLogResponse"]
22
18
  total_count: int
23
19
 
24
20
 
25
21
  class ApiBaseStationSystemLogsListResult(NamedTuple):
26
- """Результат вызова GET /base-stations/<uuid>/system-logs."""
27
-
28
22
  items: List["ApiBaseStationSystemLogResponse"]
29
23
  total_count: int
30
24
 
31
25
 
32
26
  class ApiBaseStationResponse(JsonApiResponsePayload):
33
- """Элемент ответа GET /base-stations (BsListShortResponse на стороне Data Logger)."""
34
-
35
27
  id: UUID4
36
28
  date_created: datetime
37
29
  date_modified: datetime
@@ -55,8 +47,6 @@ class ApiBaseStationResponse(JsonApiResponsePayload):
55
47
 
56
48
 
57
49
  class ApiBaseStationDetailResponse(ApiBaseStationResponse):
58
- """Ответ GET /base-stations/<uuid> (BsResponse на стороне Data Logger)."""
59
-
60
50
  latest_sdr_config: Dict[str, Any] | None = None
61
51
  device_counts: List[Tuple[datetime, int]] | None = None
62
52
  system_logs_stat: List[Tuple[datetime, int]] | None = None
@@ -65,12 +55,7 @@ class ApiBaseStationDetailResponse(ApiBaseStationResponse):
65
55
 
66
56
 
67
57
  class ApiBaseStationLogResponse(JsonApiResponsePayload):
68
- """Элемент ответа GET /base-stations/<uuid>/logs (ApiBsLogsResponse на стороне Data Logger).
69
-
70
- rssi/snr/protocol_type/packet_type_name/network_sys_type/error_* обогащаются
71
- из сырого документа пакета (блок meta.bs_http / meta.nbfi_bs0); null, если
72
- документа нет или в нём нет этих полей.
73
- """
58
+ """Лог БС; rssi/snr и поля пакета (protocol_type, error_*) — из сырого документа, null при его отсутствии."""
74
59
 
75
60
  id: UUID4
76
61
  date_created: datetime
@@ -98,14 +83,10 @@ class ApiBaseStationLogResponse(JsonApiResponsePayload):
98
83
 
99
84
 
100
85
  class ApiBaseStationLogDetailResponse(ApiBaseStationLogResponse):
101
- """Ответ GET /base-stations/<uuid>/logs/<uuid> — лог с сырым JSON пакета (ApiBsLogDetailResponse в DL)."""
102
-
103
86
  data: Dict[str, Any] | None = None
104
87
 
105
88
 
106
89
  class ApiBaseStationSystemLogResponse(JsonApiResponsePayload):
107
- """Элемент ответа GET /base-stations/<uuid>/system-logs (ApiBsSystemLogsResponse)."""
108
-
109
90
  id: UUID4
110
91
  date_created: datetime
111
92
 
@@ -118,26 +99,22 @@ class ApiBaseStationSystemLogResponse(JsonApiResponsePayload):
118
99
 
119
100
 
120
101
  class ApiBaseStationLogsStatResponse(JsonApiResponsePayload):
121
- """Ответ GET /base-stations/<uuid>/logs-stat (ApiBsLogsStatResponse)."""
122
-
123
102
  stats: List[Tuple[datetime, int]]
124
103
 
125
104
 
126
105
  class ApiBaseStationLogsStatForIntervalsResponse(JsonApiResponsePayload):
127
- """Ответ GET /base-stations/<uuid>/logs-stat-for-intervals (ApiBsLogsStatForIntervalsGraphResponse)."""
106
+ """Метки времени логов за интервал."""
128
107
 
129
108
  stats: List[datetime]
130
109
 
131
110
 
132
111
  class ApiBaseStationDeviceLogsStatResponse(JsonApiResponsePayload):
133
- """Ответ GET /base-stations/<uuid>/device-logs-stat: число логов устройств по дням."""
112
+ """Число логов устройств БС по дням."""
134
113
 
135
114
  stats: List[Tuple[date, int]]
136
115
 
137
116
 
138
117
  class ApiBaseStationDeviceResponse(JsonApiResponsePayload):
139
- """Элемент devices ответа GET /base-stations/<uuid>/devices (ApiDeviceResponse без вложенной БС)."""
140
-
141
118
  id: UUID4
142
119
  date_created: datetime
143
120
  date_modified: datetime
@@ -163,15 +140,11 @@ class ApiBaseStationDeviceResponse(JsonApiResponsePayload):
163
140
 
164
141
 
165
142
  class ApiBaseStationDevicesResponse(JsonApiResponsePayload):
166
- """Ответ GET /base-stations/<uuid>/devices (ApiBsDevicesResponse)."""
167
-
168
143
  devices: List[ApiBaseStationDeviceResponse]
169
144
  device_count: int
170
145
 
171
146
 
172
147
  class ApiBaseStationDeviceLogResponse(JsonApiResponsePayload):
173
- """Элемент device_logs ответа GET /base-stations/<uuid>/device-logs (ApiDeviceLogsResponse)."""
174
-
175
148
  id: UUID4
176
149
  date_created: datetime
177
150
 
@@ -202,8 +175,6 @@ class ApiBaseStationDeviceLogResponse(JsonApiResponsePayload):
202
175
 
203
176
 
204
177
  class ApiBaseStationDeviceLogsResponse(JsonApiResponsePayload):
205
- """Ответ GET /base-stations/<uuid>/device-logs (ApiBsDeviceLogsResponse)."""
206
-
207
178
  device_logs: List[ApiBaseStationDeviceLogResponse]
208
179
  device_logs_count: int
209
180
  device_count: int
@@ -0,0 +1,15 @@
1
+ from pydantic import UUID4
2
+ from ul_api_utils.api_resource.api_response import JsonApiResponsePayload
3
+
4
+
5
+ class ApiBsDeviceLinkResponse(JsonApiResponsePayload):
6
+ """Связь «мак ↔ БС» за период: элемент ответа GET /bs-device-links.
7
+
8
+ bs_id — идентификатор БС Data Logger (у потребителя unified API —
9
+ external_bs_id); bs_identifier — серийный номер БС.
10
+ """
11
+
12
+ device_network_mac: int
13
+ bs_id: UUID4
14
+ device_id: UUID4
15
+ bs_identifier: str
@@ -0,0 +1,22 @@
1
+ from datetime import datetime
2
+ from typing import List, NamedTuple
3
+
4
+ from pydantic import UUID4
5
+ from ul_api_utils.api_resource.api_response import JsonApiResponsePayload
6
+
7
+
8
+ class ApiDeviceUplinkSignalLatestResponse(JsonApiResponsePayload):
9
+ """Последний uplink-сигнал мака; bs_identifier — серийный номер БС, packet_date — время последнего пакета."""
10
+
11
+ mac: int
12
+ device_id: UUID4
13
+ bs_id: UUID4 | None = None
14
+ bs_identifier: str | None = None
15
+ rssi: int | None = None
16
+ snr: int | None = None
17
+ packet_date: datetime | None = None
18
+
19
+
20
+ class ApiDeviceUplinkSignalsListResult(NamedTuple):
21
+ items: List[ApiDeviceUplinkSignalLatestResponse]
22
+ total_count: int
@@ -1,25 +0,0 @@
1
- from typing import List, NamedTuple
2
-
3
- from pydantic import UUID4
4
- from ul_api_utils.api_resource.api_response import JsonApiResponsePayload
5
-
6
-
7
- class ApiBsDeviceLinkResponse(JsonApiResponsePayload):
8
- """Связь «мак ↔ БС» за период: элемент ответа GET /bs-device-links.
9
-
10
- Пара существует, если БС когда-либо получала пакет устройства в
11
- запрошенном окне (дистинкт по журналу device_log). bs_id — идентификатор
12
- БС Data Logger (у потребителя unified API это external_bs_id);
13
- bs_identifier — её серийный номер.
14
- """
15
-
16
- device_network_mac: int
17
- bs_id: UUID4
18
- bs_identifier: str
19
-
20
-
21
- class ApiBsDeviceLinksListResult(NamedTuple):
22
- """Результат спискового вызова: страница элементов и total_count."""
23
-
24
- items: List[ApiBsDeviceLinkResponse]
25
- total_count: int
@@ -1,29 +0,0 @@
1
- from datetime import datetime
2
- from typing import List, NamedTuple
3
-
4
- from pydantic import UUID4
5
- from ul_api_utils.api_resource.api_response import JsonApiResponsePayload
6
-
7
-
8
- class ApiDeviceUplinkSignalLatestResponse(JsonApiResponsePayload):
9
- """Последний uplink-сигнал мака: элемент ответа GET /uplink-signal-latest.
10
-
11
- bs_id — идентификатор базовой станции Data Logger (у потребителя unified
12
- API это external_bs_id, маппинг по серийнику не нужен); bs_identifier —
13
- серийный номер БС. packet_date — время последнего пакета устройства.
14
- """
15
-
16
- mac: int
17
- device_id: UUID4
18
- bs_id: UUID4 | None = None
19
- bs_identifier: str | None = None
20
- rssi: int | None = None
21
- snr: int | None = None
22
- packet_date: datetime | None = None
23
-
24
-
25
- class ApiDeviceUplinkSignalsListResult(NamedTuple):
26
- """Результат спискового вызова: страница элементов и total_count."""
27
-
28
- items: List[ApiDeviceUplinkSignalLatestResponse]
29
- total_count: int