Skip to content

Commit 205ab37

Browse files
authored
Merge pull request #17 from jedie/develop
Develop
2 parents 169597a + 7c49ab0 commit 205ab37

15 files changed

+160
-83
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Tested devices:
1313
* schedule multiple timers
1414
* OTA updates (currently without directory support)
1515
* turn the switch on/off by the web page or the device button
16+
* checkbox for each day of the week where timers are active (Currently only stored in RTC RAM!)
1617
* Reset the device by long pressing the button
1718
* supports multiple WIFI credentials
1819

@@ -28,7 +29,7 @@ The device will do this on every boot:
2829

2930
Things that will be implement in the near feature:
3031

31-
* checkbox for each day of the week where timers are active
32+
* Store 'active weekdays' in filesystem and not only in RTC RAM
3233
* timer toggle flag to reverse: power is switched off during the specified periods
3334
* display local time to UTC offset via JavaScript
3435
* recalculate UTC timestamp on the page into local time via JavaScript

helpers/reset2ota_update.py renamed to helpers/force_ota_update.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import gc
77
import sys
88

9-
import machine
10-
import utime as time
119
from rtc import update_rtc_dict
1210

1311
if __name__ == '__main__':
@@ -16,8 +14,5 @@
1614

1715
update_rtc_dict(data={'run': None}) # Save to RTC RAM for next boot
1816

19-
print('Hard reset device...')
20-
time.sleep(1)
21-
machine.reset()
22-
time.sleep(1)
17+
print('reset your device by pressing Ctrl-D to start OTA ;)')
2318
sys.exit()

helpers/reset2webserver.py renamed to helpers/force_web_server.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import gc
77
import sys
88

9-
import machine
10-
import utime as time
119
from rtc import update_rtc_dict
1210

1311
if __name__ == '__main__':
@@ -16,8 +14,5 @@
1614

1715
update_rtc_dict(data={'run': 'web-server'}) # Save to RTC RAM for next boot
1816

19-
print('Hard reset device...')
20-
time.sleep(1)
21-
machine.reset()
22-
time.sleep(1)
17+
print('reset your device by pressing Ctrl-D to start web server ;)')
2318
sys.exit()

helpers/generate_weekday_inputs.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"""
2+
dev script just for generate html for copy&paste ;)
3+
"""
4+
5+
weekday_names = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
6+
7+
for no, day in enumerate(weekday_names):
8+
print(
9+
f'<input type="checkbox" id="d{no}" name="d{no}" {{d{no}}}>'
10+
f'<label for="d{no}">{day}</label>'
11+
)

src/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@
1212
WIFI_TIMEOUT = const(20 * 1000) # 20 sec
1313

1414
POWER_TIMER_ACTIVE_KEY = 'active'
15+
POWER_TIMER_WEEKDAYS_KEY = 'days'

src/http_internals.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<fieldset><legend>Loaded sys.modules:</legend>
1616
{sys_modules}
1717
</fieldset>
18+
<fieldset><legend>Minimal modules list:</legend>
19+
{minimal_modules}
20+
</fieldset>
1821
<p>
1922
<a href="/main/menu"><button class="button">Main Menu</button></a>
2023
<a href="/internals/clear"><button class="button">Clear RTC RAM</button></a>

src/http_internals.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ async def get_show(server, reader, writer, url):
2727
'release': uname.release,
2828
'mpy_version': uname.version,
2929

30-
'sys_modules': ', '.join(sys.modules.keys())
30+
'sys_modules': ', '.join(sorted(sys.modules.keys())),
31+
'minimal_modules': ', '.join(server.minimal_modules)
3132
},
3233
content_iterator=None
3334
),

src/http_set_timer.html

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22
<form action="/set_timer/submit/">
33
<textarea name="timers" rows="6" cols="13">{timers}</textarea>
44
<p><small>(All times must be <strong>in UTC</strong>!)</small></p>
5+
<p>
6+
<input type="checkbox" id="d0" name="d0" {d0}><label for="d0">Monday</label>
7+
<input type="checkbox" id="d1" name="d1" {d1}><label for="d1">Tuesday</label>
8+
<input type="checkbox" id="d2" name="d2" {d2}><label for="d2">Wednesday</label>
9+
<input type="checkbox" id="d3" name="d3" {d3}><label for="d3">Thursday</label>
10+
<input type="checkbox" id="d4" name="d4" {d4}><label for="d4">Friday</label><br>
11+
<input type="checkbox" id="d5" name="d5" {d5}><label for="d5">Saturday</label>
12+
<input type="checkbox" id="d6" name="d6" {d6}><label for="d6">Sunday</label>
13+
</p>
514
Timer is: <select name="active">
615
<option value="on" {on_selected}>ON</option>
716
<option value="off" {off_selected}>OFF</option>

src/http_set_timer.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,27 @@ async def get_form(server, reader, writer, querystring, timers=None):
1212
del restore_timers
1313
del sys.modules['times_utils']
1414

15+
context = {
16+
'timers': timers,
17+
'on_selected': 'selected' if server.power_timer.active else '',
18+
'off_selected': '' if server.power_timer.active else 'selected',
19+
}
20+
from power_timer_schedule import get_active_days
21+
active_days = get_active_days()
22+
del get_active_days
23+
del sys.modules['power_timer_schedule']
1524
gc.collect()
16-
from template import render
1725

26+
for day_no in range(7):
27+
context['d%i' % day_no] = 'checked' if day_no in active_days else ''
28+
29+
from template import render
1830
await server.send_html_page(
1931
writer,
2032
filename='webswitch.html',
2133
content_iterator=render(
2234
filename='http_set_timer.html',
23-
context={
24-
'timers': timers,
25-
'on_selected': 'selected' if server.power_timer.active else '',
26-
'off_selected': '' if server.power_timer.active else 'selected',
27-
},
35+
context=context,
2836
content_iterator=None
2937
),
3038
)
@@ -45,25 +53,36 @@ async def get_submit(server, reader, writer, querystring):
4553
del save_timers
4654

4755
power_timer_active = get_parameters['active'] == 'on'
48-
if power_timer_active:
49-
server.power_timer.active = True
50-
else:
51-
server.power_timer.active = False
5256

5357
from rtc import update_rtc_dict
5458
update_rtc_dict(data={
55-
constants.POWER_TIMER_ACTIVE_KEY: power_timer_active
59+
constants.POWER_TIMER_ACTIVE_KEY: power_timer_active,
60+
constants.POWER_TIMER_WEEKDAYS_KEY: [
61+
no for no in range(7)
62+
if 'd%i' % no in get_parameters
63+
]
5664
})
5765
del update_rtc_dict
5866
except ValueError as e:
5967
server.message = 'Timers error: %s' % e
6068
await get_form(server, reader, writer, querystring, timers=get_parameters['timers'])
69+
return
6170

6271
del get_parameters
6372
del sys.modules['rtc']
6473
gc.collect()
6574

6675
server.message = 'Timers saved.'
76+
77+
# Update power timer:
78+
if power_timer_active:
79+
server.power_timer.active = True
80+
else:
81+
server.power_timer.active = False
82+
83+
# Force set 'today_active' by schedule_next_switch() in update_power_timer():
84+
server.power_timer.today_active = None
85+
6786
server.power_timer.schedule_next_switch()
6887

6988
del sys.modules['times_utils'] # used in schedule_next_switch

src/main.py

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,73 @@
1+
import time
12

3+
print('main.py')
4+
time.sleep(1)
25

3-
import gc
4-
import sys
5-
import time
66

7-
from button_handler import Button
8-
from pins import Pins
9-
from reset import ResetDevice
10-
from rtc import get_rtc_value, update_rtc_dict
11-
from wifi import WiFi
7+
def main():
8+
import gc
9+
gc.collect()
10+
11+
import sys
12+
sys.modules.clear()
1213

13-
print('main.py')
14+
from button_handler import Button
15+
from pins import Pins
1416

15-
time.sleep(1)
17+
from wifi import WiFi
1618

17-
sys.modules.clear()
19+
__version__ = 'v0.6.0'
1820

19-
gc.collect()
21+
# Init device button IRQ:
22+
Pins.button_pin.irq(Button().irq_handler)
2023

24+
wifi = WiFi()
25+
wifi.ensure_connection()
26+
print('wifi: %s' % wifi)
2127

22-
__version__ = 'v0.5.1'
28+
_RTC_KEY_RUN = 'run'
29+
_RUN_WEB_SERVER = 'web-server'
2330

31+
from rtc import get_rtc_value
32+
if get_rtc_value(_RTC_KEY_RUN) == _RUN_WEB_SERVER:
33+
print('start webserver')
2434

25-
# Init device button IRQ:
26-
Pins.button_pin.irq(Button().irq_handler)
35+
from rtc import update_rtc_dict
36+
update_rtc_dict(data={_RTC_KEY_RUN: None}) # run OTA client on next boot
2737

28-
wifi = WiFi()
29-
wifi.ensure_connection()
30-
print('wifi: %s' % wifi)
38+
del update_rtc_dict
39+
del get_rtc_value
40+
del sys.modules['rtc']
41+
gc.collect()
3142

32-
_RTC_KEY_RUN = 'run'
33-
_RUN_WEB_SERVER = 'web-server'
43+
from webswitch import WebServer # noqa isort:skip
44+
from watchdog import Watchdog # noqa isort:skip
45+
from power_timer import PowerTimer # noqa isort:skip
3446

47+
power_timer = PowerTimer()
48+
power_timer.schedule_next_switch()
3549

36-
if get_rtc_value(_RTC_KEY_RUN) == _RUN_WEB_SERVER:
37-
print('start webserver')
38-
update_rtc_dict(data={_RTC_KEY_RUN: None}) # run OTA client on next boot
39-
from webswitch import WebServer # noqa isort:skip
40-
from watchdog import Watchdog # noqa isort:skip
41-
from power_timer import PowerTimer # noqa isort:skip
50+
gc.collect()
51+
WebServer(
52+
power_timer=power_timer,
53+
watchdog=Watchdog(
54+
wifi=wifi,
55+
check_callback=power_timer.schedule_next_switch
56+
),
57+
version=__version__
58+
).run()
59+
else:
60+
print('start OTA')
61+
Pins.power_led.off()
62+
from rtc import update_rtc_dict
63+
update_rtc_dict(data={_RTC_KEY_RUN: _RUN_WEB_SERVER}) # run web server on next boot
64+
from ota_client import OtaUpdate
4265

43-
power_timer = PowerTimer()
44-
power_timer.schedule_next_switch()
66+
gc.collect()
67+
OtaUpdate().run()
4568

46-
gc.collect()
47-
WebServer(
48-
power_timer=power_timer,
49-
watchdog=Watchdog(
50-
wifi=wifi,
51-
check_callback=power_timer.schedule_next_switch
52-
),
53-
version=__version__
54-
).run()
55-
else:
56-
print('start OTA')
57-
Pins.power_led.off()
58-
update_rtc_dict(data={_RTC_KEY_RUN: _RUN_WEB_SERVER}) # run web server on next boot
59-
from ota_client import OtaUpdate
69+
from reset import ResetDevice
70+
ResetDevice(reason='unknown').reset()
6071

61-
gc.collect()
62-
OtaUpdate().run()
6372

64-
ResetDevice(reason='unknown').reset()
73+
main()

0 commit comments

Comments
 (0)