Subscribing to control topics lets your Raspberry Pi listen for commands or messages. This helps it react to changes or instructions from other devices or programs.
Subscribing to control topics in Raspberry Pi
import paho.mqtt.client as mqtt def on_message(client, userdata, message): print(f"Received message: {message.payload.decode()} on topic {message.topic}") client = mqtt.Client() client.on_message = on_message client.connect("broker.hivemq.com", 1883) client.subscribe("control/topic") client.loop_forever()
This example uses the MQTT protocol, common for control topics.
The on_message function runs when a message arrives.
home/lights to receive light control messages.client.subscribe("home/lights")client.subscribe([("home/lights", 0), ("home/temperature", 1)])
def on_message(client, userdata, message): print(f"Topic: {message.topic}, Message: {message.payload.decode()}")
This program connects to a public MQTT broker and subscribes to the control/topic. It prints any messages received on that topic for 10 seconds.
import paho.mqtt.client as mqtt def on_message(client, userdata, message): print(f"Received message: {message.payload.decode()} on topic {message.topic}") client = mqtt.Client() client.on_message = on_message client.connect("broker.hivemq.com", 1883) client.subscribe("control/topic") client.loop_start() import time # Keep the program running for 10 seconds to receive messages for i in range(10): print(f"Waiting for messages... {i+1}") time.sleep(1) client.loop_stop() client.disconnect()
Make sure your Raspberry Pi is connected to the internet to reach the MQTT broker.
You can replace broker.hivemq.com with your own MQTT broker address.
Use client.loop_start() and client.loop_stop() to run the network loop in the background.
Subscribing lets your Raspberry Pi listen for messages on specific topics.
Use MQTT client libraries like paho-mqtt to subscribe and handle messages.
Define a function to process messages and keep the client running to receive them.
Practice
Solution
Step 1: Understand MQTT subscription
Subscribing means the Raspberry Pi listens to messages on a topic.Step 2: Identify the purpose of control topics
Control topics send commands that the Raspberry Pi should react to.Final Answer:
To listen and react to control commands sent to the Raspberry Pi -> Option DQuick Check:
Subscribing = Listening to commands [OK]
- Confusing subscribing with publishing
- Thinking subscription stores data
- Assuming it updates the OS
"home/lights/control" using the Paho MQTT client?Solution
Step 1: Recall Paho MQTT subscribe method
The method to subscribe to a topic issubscribe().Step 2: Match the correct syntax
Usingclient.subscribe("home/lights/control")is correct syntax.Final Answer:
client.subscribe("home/lights/control") -> Option CQuick Check:
Subscribe method is subscribe() [OK]
- Using .sub() instead of .subscribe()
- Confusing subscribe with connect
- Using non-existent methods like .listen()
"ON" is received on the topic "home/lights/control"?
def on_message(client, userdata, message):
if message.payload.decode() == "ON":
print("Turning lights ON")
else:
print("Turning lights OFF")
client.subscribe("home/lights/control")
client.on_message = on_messageSolution
Step 1: Decode the message payload
The payload is decoded to string and compared to "ON".Step 2: Check the condition and print output
Since payload is "ON", it prints "Turning lights ON".Final Answer:
Turning lights ON -> Option AQuick Check:
Payload "ON" triggers print "Turning lights ON" [OK]
- Not decoding payload before comparison
- Assuming no output without explicit print
- Thinking decode() causes error
def on_message(client, userdata, message):
print(message.payload)
client.on_message = on_message
client.subscribe("home/lights/control")
client.loop_start()Solution
Step 1: Check connection setup
Before subscribing, the client must connect to the MQTT broker.Step 2: Identify missing connect call
The code lacksclient.connect()call, so subscription won't work.Final Answer:
Missing client.connect() before subscribing -> Option BQuick Check:
Must connect before subscribe [OK]
- Skipping client.connect() call
- Confusing callback function names
- Thinking loop_start() is wrong here
"home/lights/control" and "home/thermostat/control". Which code snippet correctly subscribes to both and handles messages differently based on the topic?Solution
Step 1: Subscribe to multiple topics correctly
client.subscribe(["home/lights/control", "home/thermostat/control"]) def on_message(client, userdata, message): topic = message.topic if topic == "home/lights/control": print("Light control received") elif topic == "home/thermostat/control": print("Thermostat control received") client.on_message = on_message uses a list to subscribe to both topics at once, which is valid.Step 2: Handle messages based on topic
The on_message function checksmessage.topicto differentiate actions.Final Answer:
correctly subscribes to both topics and handles them separately -> Option AQuick Check:
Subscribe list + topic check = correct [OK]
- Passing multiple topics as separate arguments
- Checking payload instead of topic for routing
- Subscribing after setting callback incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
