1+ import paho .mqtt .client as paho
2+ import json
3+ import datetime
4+ import time
5+ from enum import Enum
6+
7+ class Type (Enum ):
8+ INT = "i32"
9+ UINT = "u32"
10+ BINARY = "bin"
11+ STRING = "str"
12+ FLOAT = "f64"
13+
14+ class Debug (Enum ):
15+ INFO = "INFO"
16+ WARNING = "WARNING"
17+ ERROR = "ERROR"
18+
19+ class LiveObjectsParameter :
20+ def __init__ (self ,value ,type ):
21+ self .value = value
22+ self .type = type
23+
24+ class LiveObjects :
25+ def __init__ (self , deviceID , port , apiKey , debug = True ):
26+ self .__mqtt = paho .Client (deviceID )
27+ self .__port = port
28+ self .__apiKey = apiKey
29+ self .__parameters = {}
30+ self .__server = "liveobjects.orange-business.com"
31+ self .__topic = "dev/data"
32+ self .__value = "value"
33+ self .__payload = {self .__value : {}}
34+ self .__commands = {}
35+ self .__doLog = debug
36+
37+
38+ def __onMessage (self ,client , userdata , msg ):
39+ if msg .topic == "dev/cfg/upd" :
40+ self .__parameterManager (msg )
41+ elif msg .topic == "dev/cmd" :
42+ self .__commandManager (msg )
43+
44+ def __onConnect (self ,client , userdata , flags , rc ):
45+ self .outputDebug (Debug .INFO ,"Connected with result code " + str (rc ))
46+ if len (self .__commands )> 0 :
47+ self .__mqtt .subscribe ("dev/cmd" )
48+ if len (self .__parameters )> 0 :
49+ self .__mqtt .subscribe ("dev/cfg/upd" )
50+ self .__sendConfig ()
51+
52+
53+ def connect (self ):
54+ self .__mqtt .username_pw_set ("json+device" , self .__apiKey )
55+ self .__mqtt .on_connect = self .__onConnect
56+ self .__mqtt .on_message = self .__onMessage
57+ if self .__port == 8883 :
58+ self .__mqtt .tls_set ("certfile.cer" )
59+ self .__mqtt .connect (self .__server , self .__port , 60 )
60+ self .__mqtt .loop_start ()
61+ time .sleep (1 )
62+
63+
64+ def outputDebug (self ,info , * args ):
65+ if self .__doLog :
66+ print ("[" , datetime .datetime .now ().strftime ("%d-%m-%Y %H:%M:%S" ), "]" , end = "" , sep = "" )
67+ print ("[" ,info ,"]" , end = " " , sep = "" )
68+ for arg in args :
69+ print (arg , end = " " )
70+ print ("" )
71+ def __outputDebugS (self ,info , * args ):
72+ if self .__doLog :
73+ print ("[" , datetime .datetime .now ().strftime ("%d-%m-%Y %H:%M:%S" ), "]" , end = "" , sep = "" )
74+ print ("[" ,info ,"]" , end = " " , sep = "" )
75+ for arg in args :
76+ print (arg , end = "" )
77+ print ("" )
78+
79+ def addCommand (self , name , cmd ):
80+ self .__commands [name ] = cmd
81+
82+ def __commandManager (self ,msg ):
83+ msgDict = json .loads (msg .payload )
84+ self .__outputDebugS (Debug .INFO , "Received message:\n " , json .dumps (msgDict , sort_keys = True , indent = 4 ))
85+ outputMsg = {}
86+ outputMsg ["cid" ] = msgDict ["cid" ]
87+ response = self .__commands .get (msgDict ["req" ], self .__default )(msgDict ["arg" ])
88+ if len (response ) > 0 :
89+ outputMsg ["res" ] = response
90+ self .__publishMessage ("dev/cmd/res" , outputMsg )
91+
92+ def __default (self , req = "" ):
93+ self .outputDebug (Debug .INFO , "Command not found!" )
94+ return {"info" : "Command not found" }
95+
96+ def __sendConfig (self ):
97+ outMsg = { "cfg" : {} }
98+ for param in self .__parameters :
99+ outMsg ["cfg" ][param ]= { "t" : self .__parameters [param ].type .value , "v" : self .__parameters [param ].value }
100+ self .__publishMessage ("dev/cfg" ,outMsg )
101+
102+ def __parameterManager (self , msg ):
103+ self .outputDebug (Debug .INFO ,"Received message: " )
104+ self .__outputDebugS (Debug .INFO ,json .loads (msg .payload ))
105+ params = json .loads (msg .payload )
106+ for param in params ["cfg" ]:
107+ if params ["cfg" ][param ]["t" ] == "i32" :
108+ self .__parameters [param ].type = Type .INT
109+ elif params ["cfg" ][param ]["t" ] == "str" :
110+ self .__parameters [param ].type = Type .STRING
111+ elif params ["cfg" ][param ]["t" ] == "bin" :
112+ self .__parameters [param ].type = Type .BINARY
113+ elif params ["cfg" ][param ]["t" ] == "u32" :
114+ self .__parameters [param ].type = Type .UINT
115+ elif params ["cfg" ][param ]["t" ] == "f64" :
116+ self .__parameters [param ].type = Type .FLOAT
117+
118+ self .__parameters [param ].value = params ["cfg" ][param ]["v" ]
119+ self .__publishMessage ("dev/cfg" ,params )
120+
121+ def addParameter (self , name , val , type_ ):
122+ if type_ == Type .INT :
123+ val = int (val )
124+ elif type_ == Type .STRING :
125+ val = str (val )
126+ elif type_ == Type .BINARY :
127+ val = bool (val )
128+ elif type_ == Type .UINT :
129+ val = int (val )
130+ elif type_ == Type .FLOAT :
131+ val = float (val )
132+ self .__parameters [name ] = LiveObjectsParameter (val , type_ )
133+
134+ def getParameter (self ,name ):
135+ if self .__parameters [name ].type == Type .INT :
136+ return int (self .__parameters [name ].value )
137+ elif self .__parameters [name ].type == Type .STRING :
138+ return str (self .__parameters [name ].value )
139+ elif self .__parameters [name ].type == Type .BINARY :
140+ return bool (self .__parameters [name ].value )
141+ elif self .__parameters [name ].type == Type .UINT :
142+ return int (self .__parameters [name ].value )
143+ elif self .__parameters [name ].type == Type .FLOAT :
144+ return float (self .__parameters [name ].value )
145+ return 0
146+
147+ def addToPayload (self , name , val ):
148+ self .__payload [self .__value ][name ] = val
149+
150+ def sendData (self ):
151+ self .__publishMessage ("dev/data" ,self .__payload )
152+ self .__payload = {}
153+ self .__payload [self .__value ]= {}
154+
155+ def __publishMessage (self , topic , msg ):
156+ self .outputDebug (Debug .INFO , "Publishing message on topic: " , topic )
157+ self .__outputDebugS (Debug .INFO , "\n " , json .dumps (msg , sort_keys = True , indent = 4 ))
158+ self .__mqtt .publish (topic , json .dumps (msg ))
0 commit comments