VK Cloud logo

context

Модуль context позволяет получить информацию о правиле и теге, в котором произошло событие.

Текущий контекст можно получить через функцию context.current().

1class TagTypeEnum(Enum):
2
3    undefined = 0
4    event = 1
5    state = 2
6    node = 3
7    device = 4
8    agent = 5
9    aggregate = 6
10
11class ValueTypeEnum(Enum):
12
13    integer = 1
14    float = 2
15    boolean = 3
16    string = 4
17    location = 5
18    timestamp = 6
19
20class TagState:
21
22  received_at: int
23  timestamp: int
24  value: Any
25
26class Tag:
27    
28    id: int
29    name: str
30    full_name: str
31    type: TagTypeEnum
32    attrs: Dict[str, str]
33    children: List['Tag']
34    parent: Optional['Tag']
35    value_type: Optional[ValueTypeEnum]
36    state: Optional[TagState]
37
38    def get_child(name) -> Optional['Tag']:
39      """
40      Возвращает потомка тега по его имени или None, если такового нет
41      """
42
43class Rule:
44
45    id: int
46    name: str
47
48class Message:
49
50    type: ValueTypeEnum
51    value: Any
52    timestamp: datetime
53
54class Context:
55    
56    rule: Rule
57    msg: Message
58    tag: Tag
59    root_tag: Tag
60    
61    
62def current() -> Context:
63    pass

Пример получения текущего контекста:

1from coiiot_sdk import context
2ctx = context.current()

Через контекст можно получить доступ к тегу. Важными характеристиками тега являются свойства children и parent, с помощью которых можно перемещаться по дереву тегов. Например, можно написать правило для нахождения родителя тега:

1from coiiot_sdk import user_logs, context
2
3logger = user_logs.get_logger()
4ctx = context.current()
5
6parent = ctx.tag.parent
7logger.info(f"{parent.name}")

А таким образом можно найти дочерний тег по его имени:

1from coiiot_sdk import user_logs, context
2
3logger = user_logs.get_logger()
4ctx = context.current()
5
6tag = ctx.tag.get_child("needle")
7
8if tag is not None:
9	logger.info(f"name={tag.name} id={tag.id}")

Также всегда можно получить доступ к корневому тегу через свойство контекста root_tag.

Следующее правило находит имя корневого тега:

1from coiiot_sdk import context, user_logs
2
3logger = user_logs.get_logger()
4ctx = context.current()
5
6logger.info(ctx.root_tag.name)