Module lib.server.periodic
Periodic task, wifi management, get wan_ip, synchronize time
Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
# pylint:disable=consider-using-f-string
""" Periodic task, wifi management, get wan_ip, synchronize time """
import gc
import uasyncio
import server.user
import server.server
import wifi.wifi
import tools.lang
import tools.tasking
import tools.watchdog
import tools.info
import tools.system
import tools.support
import tools.topic
import tools.builddate
import tools.filesystem
if tools.support.battery():
import tools.battery
class Periodic:
""" Class to manage periodic task """
server_config = None
@staticmethod
def init():
""" Constructor """
if Periodic.server_config is None:
Periodic.server_config = server.server.ServerConfig()
Periodic.server_config.load_create()
Periodic.last_notif = None
Periodic.current_time = 0
tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG)
else:
Periodic.server_config.refresh()
@staticmethod
async def check_login():
""" Inform that login detected """
# Get login state
login = server.user.User.get_login_state()
# If login detected
if login is not None:
from server.notifier import Notifier
if login:
if Periodic.last_notif is None:
notif = True
Periodic.last_notif = Periodic.current_time
elif Periodic.last_notif + 5*60 < Periodic.current_time:
Periodic.last_notif = Periodic.current_time
notif = True
else:
notif = False
if notif:
Notifier.notify(topic=tools.topic.login, value=tools.topic.value_success, message=tools.lang.login_success_detected, display=False, enabled=Periodic.server_config.notify)
else:
Notifier.notify (topic=tools.topic.login, value=tools.topic.value_failed, message=tools.lang.login_failed_detected, display=False, enabled=Periodic.server_config.notify)
@staticmethod
async def task(**kwargs):
""" Periodic task method """
Periodic.init()
if tools.filesystem.ismicropython():
STEP = 5
else:
STEP = 1
polling_id = 0
tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG)
while True:
# Reload server config if changed
if polling_id % (2*STEP) == 0:
# Manage login user
await Periodic.check_login()
Periodic.server_config.refresh()
# Manage server
if wifi.wifi.Wifi.is_lan_connected():
tools.tasking.Tasks.start_all()
# # Reset brownout counter if wifi connected
if wifi.wifi.Wifi.is_wan_connected():
if tools.support.battery():
tools.battery.Battery.reset_brownout()
# Periodic garbage to avoid memory fragmentation
gc.collect()
if tools.filesystem.ismicropython():
# pylint:disable=no-member
gc.threshold(gc.mem_free() // 5 + gc.mem_alloc())
# Check if any problems have occurred and if a reboot is needed
if polling_id % (3600/STEP) == 0:
if tools.info.get_issues_counter() > 15:
tools.system.reboot("Reboot required, %d problems detected"%tools.info.get_issues_counter())
# Reset watch dog
tools.watchdog.WatchDog.feed()
await uasyncio.sleep(STEP)
polling_id += STEP
Periodic.current_time += STEP
@staticmethod
def start(**kwargs):
""" Start periodic treatment """
tools.logger.syslog(tools.info.sysinfo())
tools.logger.syslog("Version: %s"%(tools.strings.tostrings(tools.builddate.date)))
tools.logger.syslog("Config : %s"%kwargs)
tools.tasking.Tasks.create_monitor(Periodic.task)
Classes
class Periodic-
Class to manage periodic task
Expand source code
class Periodic: """ Class to manage periodic task """ server_config = None @staticmethod def init(): """ Constructor """ if Periodic.server_config is None: Periodic.server_config = server.server.ServerConfig() Periodic.server_config.load_create() Periodic.last_notif = None Periodic.current_time = 0 tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) else: Periodic.server_config.refresh() @staticmethod async def check_login(): """ Inform that login detected """ # Get login state login = server.user.User.get_login_state() # If login detected if login is not None: from server.notifier import Notifier if login: if Periodic.last_notif is None: notif = True Periodic.last_notif = Periodic.current_time elif Periodic.last_notif + 5*60 < Periodic.current_time: Periodic.last_notif = Periodic.current_time notif = True else: notif = False if notif: Notifier.notify(topic=tools.topic.login, value=tools.topic.value_success, message=tools.lang.login_success_detected, display=False, enabled=Periodic.server_config.notify) else: Notifier.notify (topic=tools.topic.login, value=tools.topic.value_failed, message=tools.lang.login_failed_detected, display=False, enabled=Periodic.server_config.notify) @staticmethod async def task(**kwargs): """ Periodic task method """ Periodic.init() if tools.filesystem.ismicropython(): STEP = 5 else: STEP = 1 polling_id = 0 tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) while True: # Reload server config if changed if polling_id % (2*STEP) == 0: # Manage login user await Periodic.check_login() Periodic.server_config.refresh() # Manage server if wifi.wifi.Wifi.is_lan_connected(): tools.tasking.Tasks.start_all() # # Reset brownout counter if wifi connected if wifi.wifi.Wifi.is_wan_connected(): if tools.support.battery(): tools.battery.Battery.reset_brownout() # Periodic garbage to avoid memory fragmentation gc.collect() if tools.filesystem.ismicropython(): # pylint:disable=no-member gc.threshold(gc.mem_free() // 5 + gc.mem_alloc()) # Check if any problems have occurred and if a reboot is needed if polling_id % (3600/STEP) == 0: if tools.info.get_issues_counter() > 15: tools.system.reboot("Reboot required, %d problems detected"%tools.info.get_issues_counter()) # Reset watch dog tools.watchdog.WatchDog.feed() await uasyncio.sleep(STEP) polling_id += STEP Periodic.current_time += STEP @staticmethod def start(**kwargs): """ Start periodic treatment """ tools.logger.syslog(tools.info.sysinfo()) tools.logger.syslog("Version: %s"%(tools.strings.tostrings(tools.builddate.date))) tools.logger.syslog("Config : %s"%kwargs) tools.tasking.Tasks.create_monitor(Periodic.task)Class variables
var server_config
Static methods
async def check_login()-
Inform that login detected
Expand source code
@staticmethod async def check_login(): """ Inform that login detected """ # Get login state login = server.user.User.get_login_state() # If login detected if login is not None: from server.notifier import Notifier if login: if Periodic.last_notif is None: notif = True Periodic.last_notif = Periodic.current_time elif Periodic.last_notif + 5*60 < Periodic.current_time: Periodic.last_notif = Periodic.current_time notif = True else: notif = False if notif: Notifier.notify(topic=tools.topic.login, value=tools.topic.value_success, message=tools.lang.login_success_detected, display=False, enabled=Periodic.server_config.notify) else: Notifier.notify (topic=tools.topic.login, value=tools.topic.value_failed, message=tools.lang.login_failed_detected, display=False, enabled=Periodic.server_config.notify) def init()-
Constructor
Expand source code
@staticmethod def init(): """ Constructor """ if Periodic.server_config is None: Periodic.server_config = server.server.ServerConfig() Periodic.server_config.load_create() Periodic.last_notif = None Periodic.current_time = 0 tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) else: Periodic.server_config.refresh() def start(**kwargs)-
Start periodic treatment
Expand source code
@staticmethod def start(**kwargs): """ Start periodic treatment """ tools.logger.syslog(tools.info.sysinfo()) tools.logger.syslog("Version: %s"%(tools.strings.tostrings(tools.builddate.date))) tools.logger.syslog("Config : %s"%kwargs) tools.tasking.Tasks.create_monitor(Periodic.task) async def task(**kwargs)-
Periodic task method
Expand source code
@staticmethod async def task(**kwargs): """ Periodic task method """ Periodic.init() if tools.filesystem.ismicropython(): STEP = 5 else: STEP = 1 polling_id = 0 tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) while True: # Reload server config if changed if polling_id % (2*STEP) == 0: # Manage login user await Periodic.check_login() Periodic.server_config.refresh() # Manage server if wifi.wifi.Wifi.is_lan_connected(): tools.tasking.Tasks.start_all() # # Reset brownout counter if wifi connected if wifi.wifi.Wifi.is_wan_connected(): if tools.support.battery(): tools.battery.Battery.reset_brownout() # Periodic garbage to avoid memory fragmentation gc.collect() if tools.filesystem.ismicropython(): # pylint:disable=no-member gc.threshold(gc.mem_free() // 5 + gc.mem_alloc()) # Check if any problems have occurred and if a reboot is needed if polling_id % (3600/STEP) == 0: if tools.info.get_issues_counter() > 15: tools.system.reboot("Reboot required, %d problems detected"%tools.info.get_issues_counter()) # Reset watch dog tools.watchdog.WatchDog.feed() await uasyncio.sleep(STEP) polling_id += STEP Periodic.current_time += STEP