simo 2.8.4__py3-none-any.whl → 2.8.5__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.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

Binary file
simo/backups/tasks.py CHANGED
@@ -315,7 +315,7 @@ def perform_backup():
315
315
 
316
316
  if other_month_folders:
317
317
  # delete old backups to free up at least 20G of space
318
- while shutil.disk_usage('/media/backup').free < 20 * 1024 * 1024 * 1024:
318
+ while shutil.disk_usage(sd_mountpoint).free < 20 * 1024 * 1024 * 1024:
319
319
  remove_folder = other_month_folders.pop()[0]
320
320
  print(f"REMOVE: {remove_folder}")
321
321
  shutil.rmtree(remove_folder)
@@ -44,6 +44,7 @@ autostart=true
44
44
  autorestart=true
45
45
  stopwaitsecs=15
46
46
  killasgroup=true
47
+ environment=PYTHONUNBUFFERED=1
47
48
 
48
49
 
49
50
  [program:simo-gateways]
simo/core/models.py CHANGED
@@ -14,6 +14,7 @@ from django.conf import settings
14
14
  from django.core.files.storage import FileSystemStorage
15
15
  from timezone_utils.choices import ALL_TIMEZONES_CHOICES
16
16
  from location_field.models.plain import PlainLocationField
17
+ from actstream import action # do not delete from here!
17
18
  from model_utils import FieldTracker
18
19
  from dirtyfields import DirtyFieldsMixin
19
20
  from simo.core.utils.mixins import SimoAdminMixin
@@ -2,7 +2,7 @@
2
2
  <h3>Value:</h3>
3
3
  <ul style="margin-left: 1.5em;">
4
4
  {% for history_item in value_history %}
5
- <li>[{{ history_item.user }}] {{ history_item.date }} - <strong>{{ history_item.value }}</strong></li>
5
+ <li>[{{ history_item.user }}] {{ history_item.date|date:"Y-m-d H:i:s" }} - <strong>{{ history_item.value }}</strong></li>
6
6
  {% endfor %}
7
7
  </ul>
8
8
  {% endif %}
@@ -12,7 +12,7 @@
12
12
  <h3>Security:</h3>
13
13
  <ul style="margin-left: 1.5em;">
14
14
  {% for history_item in arm_status_history %}
15
- <li>[{{ history_item.user }}] {{ history_item.date }} - <strong>{{ history_item.value }}</strong></li>
15
+ <li>[{{ history_item.user }}] {{ history_item.date|date:"Y-m-d H:i:s" }} - <strong>{{ history_item.value }}</strong></li>
16
16
  {% endfor %}
17
17
  </ul>
18
18
  {% endif %}
simo/fleet/admin.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from threading import Timer
2
+ from actstream.models import actor_stream
2
3
  from django.contrib import admin
3
4
  from django.utils.safestring import mark_safe
4
5
  from django.template.loader import render_to_string
@@ -60,10 +61,8 @@ class ColonelAdmin(admin.ModelAdmin):
60
61
  readonly_fields = (
61
62
  'type', 'uid', 'connected', 'last_seen',
62
63
  'firmware_version', 'newer_firmware_available',
64
+ 'history',
63
65
  )
64
- fields = (
65
- 'name', 'instance', 'enabled', 'firmware_auto_update'
66
- ) + readonly_fields + ('pwm_frequency', 'logs_stream', 'log', )
67
66
 
