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

Files changed (52) hide show
  1. simo/core/__pycache__/admin.cpython-38.pyc +0 -0
  2. simo/core/__pycache__/api.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/base_types.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
  5. simo/core/__pycache__/forms.cpython-38.pyc +0 -0
  6. simo/core/__pycache__/models.cpython-38.pyc +0 -0
  7. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  8. simo/core/admin.py +4 -2
  9. simo/core/api.py +5 -3
  10. simo/core/controllers.py +1 -0
  11. simo/core/forms.py +1 -1
  12. simo/core/migrations/0030_alter_instance_timezone.py +18 -0
  13. simo/core/migrations/__pycache__/0030_alter_instance_timezone.cpython-38.pyc +0 -0
  14. simo/core/models.py +29 -19
  15. simo/core/serializers.py +1 -1
  16. simo/core/utils/__pycache__/serialization.cpython-38.pyc +0 -0
  17. simo/core/utils/serialization.py +4 -2
  18. simo/fleet/__pycache__/admin.cpython-38.pyc +0 -0
  19. simo/fleet/__pycache__/auto_urls.cpython-38.pyc +0 -0
  20. simo/fleet/__pycache__/base_types.cpython-38.pyc +0 -0
  21. simo/fleet/__pycache__/controllers.cpython-38.pyc +0 -0
  22. simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
  23. simo/fleet/__pycache__/gateways.cpython-38.pyc +0 -0
  24. simo/fleet/__pycache__/managers.cpython-38.pyc +0 -0
  25. simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
  26. simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  27. simo/fleet/__pycache__/utils.cpython-38.pyc +0 -0
  28. simo/fleet/__pycache__/views.cpython-38.pyc +0 -0
  29. simo/fleet/admin.py +6 -6
  30. simo/fleet/auto_urls.py +4 -4
  31. simo/fleet/base_types.py +5 -0
  32. simo/fleet/controllers.py +123 -13
  33. simo/fleet/forms.py +78 -49
  34. simo/fleet/gateways.py +21 -8
  35. simo/fleet/managers.py +4 -2
  36. simo/fleet/migrations/0032_auto_20240415_0736.py +33 -0
  37. simo/fleet/migrations/0033_auto_20240415_0736.py +28 -0
  38. simo/fleet/migrations/__pycache__/0032_auto_20240415_0736.cpython-38.pyc +0 -0
  39. simo/fleet/migrations/__pycache__/0033_auto_20240415_0736.cpython-38.pyc +0 -0
  40. simo/fleet/models.py +83 -14
  41. simo/fleet/socket_consumers.py +22 -19
  42. simo/fleet/utils.py +6 -1
  43. simo/fleet/views.py +11 -10
  44. simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
  45. simo/generic/controllers.py +1 -1
  46. simo/users/__pycache__/api.cpython-38.pyc +0 -0
  47. simo/users/api.py +4 -2
  48. {simo-2.0.6.dist-info → simo-2.0.8.dist-info}/METADATA +1 -1
  49. {simo-2.0.6.dist-info → simo-2.0.8.dist-info}/RECORD +52 -44
  50. {simo-2.0.6.dist-info → simo-2.0.8.dist-info}/LICENSE.md +0 -0
  51. {simo-2.0.6.dist-info → simo-2.0.8.dist-info}/WHEEL +0 -0
  52. {simo-2.0.6.dist-info → simo-2.0.8.dist-info}/top_level.txt +0 -0
Binary file
Binary file
Binary file
Binary file
simo/core/admin.py CHANGED
@@ -322,7 +322,7 @@ class ComponentAdmin(admin.ModelAdmin):
322
322
  if request.session.get('add_comp_type'):
323
323
  try:
324
324
  controller_cls = CONTROLLERS_BY_GATEWAY.get(
325
- gateway, {}
325
+ gateway.type, {}
326
326
  )[request.session['add_comp_type']]
327
327
  except:
328
328
  request.session.pop('add_comp_type')
@@ -355,6 +355,7 @@ class ComponentAdmin(admin.ModelAdmin):
355
355
  pop_fields_from_form(ctx['form'])
356
356
  if ctx['form'].is_valid():
357
357
  if ctx['form'].controller.is_discoverable:
358
+ print("INIT DISCOVERY!!!")
358
359
  ctx['form'].controller.init_discovery(
359
360
  ctx['form'].cleaned_data
360
361
  )
@@ -393,6 +394,7 @@ class ComponentAdmin(admin.ModelAdmin):
393
394
  if ctx['form'].is_valid():
394
395
  request.session['add_comp_type'] = \
395
396
  ctx['form'].cleaned_data['controller_type']
397
+ print("Session controller type: ", request.session['add_comp_type'])
396
398
  return redirect(request.path)
397
399
 
398
400
  else:
@@ -429,7 +431,7 @@ class ComponentAdmin(admin.ModelAdmin):
429
431
  if obj:
430
432
  try:
431
433
  self.form = CONTROLLERS_BY_GATEWAY.get(
432
- obj.gateway, {}
434
+ obj.gateway.type, {}
433
435
  )[obj.controller_uid].config_form
434
436
  except KeyError:
435
437
  pass
simo/core/api.py CHANGED
@@ -62,7 +62,7 @@ class IconViewSet(viewsets.ReadOnlyModelViewSet):
62
62
  if 'q' in self.request.GET:
63
63
  queryset = search_queryset(
64
64
  queryset, self.request.GET['q'], ['slug', 'keywords']
65
- )[:10]
65
+ )[:25]
66
66
  return queryset
67
67
 
68
68
  def get_view_name(self):
@@ -592,7 +592,8 @@ class ControllerTypes(InstanceMixin, viewsets.GenericViewSet):
592
592
  data[cls.gateway_class.name].append({
593
593
  'uid': uid,
594
594
  'name': cls.name,
595
- 'is_discoverable': cls.is_discoverable
595
+ 'is_discoverable': cls.is_discoverable,
596
+ 'manual_add': cls.manual_add
596
597
  })
597
598
 
598
599
  return RESTResponse(data)
@@ -603,7 +604,6 @@ class RunningDiscoveries(InstanceMixin, viewsets.GenericViewSet):
603
604
  basename = 'discoveries'
604
605
  queryset = []
605
606
 
606
-
607
607
  def get_permissions(self):
608
608
  permissions = super().get_permissions()
609
609
  permissions.append(IsInstanceSuperuser())
@@ -612,6 +612,8 @@ class RunningDiscoveries(InstanceMixin, viewsets.GenericViewSet):
612
612
  def get_data(self, gateways):
613
613
  data = []
614
614
  for gateway in gateways:
