Bird
Raised Fist0
Raspberry Piprogramming~20 mins

Subscribing to control topics in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
MQTT Control Topic Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this MQTT subscription callback?

Consider a Raspberry Pi subscribing to an MQTT topic home/lights/control. The callback prints the received message payload.

What will be printed when the message payload is ON?

Raspberry Pi
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()}")

client = mqtt.Client()
client.on_message = on_message
client.connect("broker.hivemq.com", 1883, 60)
client.subscribe("home/lights/control")

# Simulate receiving a message
class Msg:
    payload = b"ON"

on_message(client, None, Msg())
AReceived message: ON
BReceived message: b'ON'
CReceived message: None
DReceived message: on
Attempts:
2 left
💡 Hint

Remember that MQTT message payloads are bytes and need decoding.

🧠 Conceptual
intermediate
1:30remaining
Which MQTT topic subscription pattern matches all control topics under home?

You want your Raspberry Pi to subscribe to all control topics under home, such as home/lights/control and home/thermostat/control. Which subscription topic pattern should you use?

Ahome/#
Bhome/+/+
Chome/control/+
Dhome/+/control
Attempts:
2 left
💡 Hint

The plus sign + matches exactly one topic level.

🔧 Debug
advanced
2:30remaining
Why does this MQTT subscription callback not print messages?

The Raspberry Pi subscribes to home/lights/control but the callback never prints any message. What is the problem?

Raspberry Pi
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    print(f"Message: {msg.payload.decode()}")

client = mqtt.Client()
client.on_message = on_message
client.connect("broker.hivemq.com", 1883, 60)
client.subscribe("home/lights/control")

# Missing client.loop_forever() or client.loop_start() here
AThe client does not process network events because the loop is not started
BThe callback function is missing a return statement
CThe client.connect() call is missing the port number
DThe subscription topic is incorrect and does not match any published messages
Attempts:
2 left
💡 Hint

MQTT clients need to run a loop to receive messages.

📝 Syntax
advanced
2:00remaining
Which option correctly subscribes to multiple topics in one call?

You want to subscribe your Raspberry Pi MQTT client to home/lights/control and home/thermostat/control in one call. Which code is correct?

Aclient.subscribe("home/lights/control", "home/thermostat/control")
Bclient.subscribe([("home/lights/control", 0), ("home/thermostat/control", 0)])
Cclient.subscribe({"home/lights/control":0, "home/thermostat/control":0})
Dclient.subscribe("home/lights/control", qos=0); client.subscribe("home/thermostat/control", qos=0)
Attempts:
2 left
💡 Hint

Refer to the Paho MQTT subscribe method for multiple topics.

🚀 Application
expert
3:00remaining
How many messages will be received with this subscription pattern?

Your Raspberry Pi subscribes to home/+/control. The broker publishes messages to these topics:

  • home/lights/control
  • home/thermostat/control
  • home/lights/status
  • home/garden/control
  • home/lights/control/extra

How many messages will your client receive?

A2
B4
C3
D5
Attempts:
2 left
💡 Hint

The plus sign + matches exactly one topic level.

Practice

(1/5)
1. What is the main purpose of subscribing to control topics on a Raspberry Pi using MQTT?
easy
A. To send commands from the Raspberry Pi to other devices
B. To update the Raspberry Pi operating system automatically
C. To store data locally on the Raspberry Pi
D. To listen and react to control commands sent to the Raspberry Pi

Solution

  1. Step 1: Understand MQTT subscription

    Subscribing means the Raspberry Pi listens to messages on a topic.
  2. Step 2: Identify the purpose of control topics

    Control topics send commands that the Raspberry Pi should react to.
  3. Final Answer:

    To listen and react to control commands sent to the Raspberry Pi -> Option D
  4. Quick Check:

    Subscribing = Listening to commands [OK]
Hint: Subscribing means listening, not sending commands [OK]
Common Mistakes:
  • Confusing subscribing with publishing
  • Thinking subscription stores data
  • Assuming it updates the OS
2. Which of the following is the correct Python syntax to subscribe to an MQTT topic named "home/lights/control" using the Paho MQTT client?
easy
A. client.connect("home/lights/control")
B. client.sub("home/lights/control")
C. client.subscribe("home/lights/control")
D. client.listen("home/lights/control")

Solution

  1. Step 1: Recall Paho MQTT subscribe method

    The method to subscribe to a topic is subscribe().
  2. Step 2: Match the correct syntax

    Using client.subscribe("home/lights/control") is correct syntax.
  3. Final Answer:

    client.subscribe("home/lights/control") -> Option C
  4. Quick Check:

    Subscribe method is subscribe() [OK]
Hint: Subscribe uses .subscribe(), not .sub() or .listen() [OK]
Common Mistakes:
  • Using .sub() instead of .subscribe()
  • Confusing subscribe with connect
  • Using non-existent methods like .listen()
3. Given the following code snippet, what will be printed when a message with payload "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_message
medium
A. Turning lights ON
B. Turning lights OFF
C. No output
D. Error: decode() not found

Solution

  1. Step 1: Decode the message payload

    The payload is decoded to string and compared to "ON".
  2. Step 2: Check the condition and print output

    Since payload is "ON", it prints "Turning lights ON".
  3. Final Answer:

    Turning lights ON -> Option A
  4. Quick Check:

    Payload "ON" triggers print "Turning lights ON" [OK]
Hint: Decode payload before comparing strings [OK]
Common Mistakes:
  • Not decoding payload before comparison
  • Assuming no output without explicit print
  • Thinking decode() causes error
4. Identify the error in this MQTT subscription code snippet for Raspberry Pi:
def on_message(client, userdata, message):
    print(message.payload)

client.on_message = on_message
client.subscribe("home/lights/control")
client.loop_start()
medium
A. Incorrect callback function name
B. Missing client.connect() before subscribing
C. Using loop_start() instead of loop_forever()
D. No error, code is correct

Solution

  1. Step 1: Check connection setup

    Before subscribing, the client must connect to the MQTT broker.
  2. Step 2: Identify missing connect call

    The code lacks client.connect() call, so subscription won't work.
  3. Final Answer:

    Missing client.connect() before subscribing -> Option B
  4. Quick Check:

    Must connect before subscribe [OK]
Hint: Always connect client before subscribing [OK]
Common Mistakes:
  • Skipping client.connect() call
  • Confusing callback function names
  • Thinking loop_start() is wrong here
5. You want your Raspberry Pi to subscribe to multiple control topics: "home/lights/control" and "home/thermostat/control". Which code snippet correctly subscribes to both and handles messages differently based on the topic?
hard
A. 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
B. client.subscribe("home/lights/control") client.subscribe("home/thermostat/control") def on_message(client, userdata, message): if message.payload == "light": print("Light control") else: print("Thermostat control") client.on_message = on_message
C. client.subscribe("home/lights/control", "home/thermostat/control") def on_message(client, userdata, message): print("Control received") client.on_message = on_message
D. client.subscribe("home/lights/control") def on_message(client, userdata, message): print("Control received") client.on_message = on_message client.subscribe("home/thermostat/control")

Solution

  1. 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.
  2. Step 2: Handle messages based on topic

    The on_message function checks message.topic to differentiate actions.
  3. Final Answer:

    correctly subscribes to both topics and handles them separately -> Option A
  4. Quick Check:

    Subscribe list + topic check = correct [OK]
Hint: Subscribe with list and check message.topic [OK]
Common Mistakes:
  • Passing multiple topics as separate arguments
  • Checking payload instead of topic for routing
  • Subscribing after setting callback incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard