import network
import time

import ujson
import _thread
from machine import Pin, ADC, PWM
from umqtt.simple import MQTTClient
from servo import Servo

MQTT_CLIENT_ID = "sensores"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_TOPIC_SEND_GAS = "purificador/sensors/gas"
MQTT_TOPIC_SEND_PARTICLES = "purificador/sensors/particles"
MQTT_TOPIC_SEND = "purificador/sensors"
MQTT_TOPIC_RELE = "purificador/rele"
MQTT_TOPIC_SERVO = "purificador/servo"
MQTT_TOPIC_VALUES = "purificador/values"

WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""

gas = ADC(Pin(34, Pin.IN))
gas.atten(ADC.ATTN_11DB)

particula = ADC(Pin(35, Pin.IN))
particula.atten(ADC.ATTN_11DB)

rele = Pin(12, Pin.OUT)
servo = Servo(pin=13)

print("Connecting to WiFi", end="")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
while not wifi.isconnected():
  pass

client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)

publish_value_rele = 0
publish_value_servo = 0

def callback(topic, msg):
  msg = ujson.loads(msg.decode())
  if topic.decode() == MQTT_TOPIC_RELE:
    global publish_value_rele
    publish_value_rele = int(msg["valor"])
  elif topic.decode() == MQTT_TOPIC_SERVO:
    global publish_value_servo
    publish_value_servo = int(msg["valor"])
  else:
    global gas_value, particula_value
    gas_value = int(msg["gas"])
    particula_value = int(msg["particula"])

client.set_callback(callback)
client.connect()

print("\nConnected!")

client.subscribe(MQTT_TOPIC_RELE)
client.subscribe(MQTT_TOPIC_SERVO)
client.subscribe(MQTT_TOPIC_VALUES)

def check_msg():
  while True:
    time.sleep(1)
    client.check_msg()

def verify_values():
  global gas_value, particula_value
  if (gas_value > 30000 or particula_value > 30000): return True
  else: return False

def change_rele():
  global publish_value_rele
  global publish_value_servo

  while True:
    if publish_value_rele == 1 or publish_value_servo == 1: 
        if publish_value_rele == 1: rele.on()
        else: rele.off()
        if publish_value_servo == 1: servo.move(100)
        else: servo.move(50)
    else:
      verification = verify_values()
      if (verification): 
        servo.move(100)
        rele.on()
      else: 
        servo.move(50)
        rele.off()
    time.sleep(1)

_thread.start_new_thread(check_msg, ())
_thread.start_new_thread(change_rele, ())

print("Medindo...")
while True:
  gas_value = gas.read_u16()
  particula_value = particula.read_u16()
  message = ujson.dumps({
    "gas": gas_value,
    "particula": particula_value
  })
  message_gas = ujson.dumps({
    "gas": gas_value
  })
  message_particle = ujson.dumps({
    "particula": particula_value
  })
  client.publish(MQTT_TOPIC_SEND, message)
  client.publish(MQTT_TOPIC_SEND_GAS, message_gas)
  client.publish(MQTT_TOPIC_SEND_PARTICLES, message_particle)
  time.sleep(1)
$abcdeabcde151015202530fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module