615
+ gateway.discovery['last_check'] = time.time()
616
+ gateway.save(update_fields=['discovery'])
615
617
  data.append({
616
618
  'gateway': gateway.id,
617
619
  'start': gateway.discovery['start'],
simo/core/controllers.py CHANGED
@@ -34,6 +34,7 @@ class ControllerBase(ABC):
34
34
  default_config = {}
35
35
  default_meta = {}
36
36
  discovery_msg = None
37
+ manual_add = True # Can be added manually
37
38
 
38
39
  @property
39
40
  @abstractmethod
simo/core/forms.py CHANGED
@@ -264,7 +264,7 @@ class CompTypeSelectForm(forms.Form):
264
264
  self.fields['controller_type'].choices = [
265
265
  (cls.uid, cls.name) for cls in CONTROLLERS_BY_GATEWAY.get(
266
266
  gateway.handler.uid, {}
267
- ).values()
267
+ ).values() if cls.manual_add
268
268
  ]
269
269
 
270
270
 
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.9 on 2024-04-15 11:08
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0029_auto_20240229_1331'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='instance',
15
+ name='timezone',
16
+ field=models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Asmera', 'Africa/Asmera'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Timbuktu', 'Africa/Timbuktu'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/ComodRivadavia', 'America/Argentina/ComodRivadavia'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Atka', 'America/Atka'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Buenos_Aires', 'America/Buenos_Aires'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Catamarca', 'America/Catamarca'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Coral_Harbour', 'America/Coral_Harbour'), ('America/Cordoba', 'America/Cordoba'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Ensenada', 'America/Ensenada'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fort_Wayne', 'America/Fort_Wayne'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Indianapolis', 'America/Indianapolis'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Jujuy', 'America/Jujuy'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Knox_IN', 'America/Knox_IN'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Louisville', 'America/Louisville'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Mendoza', 'America/Mendoza'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montreal', 'America/Montreal'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Acre', 'America/Porto_Acre'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Rosario', 'America/Rosario'), ('America/Santa_Isabel', 'America/Santa_Isabel'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Shiprock', 'America/Shiprock'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Virgin', 'America/Virgin'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/South_Pole', 'Antarctica/South_Pole'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Ashkhabad', 'Asia/Ashkhabad'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Calcutta', 'Asia/Calcutta'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Chongqing', 'Asia/Chongqing'), ('Asia/Chungking', 'Asia/Chungking'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Dacca', 'Asia/Dacca'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Harbin', 'Asia/Harbin'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Istanbul', 'Asia/Istanbul'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kashgar', 'Asia/Kashgar'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Katmandu', 'Asia/Katmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macao', 'Asia/Macao'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Rangoon', 'Asia/Rangoon'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Saigon', 'Asia/Saigon'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Tel_Aviv', 'Asia/Tel_Aviv'), ('Asia/Thimbu', 'Asia/Thimbu'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ujung_Pandang', 'Asia/Ujung_Pandang'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Ulan_Bator', 'Asia/Ulan_Bator'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faeroe', 'Atlantic/Faeroe'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Jan_Mayen', 'Atlantic/Jan_Mayen'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/ACT', 'Australia/ACT'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Canberra', 'Australia/Canberra'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/LHI', 'Australia/LHI'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/NSW', 'Australia/NSW'), ('Australia/North', 'Australia/North'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Queensland', 'Australia/Queensland'), ('Australia/South', 'Australia/South'), ('Australia/Sydney', 'Australia/Sydney'), ('Australia/Tasmania', 'Australia/Tasmania'), ('Australia/Victoria', 'Australia/Victoria'), ('Australia/West', 'Australia/West'), ('Australia/Yancowinna', 'Australia/Yancowinna'), ('Brazil/Acre', 'Brazil/Acre'), ('Brazil/DeNoronha', 'Brazil/DeNoronha'), ('Brazil/East', 'Brazil/East'), ('Brazil/West', 'Brazil/West'), ('CET', 'CET'), ('CST6CDT', 'CST6CDT'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Canada/Saskatchewan', 'Canada/Saskatchewan'), ('Canada/Yukon', 'Canada/Yukon'), ('Chile/Continental', 'Chile/Continental'), ('Chile/EasterIsland', 'Chile/EasterIsland'), ('Cuba', 'Cuba'), ('EET', 'EET'), ('EST', 'EST'), ('EST5EDT', 'EST5EDT'), ('Egypt', 'Egypt'), ('Eire', 'Eire'), ('Etc/GMT', 'Etc/GMT'), ('Etc/GMT+0', 'Etc/GMT+0'), ('Etc/GMT+1', 'Etc/GMT+1'), ('Etc/GMT+10', 'Etc/GMT+10'), ('Etc/GMT+11', 'Etc/GMT+11'), ('Etc/GMT+12', 'Etc/GMT+12'), ('Etc/GMT+2', 'Etc/GMT+2'), ('Etc/GMT+3', 'Etc/GMT+3'), ('Etc/GMT+4', 'Etc/GMT+4'), ('Etc/GMT+5', 'Etc/GMT+5'), ('Etc/GMT+6', 'Etc/GMT+6'), ('Etc/GMT+7', 'Etc/GMT+7'), ('Etc/GMT+8', 'Etc/GMT+8'), ('Etc/GMT+9', 'Etc/GMT+9'), ('Etc/GMT-0', 'Etc/GMT-0'), ('Etc/GMT-1', 'Etc/GMT-1'), ('Etc/GMT-10', 'Etc/GMT-10'), ('Etc/GMT-11', 'Etc/GMT-11'), ('Etc/GMT-12', 'Etc/GMT-12'), ('Etc/GMT-13', 'Etc/GMT-13'), ('Etc/GMT-14', 'Etc/GMT-14'), ('Etc/GMT-2', 'Etc/GMT-2'), ('Etc/GMT-3', 'Etc/GMT-3'), ('Etc/GMT-4', 'Etc/GMT-4'), ('Etc/GMT-5', 'Etc/GMT-5'), ('Etc/GMT-6', 'Etc/GMT-6'), ('Etc/GMT-7', 'Etc/GMT-7'), ('Etc/GMT-8', 'Etc/GMT-8'), ('Etc/GMT-9', 'Etc/GMT-9'), ('Etc/GMT0', 'Etc/GMT0'), ('Etc/Greenwich', 'Etc/Greenwich'), ('Etc/UCT', 'Etc/UCT'), ('Etc/UTC', 'Etc/UTC'), ('Etc/Universal', 'Etc/Universal'), ('Etc/Zulu', 'Etc/Zulu'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belfast', 'Europe/Belfast'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Nicosia', 'Europe/Nicosia'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Tiraspol', 'Europe/Tiraspol'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GB', 'GB'), ('GB-Eire', 'GB-Eire'), ('GMT', 'GMT'), ('GMT+0', 'GMT+0'), ('GMT-0', 'GMT-0'), ('GMT0', 'GMT0'), ('Greenwich', 'Greenwich'), ('HST', 'HST'), ('Hongkong', 'Hongkong'), ('Iceland', 'Iceland'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Iran', 'Iran'), ('Israel', 'Israel'), ('Jamaica', 'Jamaica'), ('Japan', 'Japan'), ('Kwajalein', 'Kwajalein'), ('Libya', 'Libya'), ('MET', 'MET'), ('MST', 'MST'), ('MST7MDT', 'MST7MDT'), ('Mexico/BajaNorte', 'Mexico/BajaNorte'), ('Mexico/BajaSur', 'Mexico/BajaSur'), ('Mexico/General', 'Mexico/General'), ('NZ', 'NZ'), ('NZ-CHAT', 'NZ-CHAT'), ('Navajo', 'Navajo'), ('PRC', 'PRC'), ('PST8PDT', 'PST8PDT'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Johnston', 'Pacific/Johnston'), ('Pacific/Kanton', 'Pacific/Kanton'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Ponape', 'Pacific/Ponape'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Samoa', 'Pacific/Samoa'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Truk', 'Pacific/Truk'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('Pacific/Yap', 'Pacific/Yap'), ('Poland', 'Poland'), ('Portugal', 'Portugal'), ('ROC', 'ROC'), ('ROK', 'ROK'), ('Singapore', 'Singapore'), ('Turkey', 'Turkey'), ('UCT', 'UCT'), ('US/Alaska', 'US/Alaska'), ('US/Aleutian', 'US/Aleutian'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/East-Indiana', 'US/East-Indiana'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Indiana-Starke', 'US/Indiana-Starke'), ('US/Michigan', 'US/Michigan'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('US/Samoa', 'US/Samoa'), ('UTC', 'UTC'), ('Universal', 'Universal'), ('W-SU', 'W-SU'), ('WET', 'WET'), ('Zulu', 'Zulu')], db_index=True, max_length=50),
17
+ ),
18
+ ]
simo/core/models.py CHANGED
@@ -267,28 +267,38 @@ class Gateway(DirtyFieldsMixin, models.Model, SimoAdminMixin):
267
267
 