68
67
  actions = (
69
68
  'check_for_upgrade', 'update_firmware', 'update_config', 'restart',
@@ -73,6 +72,19 @@ class ColonelAdmin(admin.ModelAdmin):
73
72
 
74
73
  inlines = InterfaceInline, ColonelPinsInline
75
74
 
75
+ fieldsets = (
76
+ ("", {'fields': (
77
+ 'name', 'instance', 'enabled', 'firmware_auto_update',
78
+ 'type', 'uid', 'connected', 'last_seen',
79
+ 'firmware_version', 'newer_firmware_available',
80
+ 'pwm_frequency', 'logs_stream', 'log'
81
+ )}),
82
+ ("History", {
83
+ 'fields': ('history',),
84
+ 'classes': ('collapse',),
85
+ }),
86
+ )
87
+
76
88
  def get_queryset(self, request):
77
89
  qs = super().get_queryset(request)
78
90
  return qs.filter(instance=get_current_instance())
@@ -165,6 +177,15 @@ class ColonelAdmin(admin.ModelAdmin):
165
177
  return mark_safe('<img src="%s" alt="True">' % static('admin/img/icon-yes.svg'))
166
178
  return mark_safe('<img src="%s" alt="False">' % static('admin/img/icon-no.svg'))
167
179
 
180
+ def history(self, obj):
181
+ if not obj:
182
+ return ''
183
+ actions = actor_stream(obj)[:100]
184
+ if not len(actions):
185
+ return ''
186
+ return render_to_string(
187
+ 'admin/colonel_history.html', {'actions': actor_stream(obj)[:100]}
188
+ )
168
189
 
169
190
  @admin.register(Interface)
170
191
  class InterfaceAdmin(admin.ModelAdmin):
simo/fleet/apps.py ADDED
@@ -0,0 +1,10 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class SIMOFleetAppConfig(AppConfig):
5
+ name = 'simo.fleet'
6
+
7
+ def ready(self):
8
+ from actstream import registry
9
+ from simo.fleet.models import Colonel
10
+ registry.register(Colonel)
simo/fleet/models.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import requests
2
2
  import time
3
+ from actstream import action
3
4
  from django.core.exceptions import ValidationError
4
5
  from django.db import transaction
5
6
  from django.db import models
@@ -281,6 +282,17 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
281
282
  Interface.objects.create(colonel=instance, no=1)
282
283
  Interface.objects.create(colonel=instance, no=2)
283
284
 
285
+ if 'socket_connected' in instance.get_dirty_fields():
286
+ if instance.socket_connected:
287
+ verb = 'connected'
288
+ else:
289
+ verb = 'disconnected'
290
+ action.send(
291
+ instance, target=instance, verb=verb,
292
+ instance_id=instance.instance.id,
293
+ action_type='colonel_status', value=verb
294
+ )
295
+
284
296
 
285
297
  @receiver(post_save, sender=Component)
286
298
  def post_component_save(sender, instance, created, *args, **kwargs):
@@ -472,7 +484,6 @@ def post_interface_save(sender, instance, created, *args, **kwargs):
472
484
 
473
485
 
474
486
 
475
-
476
487
  @receiver(post_delete, sender=Interface)
477
488
  def post_interface_delete(sender, instance, *args, **kwargs):
478
489
  with transaction.atomic():
@@ -5,6 +5,7 @@ import pytz
5
5
  import traceback
6
6
  import sys
7
7
  import zlib
8
+ import time
8
9
  from django.db import transaction
9
10
  from logging.handlers import RotatingFileHandler
10
11
  from django.utils import timezone
@@ -27,10 +28,15 @@ from .controllers import TTLock
27
28
 
28
29
  @capture_socket_errors
29
30
  class FleetConsumer(AsyncWebsocketConsumer):
30
- colonel = None
31
- colonel_logger = None
32
- connected = False
33
- mqtt_client = None
31
+
32
+
33
+ def __init__(self, *args, **kwargs):
34
+ super().__init__(*args, **kwargs)
35
+ self.colonel = None
36
+ self.colonel_logger = None
37
+ self.connected = False
38
+ self.mqtt_client = None
39
+ self.last_seen = 0
34
40
 
35
41
 
36
42
  async def disconnect(self, code):
@@ -189,10 +195,26 @@ class FleetConsumer(AsyncWebsocketConsumer):
189
195
  self.colonel.minor_upgrade_available
190
196
  )
191
197
 
