This commit is contained in:
Ádám Kovács
2023-11-07 14:00:40 +01:00
parent 36638e2dd1
commit ec52bd7384
7 changed files with 301 additions and 0 deletions

167
main.py Normal file
View File

@@ -0,0 +1,167 @@
import os
import network
import socket
import time
from machine import Pin
import constants
import globals
import helper
import components.layout as layout
import components.main as main
from secrets import secrets
from type import Setting, Time
# while True:
# time.sleep_ms(200)
globals.init()
global day_mode_filename
day_mode_filename = "day_mode.txt"
led = Pin('LED', Pin.OUT)
def blink_onboard_led(num_blinks):
for i in range(num_blinks):
led.value(1)
time.sleep_ms(200)
led.value(0)
time.sleep_ms(200)
blink_onboard_led(1)
if not helper.file_or_dir_exists(day_mode_filename):
print('File does not exist.')
with open(day_mode_filename, "w") as f:
f.write("byweek")
f.close()
else:
with open(day_mode_filename) as f:
content = f.readline()
if content == "byweek":
print("byweek")
globals.day_mode = constants.BY_WEEK
else:
print("byday")
globals.day_mode = constants.BY_DAY
ssid = secrets['ssid']
password = secrets['pw']
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
if wlan.status() != 3:
blink_onboard_led(3)
raise RuntimeError('network connection failed')
else:
print('connected')
status = wlan.ifconfig()
print( 'ip = ' + status[0] )
blink_onboard_led(2)
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
def result_ok(cl, response = None):
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response if response is not None else "Ok")
cl.close()
def result_notfound(cl, response = None):
cl.send('HTTP/1.0 404 NotFound\r\nContent-type: text/html\r\n\r\n')
cl.send(response if response is not None else "Not Found")
cl.close()
def check_header_button_endpoints(cl, request):
if request.find('/set_by_week') == 6:
set_day_mode(constants.BY_WEEK)
result_ok(cl, main.get_header_buttons(day_mode = globals.day_mode) + main.get_settings_with_id(day_mode = globals.day_mode, oob = True))
return True
elif request.find('/set_by_day') == 6:
set_day_mode(constants.BY_DAY)
result_ok(cl, main.get_header_buttons(day_mode = globals.day_mode) + main.get_settings_with_id(day_mode = globals.day_mode, oob = True))
return True
return False
def check_by_week_endpoints(cl, request):
if request.find('/add_by_week') == 6:
globals.by_week_settings.append(Setting(Time(10,0), 22))
result_ok(cl, main.get_byweek_settings_content())
return True
def set_day_mode(mode):
global day_mode_filename
if mode == constants.BY_WEEK:
globals.day_mode = constants.BY_WEEK
elif mode == constants.BY_DAY:
globals.day_mode = constants.BY_DAY
else:
return
with open(day_mode_filename, "w") as f:
value = "byday" if mode == constants.BY_DAY else "byweek"
print("Setting day mode to " + value)
f.write(value)
f.close()
# Listen for connections
while True:
cl, addr = s.accept()
try:
print('client connected from', addr)
request = cl.recv(1024)
print(request)
request = str(request)
if request.find('/ ') == 6:
response = layout.html % main.get_main(day_mode = globals.day_mode)
result_ok(cl, response)
elif request.find('/light/on') == 6:
print("led on")
led.value(1)
response = layout.html % main.get_main(day_mode = globals.day_mode)
result_ok(cl, response)
elif request.find('/light/off') == 6:
print("led off")
led.value(0)
response = layout.html % main.get_main(day_mode = globals.day_mode)
result_ok(cl, response)
elif request.find('/exit') == 6:
print("exiting")
blink_onboard_led(5)
s.close()
break
elif check_header_button_endpoints(cl, request):
pass
elif check_by_week_endpoints(cl, request):
pass
else:
result_notfound(cl)
except OSError as e:
cl.close()
print('connection closed')