268
268
  def process_discovery(self, data):
269
269
  self.refresh_from_db()
270
+ if self.discovery.get('finished'):
271
+ print(
272
+ f"Gateway is not in pairing mode at the moment!"
273
+ )
274
+ return
275
+ if self.discovery['controller_uid'] != data.get('type'):
276
+ print(f"Gateway is not in pairing mode for {self.discovery['controller_uid']} "
277
+ f"but not for {data.get('type')} at the moment!")
278
+ return
279
+
270
280
  from .utils.type_constants import CONTROLLER_TYPES_MAP
271
- ControllerClass = CONTROLLER_TYPES_MAP.get(
272
- self.discovery['controller_uid']
281
+ ControllerClass = CONTROLLER_TYPES_MAP.get(data.get('type'))
282
+ if not hasattr(ControllerClass, '_process_discovery'):
283
+ print(f"{data.get('type')} controller has no _process_discovery method." )
284
+ return
285
+
286
+ result = ControllerClass._process_discovery(
287
+ started_with=self.discovery['init_data'], data=data
273
288
  )
274
- if ControllerClass and hasattr(
275
- ControllerClass, '_process_discovery'
276
- ):
277
- result = ControllerClass._process_discovery(
278
- started_with=self.discovery['init_data'], data=data
279
- )
280
- if result:
281
- if not isinstance(result, dict) and isinstance(result, Iterable):
282
- for res in result:
283
- if isinstance(res, models.Model):
284
- self.discovery['result'].append(res.pk)
285
- else:
286
- self.discovery['result'].append(res)
287
- else:
288
- if isinstance(result, models.Model):
289
- self.discovery['result'].append(result.pk)
289
+ if result:
290
+ self.refresh_from_db()
291
+ if not isinstance(result, dict) and isinstance(result, Iterable):
292
+ for res in result:
293
+ if isinstance(res, models.Model):
294
+ self.discovery['result'].append(res.pk)
290
295
  else:
291
- self.discovery['result'].append(result)
296
+ self.discovery['result'].append(res)
297
+ else:
298
+ if isinstance(result, models.Model):
299
+ self.discovery['result'].append(result.pk)
300
+ else:
301
+ self.discovery['result'].append(result)
292
302
 
293
303
  self.save(update_fields=['discovery'])
294
304
 
simo/core/serializers.py CHANGED
@@ -293,7 +293,7 @@ class ComponentSerializer(FormSerializer):
293
293
  if controller:
294
294
  self.Meta.form = controller.add_form
295
295
  else:
296
- controller = controllers_map.get(
296
+ controller = CONTROLLER_TYPES_MAP.get(
297
297
  self.instance.controller_uid
298
298
  )
299
299
  if controller:
@@ -21,14 +21,14 @@ def serialize_form_data(data):
21
21
  serialized_data[field_name] = {
22
22
  'model': 'many',
23
23
  'val': json.loads(model_serializers.serialize(
24
- 'json', val
24
+ 'json', val, fields=['pk']
25
25
  ))
26
26
  }
27
27
  else:
28
28
  serialized_data[field_name] = {
29
29
  'model': 'single',
30
30
  'val': json.loads(model_serializers.serialize(
31
- 'json', [val]
31
+ 'json', [val], fields=['pk']
32
32
  ))
33
33
  }
34
34
  else:
@@ -46,11 +46,13 @@ def deserialize_form_data(data):
46
46
  if val['model'] == 'single':
47
47
  for item in deserializer_generator:
48
48
  deserialized_data[field_name] = item.object
49
+ deserialized_data[field_name].refresh_from_db()
49
50
  break
50
51
  else:
51
52
  deserialized_data[field_name] = []
52
53
  for item in deserializer_generator:
53
54
  deserialized_data[field_name].append(item.object)
55
+ deserialized_data[field_name][-1].refresh_from_db()
54
56
  else:
55
57
  deserialized_data[field_name] = val
56
58
  return deserialized_data
Binary file
Binary file
Binary file
Binary file
simo/fleet/admin.py CHANGED
@@ -5,14 +5,14 @@ from django.template.loader import render_to_string
5
5
  from django.templatetags.static import static
6
6
  from simo.core.models import Component
7
7
  from simo.core.utils.admin import FormAction
8
- from .models import Colonel, I2CInterface, ColonelPin
9
- from .forms import ColonelAdminForm, MoveColonelForm, I2CInterfaceAdminForm
8
+ from .models import Colonel, Interface, ColonelPin
9
+ from .forms import ColonelAdminForm, MoveColonelForm, InterfaceAdminForm
10
10
 
11
11
 
12
- class I2CInterfaceInline(admin.TabularInline):
13
- model = I2CInterface
12
+ class InterfaceInline(admin.TabularInline):
13
+ model = Interface
14
14
  extra = 0
15
- form = I2CInterfaceAdminForm
15
+ form = InterfaceAdminForm
16
16
 
17
17
 
18
18
  class ColonelPinsInline(admin.TabularInline):
@@ -71,7 +71,7 @@ class ColonelAdmin(admin.ModelAdmin):
71
71
  'rebuild_occupied_pins'
72
72
  )
73
73
 
74
- inlines = I2CInterfaceInline, ColonelPinsInline
74
+ inlines = InterfaceInline, ColonelPinsInline
75
75
 
76
76
  def get_queryset(self, request):
77
77
  qs = super().get_queryset(request)
simo/fleet/auto_urls.py CHANGED
@@ -1,9 +1,8 @@
1
1
  from django.urls import path, re_path
2
- from django.views.generic import TemplateView
3
2
  from .views import (
4
3
  colonels_ping,
5
4
  PinsSelectAutocomplete,
6
- I2CInterfaceSelectAutocomplete
5
+ InterfaceSelectAutocomplete
7
6
  )
8
7
 
9
8
  urlpatterns = [
@@ -15,7 +14,8 @@ urlpatterns = [
15
14
  PinsSelectAutocomplete.as_view(), name='autocomplete-colonel-pins'
16
15
  ),
17
16
  path(
18
- 'autocomplete-colonel-i2c_interfaces',
19
- I2CInterfaceSelectAutocomplete.as_view(), name='autocomplete-colonel-i2c_interfaces'
17
+ 'autocomplete-colonel-interfaces',
18
+ InterfaceSelectAutocomplete.as_view(),
19
+ name='autocomplete-interfaces'
20
20
  )
21
21
  ]
@@ -0,0 +1,5 @@
1
+ from django.utils.translation import gettext_lazy as _
2
+
3
+ BASE_TYPES = {
4
+ 'dali': _("Dali Device"),
5
+ }
simo/fleet/controllers.py CHANGED
@@ -8,7 +8,7 @@ from simo.core.controllers import (
8
8
  )
9
9
  from simo.conf import dynamic_settings
10
10
  from simo.core.app_widgets import NumericSensorWidget
11
- from simo.core.controllers import Lock
11
+ from simo.core.controllers import Lock, ControllerBase, SingleSwitchWidget
12
12
  from simo.core.utils.helpers import heat_index
13
13
  from simo.core.utils.serialization import (
14
14
  serialize_form_data, deserialize_form_data
@@ -24,7 +24,7 @@ from .forms import (
24
24
  ColonelDHTSensorConfigForm, DS18B20SensorConfigForm,
25
25
  BME680SensorConfigForm, MPC9808SensorConfigForm,
26
26
  DualMotorValveForm, BlindsConfigForm, BurglarSmokeDetectorConfigForm,
27
- TTLockConfigForm
27
+ TTLockConfigForm, DALIDeviceConfigForm, DaliSwitchForm
28
28
  )
29
29
 
30
30
 
@@ -91,14 +91,14 @@ class BurglarSmokeDetector(BinarySensor):
91
91
  ]
92
92
 
93
93
 
94
- class AnalogSensor(FleeDeviceMixin, BasicSensorMixin, BaseNumericSensor):
95
- config_form = ColonelNumericSensorConfigForm
96
- name = "Analog sensor"
97
-
98
- def _get_occupied_pins(self):
99
- return [
100
- self.component.config['pin_no'],
101
- ]
94
+ # class AnalogSensor(FleeDeviceMixin, BasicSensorMixin, BaseNumericSensor):
95
+ # config_form = ColonelNumericSensorConfigForm
96
+ # name = "Analog sensor"
97
+ #
98
+ # def _get_occupied_pins(self):
99
+ # return [
100
+ # self.component.config['pin_no'],
101
+ # ]
102
102
 
103
103
 
104
104
  class DS18B20Sensor(FleeDeviceMixin, BasicSensorMixin, BaseNumericSensor):
@@ -112,6 +112,7 @@ class DS18B20Sensor(FleeDeviceMixin, BasicSensorMixin, BaseNumericSensor):
112
112
 
113
113
 
114
114
  class BaseClimateSensor(FleeDeviceMixin, BasicSensorMixin, BaseMultiSensor):
115
+ manual_add = False
115
116
  app_widget = NumericSensorWidget
116
117
 
117
118
  def __init__(self, *args, **kwargs):
@@ -196,7 +197,7 @@ class Switch(FleeDeviceMixin, BasicOutputMixin, BaseSwitch):
196
197
 
197
198
 
198
199
  class PWMOutput(FleeDeviceMixin, BasicOutputMixin, BaseDimmer):
199
- name = "PWM Output"
200
+ name = "Dimmer"
200
201
  config_form = ColonelPWMOutputConfigForm
201
202
 
202
203
  def _prepare_for_send(self, value):
@@ -294,6 +295,7 @@ class TTLock(FleeDeviceMixin, Lock):
294
295
  @classmethod
295
296
  def init_discovery(self, form_cleaned_data):
296
297
  from simo.core.models import Gateway
298
+ print("INIT discovery form cleaned data: ", form_cleaned_data)
297
299
  print("Serialized form: ", serialize_form_data(form_cleaned_data))
298
300
  gateway = Gateway.objects.filter(type=self.gateway_class.uid).first()
299
301
  gateway.start_discovery(
@@ -302,12 +304,12 @@ class TTLock(FleeDeviceMixin, Lock):
302
304
  )
303
305
  GatewayObjectCommand(
304
306
  gateway, form_cleaned_data['colonel'],
305
- command='discover-ttlock',
307
+ command='discover', type=self.uid
306
308
  ).publish()
307
309
 
308
310
  @classmethod
309
311
  def _process_discovery(cls, started_with, data):
310
- if data['discover-ttlock'] == 'fail':
312
+ if data['discovery-result'] == 'fail':
311
313
  if data['result'] == 0:
312
314
  return {'error': 'Internal Colonel error. See Colonel logs.'}
313
315
  if data['result'] == 1:
@@ -348,6 +350,7 @@ class TTLock(FleeDeviceMixin, Lock):
348
350
  },
