From 9889549a1cb2831da313351d4a9e6d63e08aa4d0 Mon Sep 17 00:00:00 2001 From: "Manraj Kaur (kaurm105)" Date: Thu, 1 Aug 2024 13:00:48 +0100 Subject: [PATCH] MQTT PROJECT CODING MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit import threading import random import time import paho.mqtt.client as mqtt broker = "broker.hivemq.com" port = 1883 energy_topic = "home/energy" temperature_topic = "home/temperature" # Publisher function for energy def publish_energy_data(client): while True: energy_usage = random.uniform(0.5, 2.0) # Simulate energy usage in kWh message = f"{energy_usage:.2f}" client.publish(energy_topic, message) print(f"Published Energy: {message} kWh") time.sleep(5) # Publish every 5 seconds # Publisher function for temperature def publish_temperature_data(client): while True: temperature = random.uniform(18.0, 30.0) # Simulate temperature in Celsius message = f"{temperature:.2f}" client.publish(temperature_topic, message) print(f"Published Temperature: {message} °C") time.sleep(5) # Publish every 5 seconds # Subscriber callback def on_message(client, userdata, message): topic = message.topic payload = message.payload.decode() if topic == energy_topic: energy_usage = float(payload) print(f"Received Energy: {energy_usage} kWh") if energy_usage > 1.5: print("High energy usage detected! Turning off non-essential devices.") else: print("Energy usage is within the normal range.") elif topic == temperature_topic: temperature = float(payload) print(f"Received Temperature: {temperature} °C") # Add any specific handling for temperature data here def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT broker") client.subscribe(energy_topic) client.subscribe(temperature_topic) else: print(f"Failed to connect, return code {rc}") # Create and configure the subscriber client subscriber_client = mqtt.Client() subscriber_client.on_connect = on_connect subscriber_client.on_message = on_message # Create and configure the publisher client publisher_client = mqtt.Client() # Connect both clients to the broker subscriber_client.connect(broker, port, 60) publisher_client.connect(broker, port, 60) # Run the MQTT loop for the subscriber in a separate thread subscriber_thread = threading.Thread(target=subscriber_client.loop_forever) subscriber_thread.start() # Run the publisher functions in separate threads energy_thread = threading.Thread(target=publish_energy_data, args=(publisher_client,)) temperature_thread = threading.Thread(target=publish_temperature_data, args=(publisher_client,)) energy_thread.start() temperature_thread.start() # Wait for the threads to complete energy_thread.join() temperature_thread.join() --- MQTT.docx | Bin 0 -> 16674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 MQTT.docx diff --git a/MQTT.docx b/MQTT.docx new file mode 100644 index 0000000000000000000000000000000000000000..d14cf7bd56a56004c68a3c5b394af2880f3c4790 GIT binary patch literal 16674 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 KT7u_~yZ-|-mW;#z literal 0 HcmV?d00001