RoguedBear / 12-hour-server

a python script to put the home "server" to sleep when wifi is disconnected at night, and wake up early the next day

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

12-hour-server

Code style: black

a python script to put the home "server" to sleep when wifi is disconnected at night, and wake up early the next day

Note: This script will only run on Linux (more specifically, tested on Ubuntu/Debian). WILL NOT RUN ON WINDOWS

What does this script do?

if you have an old computer/laptop you use as your home server, but don't quite want it to run 24x7, but rather only when your internet (router) is active.

In other words:

  • Computer should go to sleep when you turn off your router
  • Computer should wake up when you turn on your internet router

This is what this program does.

How to use it?


  • Clone the repository
  • Make a file config.yaml whose contents should be same as in config[TEMPLATE].yaml:
    # wired, wireless, any: connection type you want the program to check for internet connectivity
    connection type: any
    
    # Provide time in 24hr format
    night phase:
      start time: 23:20
      end time: 23:40
      # this timeout will be used as the frequency to check internet connectivity
      timeout: 7 # seconds
    morning phase:
      start time: 8:30
      end time: 10:30
      # this timeout will be used as the frequency to check internet connectivity
      timeout: 300 # seconds
    
    # This timeout will be used to change the default timeout.
    timeout: 90
    
    # connectivity function *optional, by default uses v2
    # you probably don't even need this in your config. Refer advanced usage
    connectivity_method: 'v2' # one of 'v2', 'v3', 'v2+v3'
    
    # If this key is present, program's thread would periodically wake up, check phases again and set a backup wake timer
    # of this interval (or less).
    sleep_interval: 1800 # seconds
    
    logging level: 10 # 10 for DEBUG, 20 for INFO, 30 for WARNING, 40 for ERROR, 50 for CRITICAL logging level
    
    # Optional
    telegram:
      BOT_TOKEN: YOUR TOKEN HERE
      CHAT_ID: YOUR CHAT ID HERE
    
  • Install requirements.txt: pip install -r requirements.txt
  • Run ./smart_sleep.py from repository root. Make sure you have python3.8+
    Note: Program will run as [sudo] because the underlying command rtcwake which sets waketimers needs [sudo] to run

Viewing logs

The program creates 2 log files. one containing the normal logs (logs.log), and the other containing the ANSI color codes (logs_color.log) If you want to see the logs of this program by ssh-ing into the server computer, then there are 2 ways for that:

  1. [To view logs with color] less -R +F Path_to_repository_root/logs/logs_color.log
  2. [To view plain logs without color] tail -f Path_to_repository_root/logs/logs.log

Reporting Issues:

I haven't polished the program and fixed every bug because i needed this script to be made fast according to my needs. If you encounter any bugs, feel free to open an issue or a pull request.

Disclaimer to *Potential* Contributors: This script is unnecessarily long and i apologise for that

Advanced Usage

Connectivity methods

up until release v1.1.0-lw, the program used a method called check_connected_to_internetV2. This is the v2 method which checks for internet connectivity by polling carrier & operstate in directory /sys/class/<your network device name>/

Since i moved onto a complex network setup involving a secondary router that acts as a DHCP relay, operstate & carrier both showed up/1 as their output. even if the main router was down and the device had no IP address assigned to it.

So to make the script work, the v3 method (check_connected_to_internetV3), now pings the default gateway to check if main router is still up or not.

You'd be fine with using connectivity_method as v2 as long as the device connects to the main router. Or, you can switch to using the ping method by setting connectivity_method to v3 if you want that. at the time of writing, haven't put the ping method to much irl use and the v2 method works just as fine.

update: 6 months in running the script on a daily basis, v3 works flawlessly. so you can use any.

Known issue:

  • the timings are right, but the date could be off. since im using timedelta instead of time or datetime. too far into the project, not gonna bother changing it until i get an issue or pull request about it ¯_(ツ)_/¯

About

a python script to put the home "server" to sleep when wifi is disconnected at night, and wake up early the next day

License:GNU General Public License v3.0


Languages

Language:Python 100.0%