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