variables
Модуль variables
работает с переменными в рамках текущего тенанта (client_id)
.
Он определяет следующие функции и классы ошибок:
1class BadParamsError(Exception): 2 pass 3 4class VariableNotFoundError(Exception): 5 pass 6 7class UnknownError(Exception): 8 pass 9 10 11def get(name: str) -> Variable: 12 pass 13 14def create(name: str, value: Any, value_type: Types, timestamp: datetime, ttl: int) -> Variable: 15 pass 16 17def set(name: str, value: Any, value_type: Types, create: bool, force: bool, timestamp: datetime, ttl: int) -> Variable: 18 pass 19 20def increment(name: str, delta: Any, value_type: Types, ttl=None, default_value=0, create=False) -> Variable: 21 pass 22 23def decrement(name: str, delta: Any, value_type: Types, ttl=None, default_value=0, create=False) -> Variable: 24 pass 25 26def delete(name: str): 27 pass 28 29def exists(name: str) -> bool: 30 pass
Доступ к переменной в рамках тенанта осуществляется по уникальному имени, которое может содержать только английские буквы и цифры, а также символы _ и -.
1class Variable: 2 name: str 3 type: str 4 value: Any 5 timestamp: int 6 expires_at: int 7 8 def set(self, value: Any, timestamp: datetime, ttl=None, create=False, force=False) -> 'Variable': 9 pass 10 11 def increment(self, delta: Any, ttl=None, default_value=0, create=False) -> 'Variable': 12 pass 13 14 def decrement(self, delta: Any, ttl=None, default_value=0, create=False) -> 'Variable': 15 pass 16 17 def delete(self): 18 pass 19 20 def exists(self) -> bool: 21 pass
Переменная содержит следующие поля:
- name — уникальное имя;
- type — тип значения переменной;
- value — значение переменной (не может быть null);
- timestamp — временная метка последнего изменения;
- expires_at — временная метка до которой будет существовать переменная, по умолчанию переменная будет жить 30 дней с момента последнего обновления.
Переменная может иметь следующие типы значений:
- integer;
- float;
- string;
- boolean;
- timestamp — временная отметка с точностью до микросекунд;
- location — объект с ключами
lat
иlng
.
Типы значений:
1class Types(str, Enum): 2 Integer = "integer" 3 Float = "float" 4 Timestamp = "timestamp" 5 String = "string" 6 Boolean = "boolean" 7 Location = "location" 8 9class Location(NamedTuple): 10 lat: float 11 lng: float
Значение переменной может содержать только значение указанного типа.
Переменная может быть создана методом create
модуля variables
:
1def create(name: str, value: Any, value_type: Types, timestamp: datetime, ttl: int) -> 'Variable': 2 pass 3 4 5ttl - время жизни переменной в хранилище в микросекундах 6Пример создания переменных: 7 8from datetime import datetime 9from coiiot_sdk import variables, user_logs 10 11ts=datetime.now() 12 13logger = user_logs.get_logger() 14 15# ttl=3600000000 - время жизни переменной 1 час 16create_int = variables.create(name='create_int', value=123, value_type=variables.Types.Integer, timestamp=ts, ttl=3600000000) 17logger.info(f'{create_int.value}') 18 19create_float = variables.create(name='create_float', value=123.45, value_type=variables.Types.Float, timestamp=ts, ttl=3600000000) 20logger.info(f'{create_float.value}') 21 22create_bool = variables.create(name='create_bool', value=True, value_type=variables.Types.Boolean, timestamp=ts, ttl=3600000000) 23logger.info(f'{create_bool.value}') 24 25create_string = variables.create(name='create_string', value="true", value_type=variables.Types.String, timestamp=ts, ttl=3600000000) 26logger.info(f'{create_string.value}') 27 28create_location = variables.create(name='create_location', value=variables.Location(48.89364, 2.33739), value_type=variables.Types.Location, timestamp=ts, ttl=3600000000) 29logger.info(f'{create_location.value}') 30logger.info(f'{create_location.value["lat"]} {create_location.value["lng"]}') 31 32create_timestamp = variables.create(name='create_timestamp', value=1234567890000000, value_type=variables.Types.Timestamp, timestamp=ts, ttl=3600000000) 33logger.info(f'{create_timestamp.value}')
Возвращается новое значение переменной.
Получить переменную из хранилища можно методом get
модуля variables
:
1def get(name: str) -> Variable: 2 pass
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4ts=datetime.now() 5 6logger = user_logs.get_logger() 7 8create_int = variables.create(name='create_int', value=123, value_type=variables.Types.Integer, timestamp=ts, ttl=3600000000) 9 10v1 = variables.get("create_int") 11if v1 is not None: 12 logger.info(f'{v1.name}') 13 logger.info(f'{v1.type}') 14 logger.info(f'{v1.value}') 15 logger.info(f'{v1.timestamp}') 16 logger.info(f'{v1.expires_at}')
Модифицировать переменную можно методом set
модуля variables
:
1def set(name: str, value: Any, value_type: Types, create: bool, force: bool, timestamp: datetime, ttl: int) -> 'Variable': 2 pass
Также доступна модификация переменной через метод set
объекта переменной Variable
:
1class Variable: 2 ... 3 def set(self, value: Any, timestamp: datetime, ttl=None, create=False, force=False) -> 'Variable': 4 pass
В обоих вариантах возвращается новое значение переменной.
При модификации значения переменной должна передаваться временная отметка операции. Эта отметка будет использоваться для разрешения конфликтных ситуаций при конкурентном обновлении значения. В общем случае если операция содержит более старую метку, чем текущее значение переменной, то модификации переменной не произойдет.
Доступные флаги:
force
- еслиtrue
, установить новое значение переменной игнорируя временную метку текущего значения;create
- еслиtrue
, атомарно создать переменную (если не существует);value_type
- если переменная создается, то этим флагом можно задать тип значения для этой переменной.
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4logger = user_logs.get_logger() 5 6create_int_2 = variables.create(name='create_int_2', value=12345, value_type=variables.Types.Integer) 7logger.info(f'{create_int_2.value}') 8 9set_int_2 = variables.set(name='create_int_2', value=1234567, value_type=variables.Types.Integer) 10logger.info(f'{set_int_2.value}') 11 12create_int = create_int.set(2, timestamp=datetime.now()) 13logger.info(f'{create_int.value}') 14 15v2 = variables.set(name="my-cool-var2", value=21.3, force=True, create=True, value_type=variables.Types.Float) 16logger.info(f'{v2.value}')
Инкрементировать значение переменной можно методом increment
модуля variables
:
1def increment(name: str, delta: Any, value_type: Types, ttl=None, default_value=0, create=False) -> 'Variable': 2 pass
Также доступна инкрементация значения переменной через метод increment
объекта переменной Variable
:
1class Variable: 2 ... 3 def increment(self, delta: Any, ttl=None, default_value=0, create=False) -> 'Variable': 4 pass
В обоих вариантах возвращается новое значение переменной.
increment
— атомарная операция value += delta над числовыми типами данных (integer, float, timestamp), временная метка не передается.
Доступные флаги:
create
- еслиtrue
, создать переменную (если не существует);value_type
- если переменная создается, то этим флагом можно задать тип значения для этой переменной;default_value
- если переменная создается, то этим флагом можно задать начальное значение переменной перед применением операции (по умолчанию 0).
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4logger = user_logs.get_logger() 5 6v2 = variables.set(name="my-cool-var2", value=21.3, force=True, create=True, value_type=variables.Types.Float) 7logger.info(f'{v2.value}') 8 9v2 = v2.increment(100) 10logger.info(f'{v2.value}') 11 12v3 = variables.increment(name="my-cool-var3", delta=7.01, default_value=14.02, create=True, value_type=variables.Types.Float) 13logger.info(f'{v3.value}')
Декрементировать значение переменной можно методом decrement
модуля variables
:
1def decrement(name: str, delta: Any, value_type: Types, ttl=None, default_value=0, create=False) -> 'Variable': 2 pass
Также доступна декрементация значения переменной через метод decrement
объекта переменной Variable
:
1class Variable: 2 ... 3 def decrement(self, delta: Any, ttl=None, default_value=0, create=False) -> 'Variable': 4 pass
В обоих вариантах возвращается новое значение переменной.
decrement
- атомарная операция value -= delta над числовыми типами данных (integer, float, timestamp), временная метка не передается.
Доступные флаги:
create
- еслиtrue
, то создать переменную (если не существует);value_type
- если переменная создается, то этим флагом можно задать тип значения для этой переменной;default_value
- если переменная создается, то этим флагом можно задать начальное значение переменной перед применением операции (по умолчанию 0).
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4logger = user_logs.get_logger() 5 6v2 = variables.set(name="my-cool-var2", value=21.3, force=True, create=True, value_type=variables.Types.Float) 7logger.info(f'{v2.value}') 8 9v2 = v2.decrement(50) 10logger.info(f'{v2.value}') 11 12v3 = variables.decrement(name="my-cool-var3", delta=8.95, default_value=21.3, create=True, value_type=variables.Types.Float) 13logger.info(f'{v3.value}')
Проверить удаление переменной из хранилища можно с помощью метода:
1def delete(name: str): 2 pass
Также доступно удаление переменной через метод delete
объекта переменной Variable
:
1class Variable: 2 ... 3 def delete(self): 4 pass
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4logger = user_logs.get_logger() 5 6v2 = variables.set(name="my-cool-var2", value=123.45, force=True, create=True, value_type=variables.Types.Float) 7logger.info(f'{v2.value}') 8 9v3 = variables.decrement(name="my-cool-var3", delta=8.95, default_value=21.3, create=True, value_type=variables.Types.Float) 10logger.info(f'{v3.value}') 11 12if v2.exists(): 13 v2.delete() 14 15exists = v2.exists() 16logger.info(f'{exists}') 17 18if variables.exists(name="my-cool-var3"): 19 variables.delete(name="my-cool-var3")
Проверить наличие переменной в хранилище можно с помощью метода:
1def exists(name: str) -> bool: 2 pass
Также доступна проверка наличия переменной через метод exists
объекта переменной Variable
:
1class Variable: 2 ... 3 def exists(self) -> bool: 4 pass
В обоих вариантах возвращается значение типа bool
.
Пример:
1from datetime import datetime 2from coiiot_sdk import variables, user_logs 3 4logger = user_logs.get_logger() 5 6v2 = variables.set(name="my-cool-var2", value=123.45, force=True, create=True, value_type=variables.Types.Float) 7logger.info(f'{v2.value}') 8 9v3 = variables.decrement(name="my-cool-var3", delta=8.95, default_value=21.3, create=True, value_type=variables.Types.Float) 10logger.info(f'{v3.value}') 11 12if v2.exists(): 13 v2.delete() 14 15exists = v2.exists() 16logger.info(f'{exists}') 17 18if variables.exists(name="my-cool-var3"): 19 variables.delete(name="my-cool-var3") 20 21exists = variables.exists(name="my-cool-var3") 22logger.info(f'{exists}')