192
- await asyncio.sleep(10)
198
+ await asyncio.sleep(2)
199
+
193
200
  # Default pinging system sometimes get's lost somewhere,
194
- # therefore we use our own to ensure connection
201
+ # therefore we use our own to ensure connection and understand if
202
+ # colonel is connected or not
203
+
195
204
  await self.send_data({'command': 'ping'})
205
+ ping_start = time.time()
206
+ await asyncio.sleep(0.1)
207
+
208
+ while ping_start > self.last_seen:
209
+ if time.time() - ping_start > 3:
210
+ def disconnect_socket():
211
+ self.colonel.socket_connected = False
212
+ self.colonel.save(update_fields=['socket_connected'])
213
+ await sync_to_async(disconnect_socket, thread_sensitive=True)()
214
+ break
215
+ await asyncio.sleep(0.1)
216
+
217
+
196
218
 
197
219
  async def firmware_update(self, to_version):
198
220
  print("Firmware update: ", str(self.colonel))
@@ -366,8 +388,9 @@ class FleetConsumer(AsyncWebsocketConsumer):
366
388
  drop_current_instance()
367
389
  try:
368
390
  if text_data:
369
- print(f"{self.colonel}: {text_data}")
370
391
  data = json.loads(text_data)
392
+ if 'ping' not in data:
393
+ print(f"{self.colonel}: {text_data}")
371
394
  if 'get_config' in data:
372
395
  config = await self.get_config_data()
373
396
  print("Send config: ", config)
@@ -453,6 +476,7 @@ class FleetConsumer(AsyncWebsocketConsumer):
453
476
 
454
477
 
455
478
  async def log_colonel_connected(self):
479
+ self.last_seen = time.time()
456
480
 
457
481
  def save_last_seen():
458
482
  self.colonel.socket_connected = True
simo/fleet/tasks.py CHANGED
@@ -5,6 +5,18 @@ from simo.core.middleware import drop_current_instance
5
5
  from celeryc import celery_app
6
6
 
7
7
 
8
+ @celery_app.task
9
+ def check_colonels_connected():
10
+ from .models import Colonel
11
+ drop_current_instance()
12
+ for lost_colonel in Colonel.objects.filter(
13
+ socket_connected=True,
14
+ last_seen__lt=timezone.now() - datetime.timedelta(seconds=20)
15
+ ):
16
+ lost_colonel.socket_connected = False
17
+ lost_colonel.save()
18
+
19
+
8
20
  @celery_app.task
9
21
  def check_colonel_components_alive():
10
22
  from simo.core.models import Component
@@ -24,4 +36,5 @@ def check_colonel_components_alive():
24
36
 
25
37
  @celery_app.on_after_finalize.connect
26
38
  def setup_periodic_tasks(sender, **kwargs):
39
+ sender.add_periodic_task(10, check_colonels_connected.s())
27
40
  sender.add_periodic_task(20, check_colonel_components_alive.s())
