Multiprocessing with alarm

Viewed 253

I've been working on a personal assistant in python for a long time now and I've come across a problem that I can't solve.

I want to add a reminder.

I want to combine the alarm code and assistant code in two different loops.

When I set the alarm timer I want to do the other input tasks until the timer runs out.

How can I do that? Thanks.

I've tried this code, but it doesn't work because I only have one loop:

import datetime
import os
import time
import random

def assistant():
    command = input('command: ')
    if command == '1':
        print('is it one')
    elif command == '2':
        print('is it two')
    elif command == 'alarm':
        import datetime

        def check_alarm_input(alarm_time):
            if len(alarm_time) == 1: # [Hour] Format
                if alarm_time[0] < 24 and alarm_time[0] >= 0:
                    return True
            if len(alarm_time) == 2: # [Hour:Minute] Format
                if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
                    alarm_time[1] < 60 and alarm_time[1] >= 0:
                    return True
            elif len(alarm_time) == 3: # [Hour:Minute:Second] Format
                if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
                    alarm_time[1] < 60 and alarm_time[1] >= 0 and \
                    alarm_time[2] < 60 and alarm_time[2] >= 0:
                    return True
            return False

        # Get user input for the alarm time
        print("Set a time for the alarm (Ex. 06:30 or 18:30:00)")

        while True:
            alarm_input = input(">> ")
            try:
                alarm_time = [int(n) for n in alarm_input.split(":")]
                if check_alarm_input(alarm_time):
                    break
                else:
                    raise ValueError
            except ValueError:
                print("ERROR: Enter time in HH:MM or HH:MM:SS format")

        # Convert the alarm time from [H:M] or [H:M:S] to seconds
        seconds_hms = [3600, 60, 1] # Number of seconds in an Hour, Minute, and Second
        alarm_seconds = sum([a*b for a,b in zip(seconds_hms[:len(alarm_time)], alarm_time)])

        # Get the current time of day in seconds
        now = datetime.datetime.now()
        current_time_seconds = sum([a*b for a,b in zip(seconds_hms, [now.hour, now.minute, now.second])])

        # Calculate the number of seconds until alarm goes off
        time_diff_seconds = alarm_seconds - current_time_seconds

        # If time difference is negative, set alarm for next day
        if time_diff_seconds < 0:
            time_diff_seconds += 86400 # number of seconds in a day

        # Display the amount of time until the alarm goes off
        print("Alarm set to go off in %s" % datetime.timedelta(seconds=time_diff_seconds))

        # Sleep until the alarm goes off
        time.sleep(time_diff_seconds)

        # Time for the alarm to go off
        print("Wake Up!")

while True:
    assistant()

1.Reminder code:

import datetime
import os
import time
import random

def check_alarm_input(alarm_time):
    """Checks to see if the user has entered in a valid alarm time"""
    if len(alarm_time) == 1: # [Hour] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0:
            return True
    if len(alarm_time) == 2: # [Hour:Minute] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
           alarm_time[1] < 60 and alarm_time[1] >= 0:
            return True
    elif len(alarm_time) == 3: # [Hour:Minute:Second] Format
        if alarm_time[0] < 24 and alarm_time[0] >= 0 and \
           alarm_time[1] < 60 and alarm_time[1] >= 0 and \
           alarm_time[2] < 60 and alarm_time[2] >= 0:
            return True
    return False

# Get user input for the alarm time
print("Set a time for the alarm (Ex. 06:30 or 18:30:00)")
while True:
    alarm_input = input(">> ")
    try:
        alarm_time = [int(n) for n in alarm_input.split(":")]
        if check_alarm_input(alarm_time):
            break
        else:
            raise ValueError
    except ValueError:
        print("ERROR: Enter time in HH:MM or HH:MM:SS format")

# Convert the alarm time from [H:M] or [H:M:S] to seconds
seconds_hms = [3600, 60, 1] # Number of seconds in an Hour, Minute, and Second
alarm_seconds = sum([a*b for a,b in zip(seconds_hms[:len(alarm_time)], alarm_time)])

# Get the current time of day in seconds
now = datetime.datetime.now()
current_time_seconds = sum([a*b for a,b in zip(seconds_hms, [now.hour, now.minute, now.second])])

# Calculate the number of seconds until alarm goes off
time_diff_seconds = alarm_seconds - current_time_seconds

# If time difference is negative, set alarm for next day
if time_diff_seconds < 0:
    time_diff_seconds += 86400 # number of seconds in a day

# Display the amount of time until the alarm goes off
print("Alarm set to go off in %s" % datetime.timedelta(seconds=time_diff_seconds))

# Sleep until the alarm goes off
time.sleep(time_diff_seconds)

# Time for the alarm to go off
print("Wake Up!")

2.Representative assistant code:

def assistant():
    command = input('command: ')
    if command == '1':
        print('is it one')
    elif command == '2':
        print('is it two')

while True:
    assistant()

I am planning such an output

command: 1
is it one
command: 2
is it two
command: alarm
Set a time for the alarm (Ex. 06:30 or 18:30:00)
>> 13:00
Alarm set to go off in 1:30:00
command: 1
is it one
command: 2
is it two
Wake Up!
command: 1
is it one
command: 2
is it two
0 Answers
Related