-
-
Save andreareginato/24d448be282e243dbd65 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import paho.mqtt.client as paho | |
import RPi.GPIO as GPIO | |
import json, time | |
# device credentials | |
device_id = '<DEVICE_ID>' # * set your device id (will be the MQTT client username) | |
device_secret = '<DEVICE_SECRET>' # * set your device secret (will be the MQTT client password) | |
random_client_id = '<CLIENT_ID>' # * set a random client_id (max 23 char) | |
# -------------- # | |
# Board settings # | |
# -------------- # | |
buttonPin = 7 | |
ledPin = 12 | |
GPIO.setmode(GPIO.BOARD) # use P1 header pin numbering convention | |
GPIO.cleanup() # clean up resources | |
GPIO.setup(ledPin, GPIO.OUT) # led pin setup | |
GPIO.setup(buttonPin, GPIO.IN) # button pin setup | |
# --------------- # | |
# Callback events # | |
# --------------- # | |
# connection event | |
def on_connect(client, data, flags, rc): | |
print('Connected, rc: ' + str(rc)) | |
# subscription event | |
def on_subscribe(client, userdata, mid, gqos): | |
print('Subscribed: ' + str(mid)) | |
# received message event | |
def on_message(client, obj, msg): | |
# get the JSON message | |
json_data = msg.payload | |
# check the status property value | |
print(json_data) | |
value = json.loads(json_data)['properties'][0]['value'] | |
if value == 'on': | |
led_status = GPIO.HIGH | |
GPIO.output(ledPin, GPIO.HIGH) | |
else: | |
led_status = GPIO.LOW | |
GPIO.output(ledPin, GPIO.LOW) | |
# confirm changes to Leylan | |
client.publish(out_topic, json_data) | |
# ------------- # | |
# MQTT settings # | |
# ------------- # | |
# create the MQTT client | |
client = paho.Client(client_id=random_client_id, protocol=paho.MQTTv31) # * set a random string (max 23 chars) | |
# assign event callbacks | |
client.on_message = on_message | |
client.on_connect = on_connect | |
client.on_subscribe = on_subscribe | |
# device topics | |
in_topic = 'devices/' + device_id + '/get' # receiving messages | |
out_topic = 'devices/' + device_id + '/set' # publishing messages | |
# client connection | |
client.username_pw_set(device_id, device_secret) # MQTT server credentials | |
client.connect("178.62.108.47") # MQTT server address | |
client.subscribe(in_topic, 0) # MQTT subscribtion (with QoS level 0) | |
# ------------ # | |
# Button logic # | |
# ------------ # | |
prev_status = GPIO.LOW | |
led_status = GPIO.LOW | |
updated_at = 0 # the last time the output pin was toggled | |
debounce = 0.2 # the debounce time, increase if the output flickers | |
# Continue the network loop, exit when an error occurs | |
rc = 0 | |
while rc == 0: | |
rc = client.loop() | |
button = GPIO.input(buttonPin) | |
if button != prev_status and time.time() - updated_at > debounce: | |
prev_status = button | |
updated_at = time.time() | |
if button: | |
led_status = not led_status | |
button_payload = 'off' | |
if led_status == GPIO.HIGH: | |
button_payload = 'on' | |
# effectively update the light status | |
GPIO.output(ledPin, led_status) | |
payload = { 'properties': [{ 'id': '518be5a700045e1521000001', 'value': button_payload }] } | |
client.publish(out_topic, json.dumps(payload)) | |
print('rc: ' + str(rc)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment