Commit 0eaf1aa96e430004c5c5018daf54e299241a8831

Authored by Patrick Maeght
2 parents f4465c28 fa988689
Exists in dev

Merge branch 'dev' of https://gitlab.irap.omp.eu/epallier/pyros into dev

Dont know
devices_channel/src_device/client/client_channel_serial.py
... ... @@ -21,7 +21,7 @@ class ClientChannelSerial(ClientChannel):
21 21 buf = 1024
22 22  
23 23  
24   - def __init__(self, server_host:str="localhost", server_port:int=11110, buffer_size=1024, DEBUG=False):
  24 + def __init__(self, server_host:str="localhost", server_port:int=11110, buffer_size=1024, DEBUG:bool=False):
25 25 '''
26 26 :param server_host: server IP or hostname
27 27 :param server_port: server port
... ...
doc/PyROS software.docx deleted
No preview for this file type
doc/PyROS software.pdf deleted
No preview for this file type
doc/PyROS_software.docx 0 โ†’ 100644
No preview for this file type
doc/PyROS_software.odt 0 โ†’ 100644
No preview for this file type
doc/PyROS_software.pdf 0 โ†’ 100644
No preview for this file type
src/majordome/start_agent_majordome_from_test.py deleted
... ... @@ -1,26 +0,0 @@
1   -#!/usr/bin/env python
2   -
3   -import os
4   -import sys
5   -
6   -# DJANGO setup
7   -#sys.path.append('/PROJECTS/GFT/SOFT/PYROS_SOFT/PYROS201802')
8   -sys.path.append('..')
9   -#print("file is", __file__)
10   -mypath = os.getcwd()
11   -
12   -# Go into src/
13   -##os.chdir('..')
14   -#print("Current directory : " + str(os.getcwd()))
15   -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "src.pyros.settings")
16   -#os.environ['SECRET_KEY'] = 'abc'
17   -#os.environ['ENVIRONMENT'] = 'production'
18   -import django
19   -django.setup()
20   -
21   -# MONITORING AGENT setup
22   -agent="majordome"
23   -
24   -if agent=="majordome":
25   - from majordome.tasks import Majordome
26   - Majordome().run()
src/pyros/test_settings_NOTUSED.py deleted
... ... @@ -1,290 +0,0 @@
1   -""" OBSOLETE FILE """
2   -"""
3   -Django settings for pyros project.
4   -
5   -Generated by 'django-admin startproject' using Django 1.9.4.
6   -
7   -For more information on this file, see
8   -https://docs.djangoproject.com/en/1.9/topics/settings/
9   -
10   -For the full list of settings and their values, see
11   -https://docs.djangoproject.com/en/1.9/ref/settings/
12   -"""
13   -
14   -# Dictionary containing all the versions for the different modules
15   -# IMPORTANT : I must be updated at every commit !
16   -
17   -MODULES_VERSIONS = {
18   - "Alert Manager" : "0.2.4",
19   - "Analyzer" : "0.1.2",
20   - "Dashboard" : "0.1.1",
21   - "Majordome" : "0.1.4",
22   - "Monitoring" : "0.1.3",
23   - "Observation Manager" : "0.1.3",
24   - "Routine Manager" : "0.1.2",
25   - "Scheduler" : "0.1.2",
26   - "User Manager" : "0.1.1",
27   - "Device" : "0.1.1"
28   -}
29   -
30   -# Set MYSQL to False if you want to use SQLITE
31   -# This line MUST NOT be changed at all except from changing True/False
32   -# (or install_requirements script will become invalid)
33   -MYSQL = True
34   -
35   -# YOU MUST CHANGE THIS VALUE IN PYROSRUN.SH TOO
36   -TEST_PORT = 8001
37   -# YOU MUST CHANGE THIS VALUE IN PYROSRUN.SH TOO
38   -
39   -
40   -import os
41   -
42   -# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
43   -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
44   -
45   -
46   -# Quick-start development settings - unsuitable for production
47   -# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
48   -
49   -# SECURITY WARNING: keep the secret key used in production secret!
50   -SECRET_KEY = '0*@w)$rq4x1c2w!c#gn58*$*u$w=s8uw2zpr_c3nj*u%qlxc23'
51   -
52   -# SECURITY WARNING: don't run with debug turned on in production!
53   -DEBUG = True
54   -
55   -ALLOWED_HOSTS = ['localhost']
56   -
57   -
58   -# Application definition
59   -
60   -INSTALLED_APPS = [
61   - 'django.contrib.admin',
62   - 'django.contrib.auth',
63   - 'django.contrib.contenttypes',
64   - 'django.contrib.sessions',
65   - 'django.contrib.messages',
66   - 'django.contrib.staticfiles',
67   -
68   - # for using "./manage.py graph_models" with graphviz:
69   - # (https://projects.irap.omp.eu/projects/pyros/wiki/Project_Development#django-extensions-and-graphviz-useful-for-generating-an-image-of-all-the-models-and-their-relationships)
70   - 'django_extensions',
71   - 'test_without_migrations',
72   - 'bootstrap3',
73   - 'dashboard',
74   - 'scheduler',
75   - 'common',
76   - 'alert_manager',
77   - 'analyzer',
78   - 'majordome',
79   - 'monitoring',
80   - 'observation_manager',
81   - 'routine_manager',
82   - 'user_manager',
83   - 'devices'
84   -]
85   -
86   -MIDDLEWARE_CLASSES = [
87   - 'django.middleware.security.SecurityMiddleware',
88   - 'django.contrib.sessions.middleware.SessionMiddleware',
89   - 'django.middleware.common.CommonMiddleware',
90   - 'django.middleware.csrf.CsrfViewMiddleware',
91   - 'django.contrib.auth.middleware.AuthenticationMiddleware',
92   - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
93   - 'django.contrib.messages.middleware.MessageMiddleware',
94   - 'django.middleware.clickjacking.XFrameOptionsMiddleware',
95   -]
96   -
97   -ROOT_URLCONF = 'pyros.urls'
98   -
99   -TEMPLATES = [
100   - {
101   - 'BACKEND': 'django.template.backends.django.DjangoTemplates',
102   - 'DIRS': ['misc/templates'],
103   - 'APP_DIRS': True,
104   - 'OPTIONS': {
105   - 'context_processors': [
106   - 'django.template.context_processors.debug',
107   - 'django.template.context_processors.request',
108   - 'django.contrib.auth.context_processors.auth',
109   - 'django.contrib.messages.context_processors.messages',
110   - ],
111   - },
112   - },
113   -]
114   -
115   -WSGI_APPLICATION = 'pyros.wsgi.application'
116   -
117   -FIXTURE_DIRS = (
118   - 'misc/fixtures/',
119   -)
120   -
121   -LOGIN_URL = "/"
122   -
123   -# Database
124   -# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
125   -
126   -# EP modif
127   -
128   -CELERY_TEST = False
129   -
130   -if not CELERY_TEST:
131   - if not MYSQL:
132   - DATABASES = {
133   - 'default': {
134   - 'ENGINE': 'django.db.backends.sqlite3',
135   - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
136   - }
137   - }
138   - else:
139   - DATABASES = {
140   - 'default': {
141   - 'ENGINE': 'django.db.backends.mysql',
142   - 'NAME': 'test_pyros',
143   - 'USER': 'pyros',
144   - 'PASSWORD': 'DjangoPyros',
145   - }
146   - }
147   -else:
148   - DATABASES = {
149   - 'default': {
150   - 'ENGINE': 'django.db.backends.sqlite3',
151   - 'NAME': os.path.join(BASE_DIR, 'testdb.sqlite3'),
152   - 'TEST': {
153   - 'NAME': os.path.join(BASE_DIR, 'testdb.sqlite3'),
154   - },
155   - }
156   - }
157   -
158   -
159   -# Password validation
160   -# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
161   -
162   -AUTH_PASSWORD_VALIDATORS = [
163   - {
164   - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
165   - },
166   - {
167   - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
168   - },
169   - {
170   - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
171   - },
172   - {
173   - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
174   - },
175   -]
176   -
177   -
178   -# Internationalization
179   -# https://docs.djangoproject.com/en/1.9/topics/i18n/
180   -
181   -#LANGUAGE_CODE = 'en-us'
182   -LANGUAGE_CODE = 'fr-FR'
183   -
184   -#TIME_ZONE = 'UTC'
185   -TIME_ZONE = 'Europe/Paris'
186   -
187   -USE_I18N = True
188   -
189   -USE_L10N = True
190   -
191   -USE_TZ = True
192   -
193   -
194   -# To find the media files {{ MEDIA_URL }}
195   -MEDIA_URL = '/public/static/media/'
196   -
197   -
198   -# To find the static files in the app/static/ap/... folders
199   -STATIC_URL = '/public/static/'
200   -
201   -# To find the static files in src/static/. Any local directory can be added to this list.
202   -STATICFILES_DIRS = (
203   - os.path.join(BASE_DIR, "misc", "static"),
204   - )
205   -
206   -# Used for deployment (DEBUG = False). Need to run "python manage.py collectstatic" to fill it.
207   -STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'public', 'static')
208   -
209   -
210   -# EP added
211   -if not DEBUG:
212   - '''
213   - CACHES = {
214   - 'default': {
215   - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
216   - 'LOCATION': '127.0.0.1:11211',
217   - }
218   - }
219   - '''
220   - CACHES = {
221   - 'default': {
222   - 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
223   - 'LOCATION': '/var/tmp/django_cache',
224   - }
225   - }
226   -
227   -else:
228   - CACHES = {
229   - 'default': {
230   - 'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
231   - }
232   - }
233   -
234   -# from django.core.cache import cache
235   -# cache.clear()
236   -
237   -# CELERY CONFIG
238   -
239   -# CELERY_RESULT_BACKEND = 'rpc://'
240   -CELERY_RESULT_BACKEND = 'amqp'
241   -
242   -CELERY_ACCEPT_CONTENT = ['json']
243   -CELERY_TASK_SERIALIZER = 'json'
244   -CELERY_RESULT_SERIALIZER = 'json'
245   -
246   -CELERY_IMPORTS = (
247   - "alert_manager.tasks",
248   - "analyzer.tasks",
249   - "majordome.tasks",
250   - "monitoring.tasks",
251   - "observation_manager.tasks",
252   - "scheduler.tasks",
253   -)
254   -
255   -# This config allows only 1 process / queue. We replace it by the -c option at celery workers creation.
256   -# CELERYD_CONCURRENCY = 1
257   -
258   -''' Following config is needed for manual purge '''
259   -CELERY_ACKS_LATE = False
260   -CELERYD_PREFETCH_MULTIPLIER = 1
261   -
262   -CELERY_QUEUES = {
263   - "alert_listener_q": {"exchange": "alert_listener_q", "routing_key": "alert_listener_q"},
264   - "analysis_q": {"exchange": "analysis_q", "routing_key": "analysis_q"},
265   - "system_status_q": {"exchange": "system_status_q", "routing_key": "system_status_q"},
266   - "change_obs_conditions_q": {"exchange": "change_obs_conditions_q", "routing_key": "change_obs_conditions_q"},
267   - "monitoring_q": {"exchange": "monitoring_q", "routing_key": "monitoring_q"},
268   - "scheduling_q": {"exchange": "scheduling_q", "routing_key": "scheduling_q"},
269   - "execute_sequence_q": {"exchange": "execute_sequence_q", "routing_key": "execute_sequence_q"},
270   - "execute_plan_vis_q": {"exchange": "execute_plan_vis_q", "routing_key": "execute_plan_vis_q"},
271   - "execute_plan_nir_q": {"exchange": "execute_plan_nir_q", "routing_key": "execute_plan_nir_q"},
272   - "create_calibrations_q": {"exchange": "create_calibrations_q", "routing_key": "create_calibrations_q"},
273   -}
274   -
275   -CELERY_ROUTES = {
276   - "alert_manager.tasks.alert_listener": {"queue": "alert_listener_q"},
277   - "analyzer.tasks.analysis": {"queue": "analysis_q"},
278   - "majordome.tasks.execute_sequence": {"queue": "execute_sequence_q"},
279   - "majordome.tasks.system_pause": {"queue": "system_status_q"},
280   - "majordome.tasks.system_restart": {"queue": "system_status_q"},
281   - "majordome.tasks.change_obs_conditions": {"queue": "change_obs_conditions_q"},
282   - "monitoring.tasks.monitoring": {"queue": "monitoring_q"},
283   - "observation_manager.tasks.execute_plan_vis": {"queue": "execute_plan_vis_q"},
284   - "observation_manager.tasks.execute_plan_nir": {"queue": "execute_plan_nir_q"},
285   - "observation_manager.tasks.create_calibrations": {"queue": "create_calibrations_q"},
286   - "scheduler.tasks.scheduling": {"queue": "scheduling_q"},
287   -}
288   -
289   -''' Removes pickle warning '''
290   -CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
src/utils/celme/dates.py
... ... @@ -2,6 +2,7 @@ import datetime
2 2 import math
3 3 import doctest
4 4 import typing
  5 +from typing import Union
5 6 try:
6 7 from .durations import Duration
7 8 except:
... ... @@ -73,7 +74,7 @@ class Date:
73 74 # === internal methods
74 75 # ========================================================
75 76  
76   - def _init(self,date="") -> None:
  77 + def _init(self,date: Union[str, float] = "") -> None:
77 78 """ Initialize internal attributes.
78 79  
79 80 :param date: date is a date in any supported format (cf. help(Date))
... ... @@ -1053,7 +1054,7 @@ class Date:
1053 1054 """
1054 1055 return self + duration
1055 1056  
1056   - def __sub__(self, object_or_duration):
  1057 + def __sub__(self, object_or_duration: Union["Date", float]) -> "Date":
1057 1058 """ Subtract a duration to a date (returns an object date) or Compute the duration between two date objects.
1058 1059  
1059 1060 Inputs:
... ...
src/utils/plc/guitalens_observatory/maintenance_guide.odp
No preview for this file type
src/utils/report/doc/user_guide_module_report.odt
No preview for this file type
src/utils/report/status_json.py
... ... @@ -11,6 +11,9 @@ if (py_pwd not in py_path):
11 11 py_pwd = os.getcwd() + "/.."
12 12 if (py_pwd not in py_path):
13 13 (os.sys.path).append(py_pwd)
  14 +py_pwd = os.getcwd() + "/../.."
  15 +if (py_pwd not in py_path):
  16 + (os.sys.path).append(py_pwd)
14 17  
15 18 import utils.celme as celme
16 19  
... ... @@ -25,16 +28,16 @@ class Status_json:
25 28  
26 29 Example a a very wimple Json file report contents:
27 30 {
28   - "frame_model": "1.1",
29   - "name_creator": "PLC",
30   - "version_creator": "20180909",
  31 + "frame_model": "1.2",
  32 + "producer_name": "PLC",
  33 + "producer_version": "20180909",
31 34 "entities": [
32 35 {
33 36 "entity_name": "PLC_STATUS",
34   - "from": "Raspberry",
  37 + "origin": "Raspberry",
35 38 "version_firmware": "20180924A",
36 39 "site": "MyObservatory",
37   - "date": "2018-09-25T22:24:16.387",
  40 + "date": "2018-11-29T15:07:20.999",
38 41 "devices": [
39 42 {
40 43 "device_name": "DHT22",
... ... @@ -44,10 +47,10 @@ Example a a very wimple Json file report contents:
44 47 "device_values": [
45 48 {
46 49 "name": "OutsideTemperature",
47   - "type": "float",
  50 + "data_type": "float",
48 51 "value": "22",
49 52 "unit": "degC",
50   - "monitoring_name": "temperature",
  53 + "monitoring_name": "Temperature_outside",
51 54 "comment": "Temperature"
52 55 }
53 56 ]
... ... @@ -56,7 +59,7 @@ Example a a very wimple Json file report contents:
56 59 }
57 60 ]
58 61 }
59   -
  62 +
60 63 A value is stored in a UFKI (Unique Four Key Identifier):
61 64 UFKI = entity_name device_name serial_number name
62 65  
... ... @@ -238,16 +241,16 @@ https://github.com/hjson/hjson-py
238 241 # To create a Status
239 242 ####################################################################
240 243  
241   - def _status_new(self, name_creator, version_creator):
242   - status_header = {'frame_model':'1.1', 'name_creator':name_creator, 'version_creator':version_creator, 'entities':[]}
  244 + def _status_new(self, producer_name, producer_version):
  245 + status_header = {'frame_model':'1.2', 'producer_name':producer_name, 'producer_version':producer_version, 'entities':[]}
243 246 #self._status = { 'statuses':[] }
244 247 #self._status['statuses'].append(status_header)
245 248 self._status = status_header
246 249  
247   - def _status_new_entity(self, entity_name, thefrom, version_firmware, site, date=""):
  250 + def _status_new_entity(self, entity_name, theorigin, version_firmware, site, date=""):
248 251 if date=="":
249 252 date = (celme.Date("now")).iso()
250   - entity= {'entity_name':entity_name, 'from':thefrom, 'version_firmware':version_firmware, 'site':site, 'date':date, 'devices':[]}
  253 + entity= {'entity_name':entity_name, 'origin':theorigin, 'version_firmware':version_firmware, 'site':site, 'date':date, 'devices':[]}
251 254 #self._status['statuses'][0]['entities'].append(entity);
252 255 self._status['entities'].append(entity);
253 256  
... ... @@ -260,7 +263,7 @@ https://github.com/hjson/hjson-py
260 263 #self._status['statuses'][0]['entities'][indicee]['devices'].append(device)
261 264 self._status['entities'][indicee]['devices'].append(device)
262 265  
263   - def _status_entity_device_new_value(self, entity_name, device_name, serial_number, name, thetype, value, unit="", monitoring_name="", comment=""):
  266 + def _status_entity_device_new_value(self, entity_name, device_name, serial_number, name, data_type, value, unit="", monitoring_name="", comment=""):
264 267 entities = self._get_entity_names()
265 268 indicee = self._get_indice_from_entities(entities,entity_name)
266 269 if indicee == -1:
... ... @@ -270,7 +273,7 @@ https://github.com/hjson/hjson-py
270 273 indiced = self._get_indice_from_devices(devices, device_name, serial_number)
271 274 if indiced == -1:
272 275 return ""
273   - dico = {'name':name, 'type':thetype, 'value':value, 'unit':unit, 'monitoring_name':monitoring_name, 'comment':comment}
  276 + dico = {'name':name, 'data_type':data_type, 'value':value, 'unit':unit, 'monitoring_name':monitoring_name, 'comment':comment}
274 277 #self._status['statuses'][0]['entities'][indicee]['devices'][indiced]['device_values'].append(dico)
275 278 self._status['entities'][indicee]['devices'][indiced]['device_values'].append(dico)
276 279  
... ... @@ -278,7 +281,7 @@ https://github.com/hjson/hjson-py
278 281 # === status_json methods
279 282 # ========================================================
280 283  
281   - def new_status(self, name_creator, version_creator):
  284 + def new_status(self, producer_name, producer_version):
282 285 """ Initialize a new status
283 286  
284 287 Inputs:
... ... @@ -295,9 +298,9 @@ https://github.com/hjson/hjson-py
295 298 Method append_entity
296 299 """
297 300 self._init()
298   - self._status_new(name_creator, version_creator)
  301 + self._status_new(producer_name, producer_version)
299 302  
300   - def append_entity(self, entity_name, thefrom, version_firmware, site, date=""):
  303 + def append_entity(self, entity_name, theorigin, version_firmware, site, date=""):
301 304 """ Append a new entity to a creator
302 305  
303 306 Inputs:
... ... @@ -314,7 +317,7 @@ https://github.com/hjson/hjson-py
314 317 ---------------
315 318 Methods append_device, get_entities
316 319 """
317   - self._status_new_entity(entity_name, thefrom, version_firmware, site, date)
  320 + self._status_new_entity(entity_name, theorigin, version_firmware, site, date)
318 321 self._entity_name = entity_name
319 322  
320 323 def append_device(self, device_name, device_type, serial_number, error_code):
... ... @@ -340,7 +343,7 @@ https://github.com/hjson/hjson-py
340 343 self._device_name = device_name
341 344 self._serial_number = serial_number
342 345  
343   - def append_value(self, name, thetype, value, unit="", monitoring_name="", comment=""):
  346 + def append_value(self, name, data_type, value, unit="", monitoring_name="", comment=""):
344 347 """ Append a new value to a device
345 348  
346 349 Inputs:
... ... @@ -362,7 +365,7 @@ https://github.com/hjson/hjson-py
362 365 entity_name = self._entity_name
363 366 device_name = self._device_name
364 367 serial_number = self._serial_number
365   - self._status_entity_device_new_value(entity_name, device_name, serial_number, name, thetype, value, unit, monitoring_name, comment)
  368 + self._status_entity_device_new_value(entity_name, device_name, serial_number, name, data_type, value, unit, monitoring_name, comment)
366 369  
367 370 def load_json(self, full_filename):
368 371 """ Load a Json file as an object
... ... @@ -483,7 +486,7 @@ https://github.com/hjson/hjson-py
483 486 res.append(re)
484 487 return res
485 488  
486   - def get_values(self, only_device_name="", only_serial_number="", getvalue=False):
  489 + def get_ufkis(self, only_device_name="", only_serial_number="", getvalue=False):
487 490 """ Get the current values
488 491  
489 492 Inputs:
... ... @@ -494,6 +497,7 @@ https://github.com/hjson/hjson-py
494 497 ------
495 498 >>> report = report.Status_json()
496 499 >>> print("{}",format(report.get_devices()))
  500 + >>> print("{}",format(report.get_ufkis("","",True))
497 501  
498 502 Related topics:
499 503 ---------------
... ... @@ -521,6 +525,16 @@ https://github.com/hjson/hjson-py
521 525 res.append(re)
522 526 return res
523 527  
  528 + def get_sensors(self, only_device_name="", only_serial_number="", getvalue=False):
  529 + """ Get the current values. Alias of get_ufkis.
  530 + """
  531 + return self.get_ufkis(only_device_name, only_serial_number, getvalue);
  532 +
  533 + def get_values(self, only_device_name="", only_serial_number="", getvalue=False):
  534 + """ Get the current values. Alias of get_ufkis.
  535 + """
  536 + return self.get_ufkis(only_device_name, only_serial_number, getvalue);
  537 +
524 538  
525 539 # ========================================================
526 540 # === debug methods
... ... @@ -604,10 +618,10 @@ if __name__ == "__main__":
604 618 rep.append_device("DHT22", "meteo", "1", "0")
605 619 rep.append_value( "OutsideTemperature", "float","22","degC","Temperature_outside","Temperature")
606 620 # --- List the UFKIs
607   - ufiks = rep.get_values("","",False)
  621 + ufkis = rep.get_ufkis("","",False)
608 622 print(" List of all UFKIs:")
609   - for ufik in ufiks:
610   - print(" UFKI = {}".format(ufik))
  623 + for ufki in ufkis:
  624 + print(" UFKI = {}".format(ufki))
611 625 # --- save the Json file
612 626 rep.save_json("plc_verysimple.json")
613 627  
... ... @@ -646,12 +660,10 @@ if __name__ == "__main__":
646 660 rep.append_value( "SkyTemperature", "float","-15.67","degC","Temperature_sky","Temperature of the sky")
647 661 rep.append_value( "CanTemperature", "float","22.47","degC","","Temperature of the TO can")
648 662 # --- List the UFKIs
649   - ufiks = rep.get_values("","",False)
  663 + ufkis = rep.get_ufkis("","",False)
650 664 print(" List of all UFKIs:")
651   - for ufik in ufiks:
652   - print(" UFKI = {}".format(ufik))
653   - # --- read the value of one UFKI
654   -
  665 + for ufki in ufkis:
  666 + print(" UFKI = {}".format(ufki))
655 667 # --- save the Json file
656 668 rep.save_json("plc_guitalens.json")
657 669  
... ... @@ -667,6 +679,6 @@ if __name__ == "__main__":
667 679 res = rep.get_devices()
668 680 print(" devices = {}".format(res))
669 681 print(" List of all UFKIs:")
670   - ufiks = rep.get_values("","",False)
671   - for ufik in ufiks:
672   - print(" UFKI = {}".format(ufik))
  682 + ufkis = rep.get_ufkis("","",True)
  683 + for ufki in ufkis:
  684 + print(" UFKI = {}".format(ufki))
... ...