@@ -0,0 +1,5 @@
1
+ <ul style="margin-left: 1.5em;">
2
+ {% for action in actions %}
3
+ <li>{{ action.timestamp|date:"Y-m-d H:i:s" }} - <strong>{{ action.verb }}</strong></li>
4
+ {% endfor %}
5
+ </ul>
simo/settings.py CHANGED
@@ -3,6 +3,7 @@ Django settings for SIMO.io project.
3
3
  """
4
4
  import sys
5
5
  import os
6
+ import datetime
6
7
 
7
8
  # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
8
9
  BASE_DIR = '/etc/SIMO'
@@ -288,4 +289,27 @@ ACTSTREAM_SETTINGS = {
288
289
  'USE_PREFETCH': True,
289
290
  'USE_JSONFIELD': True,
290
291
  'GFK_FETCH_DEPTH': 1,
291
- }
292
+ }
293
+
294
+
295
+ DATETIME_FORMAT = 'Y-m-d H:i:s'
296
+
297
+
298
+ class TimestampedStream:
299
+ """Adds timestamps to all the prints"""
300
+
301
+ def __init__(self, stream):
302
+ self.stream = stream
303
+
304
+ def write(self, data):
305
+ if data != '\n':
306
+ timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
307
+ self.stream.write(f'[{timestamp}] {data}')
308
+ else:
309
+ self.stream.write(data)
310
+
311
+ def flush(self):
312
+ self.stream.flush()
313
+
314
+
315
+ sys.stdout = TimestampedStream(sys.stdout)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: simo
3
- Version: 2.8.4
3
+ Version: 2.8.5
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -2,7 +2,7 @@ simo/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
2
  simo/asgi.py,sha256=L8CUVZLM32IMzWDZ4IShdDN-m69t7oxAUeHods4-xNM,822
3
3
  simo/celeryc.py,sha256=eab7_e9rw0c__DCeoUFUh_tjAGVlulxVrk75BaJf57Q,1512
4
4
  simo/conf.py,sha256=H2BhXAV8MEDVXF8AbkaLSfR4ULd-9_bS4bnhE5sE5fg,112
5
- simo/settings.py,sha256=CjHxwQvyljm0qVOCHvi6gdMweDzEqAedXTmGMJ6rE1A,7009
5
+ simo/settings.py,sha256=C04iruyTTGqrcYuZjW_EN7V8MNPWNnsde4dZiQ3tr4Y,7523
6
6
  simo/urls.py,sha256=d8g-wN0Xr2PVIV8RZl_h_PMN9KGZNIE9to2hQj1p1TU,2497
7
7
  simo/__pycache__/__init__.cpython-312.pyc,sha256=a12_Zr7kC5DXzcFxA5eMu-TiSU5xbdF5cdKq-gwc3x0,159
8
8
  simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
@@ -12,7 +12,7 @@ simo/__pycache__/celeryc.cpython-312.pyc,sha256=MQlG6VeEdCpXPpiiAwZavriWKwHbhwTM
12
12
  simo/__pycache__/celeryc.cpython-38.pyc,sha256=eSRoaKwfYlxVaxAiwqpQ2ndEcx7W-VpZtbxRFSV8UYg,1653
13
13
  simo/__pycache__/conf.cpython-312.pyc,sha256=q63YJWqaaaQLz3qXW8clENjvH1zUfY_k34_m56n5gRY,320
14
14
  simo/__pycache__/conf.cpython-38.pyc,sha256=MYP2yk3ULxiYwZsZR6tCLjKnU-z03A3avzQzIn66y3k,273
15
- simo/__pycache__/settings.cpython-312.pyc,sha256=PE2CUT2j6Uj3xB5LpEEyw8q9MQLsoZPRgcOsUDh9y8o,6688
15
+ simo/__pycache__/settings.cpython-312.pyc,sha256=lrMjm4OihDlNrull26G_TaWUEJkFbo4Po5ir5efSRU4,7886
16
16
  simo/__pycache__/settings.cpython-38.pyc,sha256=4w3ds3D9S78zbsovXsXC05PYBAafDrtsOhX14FT0YyE,6149
17
17
  simo/__pycache__/urls.cpython-312.pyc,sha256=mIg_YD7zgjmIzfWzpGpikMqanGKP2O-iuA1ixqQngnc,3689
18
18
  simo/__pycache__/urls.cpython-38.pyc,sha256=u0x6EqT8S1YfDOSPgbI8Kf-RDlveY9OV-EDXMYKAQ7w,2125
@@ -61,7 +61,7 @@ simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  simo/backups/admin.py,sha256=cEakxnQlOHvUf8LdBdekXpDAvnqPoVN8y7pnN3WK29A,2487
62
62
  simo/backups/dynamic_settings.py,sha256=Q52RLa3UQsmAhqkwR16cM6pbBnIbXqmVQ2oIUP2ZVD0,416
63
63
  simo/backups/models.py,sha256=-tgILgkqmBEuxBwoymKZN1a0UVQzmJvqWrIGYMMFDaQ,695
64
- simo/backups/tasks.py,sha256=Vz6hJGWzlfaHtXRkLMhCg8e3oH80aQtgc3YfDsRLpgg,13372
64
+ simo/backups/tasks.py,sha256=UtWMsHONhL_rBAedCk7Mirbp0sZ-glF49bnR2mdTM4U,13370
65
65
  simo/backups/__pycache__/__init__.cpython-312.pyc,sha256=wl1RXj84eHmQ_WAvVl7oahd1qa8ezF1HcwRQzho7DyU,167
66
66
  simo/backups/__pycache__/__init__.cpython-38.pyc,sha256=vzOf-JIMeZ6P85FyvTpYev3mscFosUy-SJTshcQbOHU,161
67
67
  simo/backups/__pycache__/admin.cpython-312.pyc,sha256=4rXygr4247idEgFvadmM4L7-1rRChe7zgoGYTzo2UGI,3863
@@ -108,7 +108,7 @@ simo/core/gateways.py,sha256=Y2BME6zSyeUq_e-hzEUF6gErCUCP6nFxedkLZKiLVOo,4141
108
108
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
109
109
  simo/core/managers.py,sha256=Ampwe5K7gfE6IJULNCV35V8ysmMOdS_wz7mRzfaLZUw,3014
110
110
  simo/core/middleware.py,sha256=zX6N4P_KR7gG8N2-NcR7jKtuCEhCGRh51g4EktAhP7w,3272
111
- simo/core/models.py,sha256=YjcTcBzesXwR5akdRXjM7wI2e1pYn379loBSaDWdDJM,23696
111
+ simo/core/models.py,sha256=Nw-XT0v0y5pBYlKKhzoI68HiEMMTp7fqZQZgKmeOW7Q,23752
112
112
  simo/core/permissions.py,sha256=Ef4NO7QwwDd3Z-v61R0BeCBXxTOJz9qBvzRTIB5tHwI,2943
113
113
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
114
114
  simo/core/serializers.py,sha256=adqe8oYP5f7hGFXcxa-Zmce2KOwy3hZOaWE3MaAFtpM,23157
@@ -162,7 +162,7 @@ simo/core/__pycache__/managers.cpython-312.pyc,sha256=RpeR1Z0GtSZht4_a4iDfTU_E8P
162
162
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
163
163
  simo/core/__pycache__/middleware.cpython-312.pyc,sha256=2VhHTVY-rdPNqNX0wst2ioVbHD5uMqHkY-tpujLdpH0,4195
164
164
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=SgTLFNkKxvJ62hevSAVNZHgHdG_u2p7AZBhrj-jfFPs,2649
165
- simo/core/__pycache__/models.cpython-312.pyc,sha256=CVESJOD2imhwbhZ6i0KIs3M4equBtHT-TApdqZ10uoE,31932
165
+ simo/core/__pycache__/models.cpython-312.pyc,sha256=z6RR7Rv4POCpVl5acn2VHVhLLRh59YhO1jq_JSO8CmI,31960
166
166
  simo/core/__pycache__/models.cpython-38.pyc,sha256=A4JsWsDMBaQ_U5sV5cX0c_Uox9mP5fAqn_712EjfNS4,19605
167
167
  simo/core/__pycache__/permissions.cpython-312.pyc,sha256=yqG6t9NZZtL30Hr7razjiG6JDGKiz0Qjcjxgv1C93vM,4450
168
168
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=UdtxCTXPEbe99vgZOfRz9wfKSYvUn9hSRbpIV9CJSyI,2988
@@ -253,7 +253,7 @@ simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZ
253
253
  simo/core/management/_hub_template/hub/manage.py,sha256=PNNlw3EVeIJDgkG0l-klqoxsKWfTYWG9jzRG0upmAaI,620
254
254
  simo/core/management/_hub_template/hub/nginx.conf,sha256=40hvXL42MeiqqkLURNcDQsRudv1dNFLJnvb2-Y3RCkk,2394
255
255
  simo/core/management/_hub_template/hub/settings.py,sha256=4QhvhbtLRxHvAntwqG_qeAAtpDUqKvN4jzw9u3vqff8,361
256
- simo/core/management/_hub_template/hub/supervisor.conf,sha256=-xFtt7cVyY-SCZ_6Z4yI1-1LNtd0f0EAM9zB5VbY9i8,2362
256
+ simo/core/management/_hub_template/hub/supervisor.conf,sha256=11c39qVa1V5qf6OOK2PJhqKJXi5wfMhQNwd-TdWq2yA,2393
257
257
  simo/core/management/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
258
258
  simo/core/management/_hub_template/hub/wsgi.py,sha256=Lo-huLHnMDTxSmMBOodVFMWBls9poddrV2KRzXU0xGo,280
259
259
  simo/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10308,7 +10308,7 @@ simo/core/templates/admin/action_intermediate_form.html,sha256=rOWF3UDv-SQZUfOzp
10308
10308
  simo/core/templates/admin/base.html,sha256=yACgUEp8VLmvWwlLM0ygaeorWdn6ykX-7NkXFz3iZAI,6281
10309
10309
  simo/core/templates/admin/clearable_easy_thumbnails_widget.html,sha256=Gh0z_KIEt3QC53HKJ_3QiPt9nIFCvwAx1gCny-dPHOM,704
10310
10310
  simo/core/templates/admin/component_change_list.html,sha256=N3seVjTkIRXIXKGsleB7oWUnPlMRXDIqOPqfEyq4PNE,3320
10311
- simo/core/templates/admin/component_history.html,sha256=xiACt0w7EPrdmTOsi5XO07O-8LcL_XpCu9pSynmNNpI,541
10311
+ simo/core/templates/admin/component_history.html,sha256=7vkWSDu5xugkrb79IffJ-CZts9h2EMZr9Gi4tqHBc0I,579
10312
10312
  simo/core/templates/admin/formset_widget.html,sha256=NAonHNLyicsoE4Iir3My4AlVSz4Q7-1OA19zgsIOjJA,3563
10313
10313
  simo/core/templates/admin/index.html,sha256=AJpt1FA4g6IAFQA99-3glJ88RmoWJ0YXBIz_DUt-R14,4015
10314
10314
  simo/core/templates/admin/item_name_display.html,sha256=Y3zk-rc-y8_6dC6_WrSy6tx6Z-6IZzZ5w3a1hMxlpz4,357
@@ -10404,8 +10404,9 @@ simo/core/utils/__pycache__/type_constants.cpython-38.pyc,sha256=ERC5U7T5pThjLrs
10404
10404
  simo/core/utils/__pycache__/validators.cpython-312.pyc,sha256=w8-XwptooefG-7gIIngVt1WWssIqNU3P1jPHBoYSYH4,1879
10405
10405
  simo/core/utils/__pycache__/validators.cpython-38.pyc,sha256=gjeBOjL_keMoRDjdn8v-3F3wcjPIT3Xx5KpTalo0e-Y,1247
10406
10406
  simo/fleet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10407
- simo/fleet/admin.py,sha256=3udiNaNoL37699SN-rQqjvvZ0lO2pi2zvg9SqZPp5R0,6403
10407
+ simo/fleet/admin.py,sha256=J_kiwYIGMTxnRuytl_YoM7Pxrj5LzlN9xC8E7Ag5yvQ,7006
10408
10408
  simo/fleet/api.py,sha256=rJwAYJvp0uslW7O6Q4XOpOa8hfCdy3keUD7b3UNL43E,3424
10409
+ simo/fleet/apps.py,sha256=je8mRXMcRq4lABQZlyF2G2hOCkBUicR9I2jvrLDA8eI,238
10409
10410
  simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
10410
10411
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10411
10412
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
@@ -10413,19 +10414,20 @@ simo/fleet/controllers.py,sha256=HV6onYd11YAc_f_8NFHAbv5IJZUEd1bDGTRMQtfFe-g,289
10413
10414
  simo/fleet/forms.py,sha256=VcqATlX-omZruUgUC2fJpeLNUGSR-szmf36_M3aa5dg,66850
10414
10415
  simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
10415
10416
  simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10416
- simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
10417
+ simo/fleet/models.py,sha256=lPiIurCNK--4mPFsg_QLo6GHbpYfE8Aju_G4VAKsRLM,17895
10417
10418
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10418
10419
  simo/fleet/serializers.py,sha256=PQnjp7LaEpMts-om2OPV5XOU9ut6KFWiePPDCXK0M98,2679
10419
- simo/fleet/socket_consumers.py,sha256=3Ayry0PJgP5K2V7c-4a11QFOxfM8lOSXfIVhaBB8wTM,18820
10420
- simo/fleet/tasks.py,sha256=NX_opj-rbkK9eeQMeRNwHj_ZJ0LC4rYOZovMg9_r0kA,904
10420
+ simo/fleet/socket_consumers.py,sha256=fFsnpAvItGT1tYbkAkpTxBjG5v0cT-o-fmQRM9S1wsg,19630
10421
+ simo/fleet/tasks.py,sha256=VSY0cMFIs7Ocjz0_HwRLp-yaDdBl1T8U9T-7b8Ggegc,1308
10421
10422
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10422
10423
  simo/fleet/views.py,sha256=3F8im6BsSOaK3KEuBNESE4sDbS_dWHYaOdhTR4cCLjE,5189
10423
10424
  simo/fleet/__pycache__/__init__.cpython-312.pyc,sha256=-BZyG4uq87W18Ra1pKTjSzDgiLEAcw254NqdRX-vSJo,165
10424
10425
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
10425
- simo/fleet/__pycache__/admin.cpython-312.pyc,sha256=rzG80aTmBCD-at2TNa6noEVx6vyz5R0YFOHVS-q3OgA,9351
10426
+ simo/fleet/__pycache__/admin.cpython-312.pyc,sha256=8TOuku1Atv-LyaVi4OICTc43iBFPgxCjrgjA9q6CN1s,9890
10426
10427
  simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=iweeu5AkaggBhQntP6-VF_eEodkNc6E7zKy0VjfwC2o,6652
10427
10428
  simo/fleet/__pycache__/api.cpython-312.pyc,sha256=OM7s1FqGqTC2vwOOto0GhZrObEnI58SxMcTWaPtHD4Y,5892
10428
10429
  simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rZ1mkfkaMBEXhi9sw_jTKdk2CPJhBNxoImtjQ3Rf1VY,4016
10430
+ simo/fleet/__pycache__/apps.cpython-312.pyc,sha256=S8OK4R0W9VbNfD4Nos_CybjZ3AXS8CxvRaRUJO57xQA,707
10429
10431
  simo/fleet/__pycache__/auto_urls.cpython-312.pyc,sha256=32yXKNoqMxNgYvsspUgx1A84LVQqr8LP4BRvURNCgeY,1026
10430
10432
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=jHsvfwAumiBusr91QK1-qC-nmpPEC3r2uMGG8g0fABE,769
10431
10433
  simo/fleet/__pycache__/base_types.cpython-312.pyc,sha256=cq-Pnje7FoMP608U_L_gsCfY_JMY23z87Uao-AxjNBw,304
@@ -10439,13 +10441,13 @@ simo/fleet/__pycache__/gateways.cpython-312.pyc,sha256=ZZGBAH2w9YmFvSrajZY8fUXd_
10439
10441
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=MIpXuGWitGNdsxJ99fWvMXJ6sVE96ac7iR4K4aM4Sds,5148
10440
10442
  simo/fleet/__pycache__/managers.cpython-312.pyc,sha256=sgcaERbhjilkFDCPqc8YZwSiEfRkXpufe0qDPqgLOiU,1733
10441
10443
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10442
- simo/fleet/__pycache__/models.cpython-312.pyc,sha256=lnSAUceAf0DAo2Gqs3dPjZf37MSPtqkljOXG5A5up0I,24994
10444
+ simo/fleet/__pycache__/models.cpython-312.pyc,sha256=OkCAXSrrMaxfsclJQV0yhlcBFerKV-xA7FQfR-2e7e0,25400
10443
10445
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=AXk1Q_nnHDXirHYgM3EW5pLsrR2CaPWk4EuvGCuDUpI,14131
10444
10446
  simo/fleet/__pycache__/routing.cpython-312.pyc,sha256=vafYpGAtYc2NYxBQObMX6eIZfVZflOYgzjYv0SL1jAQ,385
10445
10447
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10446
10448
  simo/fleet/__pycache__/serializers.cpython-312.pyc,sha256=reKKBMohl7vi7iJ6wjRbOBoFn7J9ny8EE9wv5spBHYM,4912
10447
10449
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=l_FzORWCM1hcSZV0AaGRO-p0CMTcEfqnLGgbn2IVvI0,3648
10448
- simo/fleet/__pycache__/socket_consumers.cpython-312.pyc,sha256=1ZEKGEL8FDeALU-BLlap9rjHZKgc_FDtLr0INSWspGo,27221
10450
+ simo/fleet/__pycache__/socket_consumers.cpython-312.pyc,sha256=r2n7h89t1HgI16UdUsaR9nrFFPgb-b2z9emn2eMdPZQ,28536
10449
10451
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=lEC1SkY_KgRY0QoBUMPjnbFwSa7qmCf-4eNQ45hAy68,14141
10450
10452
  simo/fleet/__pycache__/tasks.cpython-312.pyc,sha256=1XDir2GWxl7c17n0ZuCxOFKsLjaCqXgqVT4TcDvzhm8,1817
10451
10453
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
@@ -10588,6 +10590,7 @@ simo/fleet/migrations/__pycache__/0044_auto_20241210_0707.cpython-312.pyc,sha256
10588
10590
  simo/fleet/migrations/__pycache__/0044_auto_20241210_0707.cpython-38.pyc,sha256=M99PMBDgOdS_0KIEhlUamHWeTVCTdIHFXIvYTRX15Z8,1029
10589
10591
  simo/fleet/migrations/__pycache__/__init__.cpython-312.pyc,sha256=1rujN3qD3L0Q2MRB-gxwRKyShgUTX9NBpDGaIl42ozU,176
10590
10592
  simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
10593
+ simo/fleet/templates/admin/colonel_history.html,sha256=YfA6LDVExk1sAWhBuiCLA6vb3XcBNN7_fpJNZzGFtB0,169
10591
10594
  simo/fleet/templates/fleet/controllers_info/Button.md,sha256=GIuxqG617174NEtpPeCGVocxO4YMe7-CacgVSu_L5-E,739
10592
10595
  simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LSTY9YPFuVPIbVsYCAifcotrXJcOXl2k774_vo6nAE,770
10593
10596
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10930,9 +10933,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10930
10933
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10931
10934
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10932
10935
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10933
- simo-2.8.4.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10934
- simo-2.8.4.dist-info/METADATA,sha256=R_KaZi61ln63mwg8ywrTAVIFTD5b_EI4tj1kGJtV6wI,2008
10935
- simo-2.8.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
10936
- simo-2.8.4.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10937
- simo-2.8.4.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10938
- simo-2.8.4.dist-info/RECORD,,
10936
+ simo-2.8.5.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10937
+ simo-2.8.5.dist-info/METADATA,sha256=J6rygMMxiXfeOMVZEhetZjpGJKHF_m2obJCRJ5D7y00,2008
10938
+ simo-2.8.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
10939
+ simo-2.8.5.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10940
+ simo-2.8.5.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10941
+ simo-2.8.5.dist-info/RECORD,,
File without changes