import time
import network
import urequests as requests
#import MQTT receiver
import ujson
from time import sleep
from umqtt.simple import MQTTClient
#import libuary of LCD
from machine import Pin, SoftI2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
#setup LEDs
ledHeatR=Pin(19,Pin.OUT)
ledColdC=Pin(18,Pin.OUT)
ledFogB=Pin(17,Pin.OUT)
ledDryO=Pin(16,Pin.OUT)
#setup LCD
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
i2c = SoftI2C(scl=Pin(26), sda=Pin(25), freq=10000) #initializing the I2C method for ESP32
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
lcd.putstr("Hello MoTo")
ssid = 'Wokwi-GUEST'
password = ''
print("Connecting to WiFi", end="")
lcd.move_to(0,01)
lcd.putstr("Connect WiFi")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, password)
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
my_id = "6bdb22e471f79e83c798a9a232953f63"
my_url = f"https://api.openweathermap.org/data/2.5/weather?id=1566083&appid={my_id}&lang=vi&units=metric"
my_city = "BKK"
### MQTT receiver code
MyTemp = 0
MyHumid = 0
def mqtt_message(topic, msg): #action when get MQTT sensor data
global MyTemp,MyHumid
#print("Incoming message:", msg)
data = ujson.loads(msg)
topico = topic.decode("utf-8")
Mysen = data['sensor']
MyTemp = data['temp']
MyHumid = data['humidity']
print('')
print(f"sensor[{Mysen}] update Temp={MyTemp}c Humid={MyHumid}%")
#set MQTT config
MQTT_TOPIC= "wokwi-weather"
MQTT_TOPIC= 'HomeTempHumidy'
MQTT_CLIENT_ID = "WeatherT"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = "AAA"
MQTT_PASSWORD = "123"
lcd.move_to(0,1)
lcd.putstr("Connect MQTT")
print("Connecting to MQTT...", end="")
#client = MQTTClient("wokwi1", "broker.hivemq.com")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.set_callback(mqtt_message)
client.connect()
client.subscribe(MQTT_TOPIC)
print("Connected!")
TempOffset = -5
HumidOffset = -10
hour = 0
minut = 0
TimeC = -1
TimeW = -1
print('---------------------------------------------------------')
print("This Devide is control home's Temperature/Humidity ")
print(f"with offest {TempOffset}c /{HumidOffset}% from Weather forcast API")
print("And monitor by Temperature/Humidity MQTT sensor...")
print('---------------------------------------------------------')
print("Start..!")
lcd.move_to(0,1)
lcd.putstr("Start...! ")
while True:
print(".", end="")
time.sleep(1)
client.check_msg()
if (TimeW > 60) or (TimeW == -1) : #get weather API every 1 minute
TimeW = 0
res = requests.get(url=my_url).json()
# Temperature
temperature = res['main']['temp']
#print("Temperature:", temperature)
# Humidity
humidity = res['main']['humidity']
#print("Humidity:", humidity)
print(f"Weather from API: temperature:{temperature} ,Humidity:{humidity}")
##set target
TarTemp = (temperature + TempOffset) #-5
TarHumid = (humidity + HumidOffset) #-10
lcd.move_to(0,0)
lcd.putstr(f" Tar: T{int(TarTemp)}, H{int(TarHumid)} ")
if (TimeC > 5) or (TimeC == -1): #check temp every 5 sec
TimeC = 0
if MyTemp == 0 and MyHumid == 0: # home sensor not ready
print("*", end="")
lcd.move_to(0,1)
lcd.putstr(" Wait Sensor ")
else: ## get data from home sensor
lcd.move_to(0,1)
MyTempI = int(MyTemp)
MyHumidI = int(MyHumid)
lcd.putstr(f" Hom: T{int(MyTemp)}, H{int(MyHumid)} ")
print('')
print(f"Target Temp {TarTemp} vs Home Temp {MyTemp}")
print(f"Target Humidity {TarHumid} vs Home Humidity {MyHumid}")
#control heater & AIR
if MyTemp > TarTemp: #HOT
ledHeatR.off()
ledColdC.on()
else:
ledHeatR.on() # COLD
ledColdC.off()
#control dryer * FOG
if MyHumid > TarHumid: # FOG
ledFogB.off()
ledDryO.on()
else:
ledFogB.on() #DRY
ledDryO.off()
TimeC += 1
TimeW += 1
time.sleep(1)