Completed
Push — master ( a0ec22...d4a82e )
by Olivier
01:04
created

UaClient.unsubscribe_events()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
2
from opcua import ua
3
from opcua import Client
4
from opcua import Node
5
6
7
class UaClient(object):
8
    """
9
    OPC-Ua client specialized for the need of GUI client
10
    return exactly whant GUI needs, no customization possible
11
    """
12
13
    def __init__(self):
14
        self.client = None
15
        self._connected = False
16
        self._datachange_sub = None
17
        self._event_sub = None
18
        self._subs_dc = {}
19
        self._subs_ev = {}
20
21
    def connect(self, uri):
22
        self.disconnect()
23
        print("Connecting to ", uri)
24
        self.client = Client(uri)
25
        self.client.connect()
26
        self._connected = True
27
28
    def disconnect(self):
29
        if self._connected:
30
            print("Disconnecting from server")
31
            self._subs_dc = {}
32
            self._subs_ev = {}
33
            self._connected = False
34
            self._subscription = None
35
            self.client.disconnect()
36
            self.client = None
37
38
    def subscribe_datachange(self, node, handler):
39
        if not self._datachange_sub:
40
            self._datachange_sub = self.client.create_subscription(500, handler)
41
        handle = self._datachange_sub.subscribe_data_change(node)
42
        self._subs_dc[node.nodeid] = handle
43
        return handle
44
45
    def unsubscribe_datachange(self, node):
46
        self._datachange_sub.unsubscribe(self._subs_dc[node.nodeid])
47
48
    def subscribe_events(self, node, handler):
49
        if not self._event_sub:
50
            print("subscirbing with handler: ", handler, dir(handler))
51
            self._event_sub = self.client.create_subscription(500, handler)
52
        handle = self._event_sub.subscribe_events(node)
53
        self._subs_ev[node.nodeid] = handle
54
        return handle
55
56
    def unsubscribe_events(self, node):
57
        self._event_sub.unsubscribe(self._subs_ev[node.nodeid])
58
59
    def get_root_node_and_desc(self):
60
        node = self.client.get_root_node()
61
        attrs = node.get_attributes([ua.AttributeIds.DisplayName, ua.AttributeIds.BrowseName, ua.AttributeIds.NodeId, ua.AttributeIds.NodeClass])
62
        desc = ua.ReferenceDescription()
63
        desc.DisplayName = attrs[0].Value.Value
64
        desc.BrowseName = attrs[1].Value.Value
65
        desc.NodeId = attrs[2].Value.Value
66
        desc.NodeClass = attrs[3].Value.Value
67
        desc.TypeDefinition = ua.TwoByteNodeId(ua.ObjectIds.FolderType)
68
        return node, desc
69
70
    def get_node_attrs(self, node):
71
        if not isinstance(node, Node):
72
            node = self.client.get_node(node)
73
        attrs = node.get_attributes([ua.AttributeIds.DisplayName, ua.AttributeIds.BrowseName, ua.AttributeIds.NodeId])
74
        return node, [attr.Value.Value.to_string() for attr in attrs]
75
76
    def get_children(self, node):
77
        descs = node.get_children_descriptions()
78
        children = []
79
        for desc in descs:
80
            children.append((self.client.get_node(desc.NodeId), desc))
81
        return children
82
83
    def get_all_attrs(self, node):
84
        names = []
85
        vals = []
86
        for name, val in ua.AttributeIds.__dict__.items():
87
            if not name.startswith("_"):
88
                names.append(name)
89
                vals.append(val)
90
91
        attrs = node.get_attributes(vals)
92
        res = {}
93
        for idx, name in enumerate(names):
94
            if attrs[idx].StatusCode.is_good():
95
                res[name] = attrs[idx].Value
96
        return res
97
98
    def get_all_refs(self, node):
99
        return node.get_children_descriptions(refs=ua.ObjectIds.References)
100