349
351
  }
350
352
  new_component.save()
353
+ new_component.gateway.finish_discovery()
351
354
  GatewayObjectCommand(
352
355
  new_component.gateway, Colonel(
353
356
  id=new_component.config['colonel']
@@ -383,6 +386,14 @@ class TTLock(FleeDeviceMixin, Lock):
383
386
  command='call', method='delete_code', args=[str(code)]
384
387
  ).publish()
385
388
 
389
+ def clear_codes(self):
390
+ GatewayObjectCommand(
391
+ self.component.gateway,
392
+ Colonel(id=self.component.config['colonel']),
393
+ id=self.component.id,
394
+ command='call', method='clear_codes'
395
+ ).publish()
396
+
386
397
  def get_codes(self):
387
398
  GatewayObjectCommand(
388
399
  self.component.gateway,
@@ -408,6 +419,14 @@ class TTLock(FleeDeviceMixin, Lock):
408
419
  command='call', method='delete_fingerprint', args=[str(code)]
409
420
  ).publish()
410
421
 
422
+ def clear_fingerprints(self):
423
+ GatewayObjectCommand(
424
+ self.component.gateway,
425
+ Colonel(id=self.component.config['colonel']),
426
+ id=self.component.id,
427
+ command='call', method='clear_fingerprints'
428
+ ).publish()
429
+
411
430
  def get_fingerprints(self):
412
431
  GatewayObjectCommand(
413
432
  self.component.gateway,
@@ -417,4 +436,95 @@ class TTLock(FleeDeviceMixin, Lock):
417
436
  ).publish()
418
437
 
419
438
 
439
+ class DALIDevice(FleeDeviceMixin, ControllerBase):
440
+ gateway_class = FleetGatewayHandler
441
+ config_form = DALIDeviceConfigForm
442
+ name = "DALI Device"
443
+ discovery_msg = _("Please hook up your new DALI device to your DALI bus.")
444
+
445
+ base_type = 'dali'
446
+ default_value = False
447
+ app_widget = SingleSwitchWidget
448
+
449
+ def _validate_val(self, value, occasion=None):
450
+ pass
451
+
452
+ @classmethod
453
+ def init_discovery(self, form_cleaned_data):
454
+ from simo.core.models import Gateway
455
+ gateway = Gateway.objects.filter(type=self.gateway_class.uid).first()
456
+ gateway.start_discovery(
457
+ self.uid, serialize_form_data(form_cleaned_data),
458
+ timeout=60
459
+ )
460
+ GatewayObjectCommand(
461
+ gateway, form_cleaned_data['colonel'],
462
+ command='discover', type=self.uid,
463
+ i=form_cleaned_data['interface'].no
464
+ ).publish()
465
+
466
+ @classmethod
467
+ def _process_discovery(cls, started_with, data):
468
+ if data['discovery-result'] == 'fail':
469
+ if data['result'] == 1:
470
+ return {'error': 'DALI interface is unavailable!'}
471
+ else:
472
+ return {'error': 'Unknown error!'}
473
+
474
+ controller_cls = globals().get(data['result']['type'])
475
+
476
+ started_with = deserialize_form_data(started_with)
477
+ started_with['name'] += f" {data['result']['config']['da']}"
478
+ form = controller_cls.config_form(
479
+ controller_uid=controller_cls.uid, data=started_with
480
+ )
481
+
482
+ if form.is_valid():
483
+ new_component = form.save()
484
+ new_component.config.update(data.get('result', {}).get('config'))
485
+ new_component.meta['finalization_data'] = {
486
+ 'temp_id': data['result']['id'],
487
+ 'permanent_id': new_component.id,
488
+ 'config': {
489
+ 'type': cls.uid.split('.')[-1],
490
+ 'config': new_component.config,
491
+ },
492
+ }
493
+ new_component.save()
494
+ GatewayObjectCommand(
495
+ new_component.gateway, Colonel(
496
+ id=new_component.config['colonel']
497
+ ), command='finalize',
498
+ data=new_component.meta['finalization_data'],
499
+ ).publish()
500
+ return [new_component]
501
+
502
+ # Literally impossible, but just in case...
503
+ return {'error': 'INVALID INITIAL DISCOVERY FORM!'}
504
+
505
+
506
+ class DALIGear(DALIDevice):
507
+ manual_add = False
508
+
509
+ def _send_to_device(self, value):
510
+ GatewayObjectCommand(
511
+ self.component.gateway,
512
+ Colonel(id=self.component.config['colonel']),
513
+ set_val=value,
514
+ component_id=self.component.id,
515
+ ).publish()
516
+
517
+
518
+ class DALILamp(DALIGear, BaseSwitch):
519
+ family = 'dali'
520
+ manual_add = False
521
+ name = 'DALI Lamp'
522
+ config_form = DaliSwitchForm
523
+
524
+
525
+ class DALIDimmableLamp(DALIGear, BaseDimmer):
526
+ family = 'dali'
527
+ manual_add = False
528
+ name = 'DALI Dimmable Lamp'
529
+
420
530