Skip to content

Commit ed9e117

Browse files
PoC of micropython implementation
1 parent 73b2672 commit ed9e117

File tree

5 files changed

+385
-188
lines changed

5 files changed

+385
-188
lines changed

LiveObjectsSDK/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

LiveObjectsSDK/certfile.cer

Lines changed: 0 additions & 22 deletions
This file was deleted.

main.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
1-
from LiveObjectsSDK import *
1+
from uLiveObjectsSDK import *
22

3-
lo = LiveObjects("PythonMQTT", 8883, "YOUR API KEY")
3+
def do_connect():
4+
import network
5+
sta_if = network.WLAN(network.STA_IF)
6+
if not sta_if.isconnected():
7+
print('connecting to network...')
8+
sta_if.active(True)
9+
sta_if.connect('LIKI', 'Newconnect75')
10+
while not sta_if.isconnected():
11+
pass
12+
print('network config:', sta_if.ifconfig())
13+
14+
do_connect()
15+
lo = LiveObjects("PythonMQTT", 1883, "YOUR API KEY")
416

517
uptime = 0
618
def foo(arg=""):
7-
lo.outputDebug(Debug.INFO,"Wywolalem funkcje foo z argumentem ", arg)
19+
lo.outputDebug(INFO,"Wywolalem funkcje foo z argumentem ", arg)
820
return { "blinked" : "5 times"}
921

1022

1123
if __name__ == '__main__':
1224
lo.addCommand("foo",foo)
13-
lo.addParameter("messageRate",5 , Type.INT)
25+
lo.addParameter("messageRate",5 , INT)
1426
lo.connect()
1527
uptime = time.time()
1628
while True:
1729
lo.addToPayload("uptime", int(time.time()-uptime))
1830
lo.sendData()
31+
lo.loop()
1932
time.sleep(lo.getParameter("messageRate"))
Lines changed: 161 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -1,161 +1,161 @@
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

Comments
 (0)