- Notifications
You must be signed in to change notification settings - Fork1
Live Objects SDK for Python & MicroPython
License
DatavenueLiveObjects/LiveObjects_SDK_for_Python
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Discover OrangeLive Objects using dedicated SDK forPython 3 and uPython compatible boards and systems.
This code wraps all the functions necessary to make your object work with Live Objects.
You can declare parameters, which you can later update OTA from Live objects. You can also create commands to trigger actions remotely.Only thing you must do yourself is connecting the board with internet.
Code uses MQTT connection to exchange data with Live objects under the hood to keep your parameters up to date or execute the commands received without you having to take care of them (apart from writing the code of these commands, of course).
System | MQTT | MQTTS |
---|---|---|
Linux | OK | OK |
Windows | OK | OK |
Raspberry Pi | OK | OK |
ESP8266 | OK | - |
ESP32 | OK | OK |
LoPy (Pycom) | OK | - |
GPy (Pycom) | OK | - |
This code needs a few libraries to run:
- Python needspaho-mqtt
- Python for Windows needspython-certifi-win32
- uPython needsumqttsimple andumqttrobust
- Log in toLive Objects or request atrial account (up to 10 devices for 1 year) if you don't have one,
- Create anAPI key for your device. Give it a name, select theDevice access role and validate. Copy the key,
- Clone or download the directory from GitHub,
- Change<APIKEY> in
credentials.py
to one you generated, - Run selected
.py
script
Constructor of LiveObjects looks like below:
lo=LiveObjects.Connection()
You can use LiveObjects to output debug messages.
VALUE=21# INFO / ERROR / WARNINGlo.output_debug(LiveObjects.INFO,"example value",VALUE, ...)# Output: [INFO] example value 21 ...
You can update over the air some parameters of your script using Live Objects's parameters. Parameters and Commands must be declaredbefore your device connects to Live Objects.
You can declare parameters with theaddParameter()
instruction, which accepts the following arguments:
- the label of your parameter as it will be displayed on Live Objects;
- the value of parameter
- parameter type [INT STRING FLOAT BINARY]
- (optional) a callback function, if you need to perform some tasks after the parameter has been updated
To retrieve a parameter use functiongetParameter()
which takes following arguments:
- Parameter name
Example:
lo.add_parameter("message_rate",25,LiveObjects.INT)lo.add_parameter("send_DHT_data",true,LiveObjects.BINARY,my_callback_function)# ...iflo.get_parameter("send_DHT_data"):lo.add_to_payload("temperature",DHT.read_temeprature())lo.add_to_payload("humidity",DHT.read_humidity())
The callback function takes 2 arguments:
defmy_callback_function(parameter_name,new_value):# do stuff
Further reading on Live Objects'Parameters.
Commands let you trigger specific actions on your device from Live Objects. Parameters and Commands must be declaredbefore your device connects to Live Objects.
Commands can be declared using theaddcommand()
instruction, which accepts the following arguments:
- the label of your command
- the callback function that will execute the command.
lo.add_parameter("a command",my_callback, );
The callback function should take 1 parameter and return dictionary:
defmy_callback(args={}):# do stuffreturn {}
Arguments and response are optional when using commands, but they can be useful if you want to pass parameters to your function. For instance, you could define aplay tone
command that will use some parameters like the frequency of the tone, or its duration.
- Any incoming arguments will be passed as member of a dictionary
- You can pass response arguments in the form of a dictionary by returning them
defplay_tone(args={}):duration=args["duration"]frequency=args["frequency"]# play the tone accordingly to arguments# ...return {"I played":"the tone"}defsetup():lo.add_command("play tone",play_tone)
Warning:Command name and arguments are case-sensitive when creating the command on Live Objects.: On the opposite, there is no specific order for specifying the command arguments.
Further reading on Live Objects'Commands.
You can send data very easily to Live Objects.
Compose your payload using theaddToPayload()
instruction. You will need to provide a label for your value, and the data itself. Your data can be of any simple type.
Data is added on each call toaddToPayload()
, so repeat the instruction if you have multiple data to send. When your payload is ready, send it usingsendData()
. That simple.
VALUE=21MY_OTHER_VALUE=37deffoo():# collect datalo.add_to_payload("my data",VALUE)lo.add_to_payload("my other data",MY_OTHER_VALUE)lo.send_data()# send to LiveObjects
As soon the data is sent, your payload is cleared and waiting for the next sending.
# Add "model" property to your messagelo.add_model("example_name")# Add "tag" property to your messagelo.add_tag("kitchen")lo.add_tags(["humidity","bathroom"])# Use your object as payload (this function doesn't append current payload)obj= {"example":"value","example2":"value2"}lo.set_object_as_payload(obj)
You can control the connection and disconnection of your device usingconnect()
anddisconnect()
.
In order to check for any incoming configuration update or command, you need to keep theloop()
instruction in your main loop.
deffoo():lo.connect();whileTrue:# Do some stuff#...lo.loop();#Keep this in main looplo.disconnect()
Every board has its own default carrier for connection to the network (see below).
System | Default carrier | Optional carrier |
---|---|---|
Linux | Delivered by OS | - |
Windows | Delivered by OS | - |
Raspberry Pi | Delivered by OS | - |
ESP8266 | Wi-Fi | - |
ESP32 | Wi-Fi | - |
LoPy (Pycom) | Wi-Fi | - |
GPy (Pycom) | Wi-Fi | LTE |
For GPy you can switch connectivity to optional carrier. You need to do change inConnection
class inConnection.py
from:
def__init__(self,debug=True):self.__board=LiveObjects.BoardsFactory(net_type=LiveObjects.BoardsInterface.DEFAULT_CARRIER)...
to:
def__init__(self,debug=True):self.__board=LiveObjects.BoardsFactory(net_type=LiveObjects.BoardsInterface.LTE)...
Then GPy will connect via LTE network.
There is possibility to add your new type of board supporting Python/uPython.You need to add your own class inhal.py
. Name of this class has to be the same as output ofsys.platform
and has to start from capital letter.
>>> sys.platform'GPy'>>>
Below code shows basic constructor:
def__init__(self,net_type):self._lang_id=BoardsInterface.MICROPYTHONself._net_type=BoardsInterface.WIFIifnet_type==BoardsInterface.DEFAULT_CARRIERelsenet_typeself._carrier_capability= (BoardsInterface.WIFI,)self._wifi_tls_capability=Falseself._credentials=super().create_credentials(self._net_type)
Basic fields meaning:
- _lang_id: used Python dialect: PYTHON / MICROPYTHON,
- _net_type: used type of network: WIFI / LTE / network delivered by OS / ...
- _carrier_capability:tuple containing supported type(s) of network,
- _wifi_tls_capability:True if TLS is supported and MQTTS could be used,
- _credentials: required credentials depended on network type: SSID/PASS for Wi-Fi, PIN/APN for LTE etc.
If other specific fields are necessary you need to define them.You need to override specific methods - e.g.connect
which is depended on type of board.All specific functions are placed inservices.py
.If your board needs function supporting its equipment you need to put it in this file.
We can connect sensor using I2C to board supporting Python likeRaspberry Pi.
TheVL6180X is the latest product based on ST’s patented FlightSense™technology.This is a ground-breaking technology allowing absolute distance to be measured independent of target reflectance.Instead of estimating the distance by measuring the amount of light reflected back from the object (which is significantly influenced by color and surface),the VL6180X precisely measures the time the light takes to travel to the nearest object and reflect back to the sensor (Time-of-Flight).Description from st.com.
Enable (if needed)I2C interface on your Raspberry Pi using terminal and command:
sudo raspi-config
and selecting:3 Interface Options ->P5 I2C -><Yes>
Example of development module using VL6180X you can findhere. Below diagram shows how to connect it to Raspberry Pi.
Necessary module byAdafruit can be installed usingpip
pip3 install adafruit-circuitpython-vl6180x
To run you need to use below command:
python3 7_distance_and_light_sensor.py
- ampy
- umqttsimple, umqttrobust and ssl (for your convenience they are included in
micropython
folder) - PuTTY (for Windows)
- Preparation
Change<APIKEY> incredentials.py
to one you generated.
Change<WIFI_SSID> and<WIFI_PASS> suitable to your Wi-Fi orchange<PIN> and<APN> suitable to your SIM card.
- Copy files into device
> ampy --port COMx put umqttrobust.py > ampy --port COMx put simple.py > ampy --port COMx put LiveObjects // It will copy directory with its content
- Prepare your script and save it as
main.py
then copy file into device.You can use one of example ones (1_send_data.py
, ...) renaming it tomain.py
> ampy --port COMx put main.py
Connect to device and check if it's working using PuTTY
Ctrl + D soft resets device
Ctrl + C Stops currently running script
After all steps content of the device should look like below:
> ampy --port COMx ls/LiveObjects/boot.py/main.py/umqttrobust.py/simple.py> ampy --port COMx ls LiveObjects/LiveObjects/Connection.py/LiveObjects/__init__.py/LiveObjects/hal.py/LiveObjects/credentials.py/LiveObjects/services.py
where COMx means port on your computer (e.g. COM8) with connected microPython board.
You can do the steps as above but better is to usePymakr plug-in forVisual Studio Code orAtom delivered byPycom.Plug-in supports code development, its upload to the board and communication with board.
Sensor described in thissection can be used on boards supporting microPython.
You need to connect I2C interface (SCL & SDA) and power lines on the board with corresponding pins on the sensor.You need to be aware thatboards can use different GPIOs for I2C purposes. Set of typical pairs is placedin functionget_i2c()
in filehal.py
. If your board uses other GPIO pins, you need to add them to the tupletypical_gpio
.
defget_i2c():importmachinetypical_gpio= ([22,23], [5,4], [22,21])...
Example of wiring ESP32 board with GPIO22 and GPIO21 (source:https://randomnerdtutorials.com/esp32-pinout-reference-gpios/)
- You need to upload additional library for VL6180X support (it is placed in
micropython
folder):
> ampy --port COMx put vl6180x_micro.py
- Copy
7_distance_and_light_sensor.py
asmain.py
and upload it into board.
After above operations you can see:
> ampy --port COMx ls/LiveObjects/boot.py/main.py/umqttrobust.py/simple.py/vl6180x_micro.py> ampy --port COMx ls LiveObjects/LiveObjects/Connection.py/LiveObjects/__init__.py/LiveObjects/hal.py/LiveObjects/credentials.py/LiveObjects/services.py
- Connect to device and check if it's working using PuTTY.
If you are getting 'MQTT exception: 5' check your api key
About
Live Objects SDK for Python & MicroPython
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Contributors3
Uh oh!
There was an error while loading.Please reload this page.