Newer
Older
#!/usr/bin/python3
# TODO: read from header?
BROKER = "mqtt.c3pb.hack"
DEVICE = "my-device"
import sys
import paho.mqtt.client as mqtt
def on_connect(client, *ignored):
client.subscribe("device/" + DEVICE + "/ota/progress")
with open("build/qthing.bin", mode="rb") as f:
client.publish("device/" + DEVICE + "/ota/$firmware", payload=f.read())
def on_message(client, userdata, msg):
if msg.topic.endswith("error"):
print("OTA failed: " + str(msg.payload))
exit(1)
progress = int(msg.payload)
if progress == 0:
print("OTA progress:")
sys.stdout.write("\r[" + "#"*progress + " "*(100-progress) + "] " + str(progress) + "%")
sys.stdout.flush()
if progress == 100:
print("\nOTA successful")
if "--restart" in sys.argv:
print("restarting device")
client.publish("device/" + DEVICE + "/command", "restart")
else:
exit(0)
def on_publish(client, userdata, _ignored):
if userdata.first_pub_done:
exit(0)
userdata.first_pub_done = True
class Userdata(object):
first_pub_done = False
client = mqtt.Client(userdata=Userdata())
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.connect(BROKER)
client.loop_forever()