# подключение к wifi сети

import network

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
    pass

print("IP Address:", wlan.ifconfig()[0])
print("Subnet Mask:", wlan.ifconfig()[1])
print("Gateway:", wlan.ifconfig()[2])
print("DNS Server:", wlan.ifconfig()[3])

# установка и импорт необходимых библиотек
import machine
from utime import sleep

import upip
upip.install("micropython-urequests")
upip.install('micropython-ssd1306')

import urequests
import ssd1306


# диод
diode = machine.Pin(15, machine.Pin.OUT)

# функция отправки запроса, обработки ответа и управления диодом
def led_on_off_with_response():
    response = urequests.get("https://yesno.wtf/api")
    if response.status_code == 200:
        data = response.json()
        answer = data['answer']
        print(answer)
        
        if answer == 'no':
            diode.off()
        elif answer == 'yes':
            diode.on()
        
        response.close()
    else:
        print('ERROR: yesno.wtf')


# дисплей
i2c = machine.SoftI2C(scl=machine.Pin(22), sda=machine.Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# зуммер
buzzer = machine.Pin(18, machine.Pin.OUT)


def weather():
    # логин и пароль от API погоды: cfa23974@nezid.com
    response = urequests.get("http://api.weatherapi.com/v1/current.json?key=c34f7f5c7d4549e3a0092325232610&q=Tyumen&aqi=yes")
    if response.status_code == 200:
        data = response.json()
        location = data['location']['name']
        temp_c = data['current']['temp_c']
        condition = data['current']['condition']['text']
        wind_mph = data['current']['wind_mph']
        humidity = data['current']['humidity']
        cloud = data['current']['cloud']
        co = data['current']['air_quality']['co']
        so2 = data['current']['air_quality']['so2']

        print("Current weather in {0}:\nTEMP={1}C, CONDITION={2}\nWIND={3}mph, HUMIDITY={4}%, CLOUD={5}%\nAIR QUALITY: CO={6}, SO2={7}".format(location, temp_c, condition, wind_mph, humidity, cloud, co, so2))

        # вычисляем координату x, чтобы вывести локацию по центру
        display_width = oled.width
        text_width = len(location) * 8
        x = (display_width - text_width) // 2

        # очистить дисплей
        oled.fill(0)
        oled.show()

        # печатаем информацию о погоде на дисплее
        oled.text(location, x, 0)
        oled.text("TEMP:{}C".format(temp_c), 0, 20)
        oled.text("WIND:{}mph".format(wind_mph), 0, 30)
        oled.text("HUMIDITY:{}%".format(humidity), 0, 40)
        oled.text("CLOUD:{}%".format(cloud), 0, 50)
        oled.show()
        
        # работа зуммера исходя из данных so
        so_buzzer(co)


def so_buzzer(co):
    if co > 200 and co < 400:
        buzzer.on()
        sleep(1)
        buzzer.off()
        buzzer.on()
        sleep(1)
        buzzer.off()
        buzzer.on()
        sleep(1)
        buzzer.off()
    elif co > 400 and co < 600:
        buzzer.on()
        sleep(2)
        buzzer.off()
        buzzer.on()
        sleep(2)
        buzzer.off()
    elif co > 600:
        buzzer.on()
        sleep(5)
        buzzer.off()


while True:
    oled.fill(0)
    oled.show()
    oled.text("UPDATING INFO...", 0, 30)
    oled.show()

    # Получить рандомный да/нет и вкл/выкл лампочку (задание 1)
    led_on_off_with_response()

    weather()

    sleep(10)
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
led1:A
led1:C
r1:1
r1:2
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
bz1:1
bz1:2
servo1:GND
servo1:V+
servo1:PWM