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