# final_iaiiot_s250.py
# dew.ninja Oct 2023
import dht
import machine
from machine import Pin
from utime import sleep_ms
import time
#import paho.mqtt.client as mqtt
from umqtt.robust import MQTTClient
import ujson
import network
wifi_ssid = "Wokwi-GUEST" # Fill in your wifi info
wifi_pwd = ""
MQTT_BROKER = "broker.netpie.io"
MQTT_CLIENT = "5922c3c8-9d77-46d5-a390-fc53ff3deafd" # Fill in your NETPIE2020 data
MQTT_USER = "MH9yRBw3bJPECu3R97XYhrgoh4LQ77Eg"
MQTT_PWD = "aDN5K9231zbTgAtrpqVBmRnfzzMWceZP"
PUBLISH_PERIOD = 2000 # milliseconds
led = Pin(2, Pin.OUT)
alert_status = 0 # 0 = off, 1 = on
temp = 0
humid = 0
max_temp = 30 # default
max_humid = 50
sensor_data = {'temp_348': 0, 'humid_348':0, 'max_temp': 0,'max_humid':0, 'alert': 0}
dht22 = dht.DHT22(machine.Pin(4))
def wifi_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect(wifi_ssid, wifi_pwd)
while not wlan.isconnected():
pass
print('network config:', wlan.ifconfig())
def init_client():
global client
print("Trying to connect to mqtt broker.")
try:
client = MQTTClient(MQTT_CLIENT, MQTT_BROKER, port=1883, user=MQTT_USER,
password=MQTT_PWD)
#client.set_callback(callback)
client.connect()
print("Connected to ",MQTT_BROKER)
topic_sub = b"@msg/cmd"
print("Subscribed to ",topic_sub)
client.set_callback(sub_cb)
client.subscribe(topic_sub)
except:
print("Trouble to init mqtt.")
def sub_cb(topic, msg):
global cmdtime_current, cmdtime_prev
print((topic, msg))
if topic == b'@msg/cmd':
rcvdstrs = str(msg).split("'") # get rid of b'
rcvdstr = rcvdstrs[1]
# this delay is needed for nodered implementation
# cmdtime_current = time.ticks_ms()
# delta_cmdtime = cmdtime_current - cmdtime_prev
# if delta_cmdtime > CMD_DELAY:
# cmdtime_prev = cmdtime_current
cmdInt(rcvdstr)
#print(topic)
#command interpreter function
def cmdInt(userstr):
global max_temp, max_humid
result = userstr.find("=")
if result == -1:
noparm = 1
cmdstr = userstr.strip()
else:
noparm = 0
splitstr = userstr.split("=")
cmdstr = splitstr[0].strip()
parmstr = splitstr[1].strip()
#print(cmdstr)
#print(parmstr)
if cmdstr.lower() == "maxtemp":
# set maximum temperature
if noparm==1:
print("Current maximum temperature = {} cm".format(max_temp))
else:
max_temp = float(parmstr)
elif cmdstr.lower() == "maxhumid":
# set maximum temperature
if noparm==1:
print("Current maximum humidity = {} cm".format(max_humid))
else:
max_humid = float(parmstr)
else:
print("Invalid command")
online=True
if online:
wifi_connect() # connect to WiFi network
init_client()
# set publish period
time_prev = 0
time_current = 0
while True:
if temp>max_temp or humid>max_humid:
alert_status = 1
led.on()
else:
alert_status = 0
led.off()
time_current = time.ticks_ms()
publish_delta = time_current - time_prev
if publish_delta>PUBLISH_PERIOD: # publish interval must be larger than PUBLISH_PERIOD
time_prev = time_current
dht22.measure()
temp=dht22.temperature()
humid=dht22.humidity()
sensor_data['temp_348'] = temp
sensor_data['humid_348'] = humid
sensor_data['max_temp'] = max_temp
sensor_data['max_humid'] = max_humid
sensor_data['alert'] = alert_status
publish_str = ujson.dumps({"data": sensor_data})
print(publish_str)
if online:
client.check_msg()
client.publish("@shadow/data/update", publish_str)