Completed
Pull Request — master (#161)
by Denis
07:42 queued 05:07
created

CustomEvent.__init__()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2
Metric Value
cc 1
dl 0
loc 2
ccs 0
cts 0
cp 0
crap 2
rs 10
1
2 1
from datetime import datetime
3
4 1
from opcua import ua
5 1
from opcua import Node
6 1
import uuid
7
8
9 1
class EventGenerator(object):
10
11
    """
12
    Create an event based on an event type. Per default is BaseEventType used.
13
    Object members are dynamically created from the base event type and send to
14
    client when evebt is triggered (see example code in source)
15
16
    Arguments to constructor are:
17
18
        server: The InternalSession object to use for query and event triggering
19
20
        source: The emiting source for the node, either an objectId, NodeId or a Node
21
22
        etype: The event type, either an objectId, a NodeId or a Node object
23
    """
24
25 1
    def __init__(self, isession, etype=ua.BaseEvent(), source=ua.ObjectIds.Server):
26 1
        self.isession = isession
27
        self.event = None
28 1
        node = None
29
30 1
        if isinstance(etype, ua.BaseEvent):
31
            self.event = etype
32
        elif isinstance(etype, Node):
33 1
            node = etype
34
        elif isinstance(etype, ua.NodeId):
35 1
            node = Node(self.isession, etype)
36 1
        else:
37
            node = Node(self.isession, ua.NodeId(etype))
38 1
39
        if node:
40
            self.event = get_event_from_node(node)
41 1
42
        if isinstance(source, Node):
43
            pass
44 1
        elif isinstance(source, ua.NodeId):
45 1
            source = Node(isession, source)
46 1
        else:
47 1
            source = Node(isession, ua.NodeId(source))
48 1
49 1
        if self.event.SourceNode.Identifier:
50 1
            source = Node(self.isession, self.event.SourceNode)
51 1
52
        self.event.SourceName = source.get_display_name().Text
53
        source.set_attribute(ua.AttributeIds.EventNotifier, ua.DataValue(ua.Variant(1, ua.VariantType.Byte)))
54 1
55 1
    def __str__(self):
56 1
        return "EventGenerator(Type:{}, Source:{}, Time:{}, Message: {})".format(self.EventType, self.SourceNode, self.Time, self.Message)
57 1
    __repr__ = __str__
58 1
59
    def trigger(self, time=None, message=None):
60 1
        """
61
        Trigger the event. This will send a notification to all subscribed clients
62 1
        """
63
        self.event.EventId = ua.Variant(uuid.uuid4().hex, ua.VariantType.ByteString)
64 1
        if time:
65
            self.event.Time = time
66
        else:
67
            self.event.Time = datetime.utcnow()
68 1
        self.event.RecieveTime = datetime.utcnow()
69
        #FIXME: LocalTime is wrong but currently know better. For description s. Part 5 page 18
70 1
        self.event.LocalTime = datetime.utcnow()
71 1
        if message:
72 1
            self.Message = ua.LocalizedText(message)
73 1
        elif not self.event.Message:
74 1
            self.event.Message = ua.LocalizedText(self.source.get_browse_name().Text)
75
        self.isession.subscription_service.trigger_event(self.event)
76
77
78
def get_event_from_node(node):
79
    event = None
80
    if node.nodeid.Identifier in ua.uaevents_auto.IMPLEMNTED_EVENTS.keys():
81
        event = ua.uaevents_auto.IMPLEMNTED_EVENTS[node.nodeid.Identifier]()
82
83
    else:
84
        pass
85
        #node.get
86
87
        #class CustomEvent():
88
89
            #pass
90
    #references = node.get_children_descriptions(refs=ua.ObjectIds.HasProperty)
91
    #for desc in references:
92
        #child = Node(self.isession, desc.NodeId)
93
        #setattr(self.event, desc.BrowseName.Name, child.get_value())
94
95
    return event
96
97
98
class CustomEvent(ua.BaseEvent):
99
100
    def __init__(self, etype=ua.BaseEvent, sourcenode=ua.NodeId(ua.ObjectIds.Server), message=None, severity=1):
101
        super(CustomEvent, self).__init__(sourcenode, message, severity, True)
102
        #TODO: Add fileds
103
104
    #TODO: Extend to show all fields of CustomEvent
105
    def __str__(self):
106
        s = 'CustomEvent('
107
        s += 'EventId:{}'.format(self.EventId)
108
        s += ', EventType:{}'.format(self.EventType)
109
        s += ', SourceNode:{}'.format(self.SourceNode)
110
        s += ', SourceName:{}'.format(self.SourceName)
111
        s += ', Time:{}'.format(self.Time)
112
        s += ', RecieveTime:{}'.format(self.RecieveTime)
113
        s += ', LocalTime:{}'.format(self.LocalTime)
114
        s += ', Message:{}'.format(self.Message)
115
        s += ', Severity:{}'.format(self.Severity)
116
        s += ')'
117
118
119
        return s
120
    __repr__ = __str__
121