25. Scheduler


25.1. Overview

Agents offering the SCHEDULER service provide a way to schedule sleep/wake tasks in the future.

25.1.1. Messages

The following messages are used by the SCHEDULER service:

25.1.2. Parameters

Only parameter is required by the SCHEDULER service:

  • etc — current date/time

25.2. Sleep/wake scheduling

The Unet simulator currently does not support sleep/wake scheduling. While Unet audio supports the SCHEDULER service, it does not actually put your computer to sleep. Therefore you can experiment with creating and managing schedules on Unet audio, without worrying about your computer going to sleep. Start up Unet audio ( bin/unet audio ) and connect to its shell:

> agentsForService org.arl.unet.Services.SCHEDULER

> phy.rtc
Sun Sep 22 02:58:20 SGT 2019

> help scheduler
scheduler - access to scheduling service


- addsleep - schedule sleep and wakeup of the modem
- showsleep - shows sleep/wakeup schedule
- rmsleep - removes sleep/wakeup schedule

> help addsleep
addsleep - schedule sleep and wakeup of the modem

  addsleep 1507014548, 1507014558  // sleep from epoch 1507014548 to 1507014558
  addsleep 1507014558              // sleep immediately until 1507014548
  addsleep 10.s.later, 20.s.later  // sleep 10s later and wake up 20s later
  addsleep 20.s.later              // sleep immediately and wake up 20s later
  addsleep 20.s.later, forever     // sleep 20s later forever
  addsleep                         // sleep immediately forever

> addsleep 1.hour.later, forever
> showsleep
bbfb3b79-942c-4fba-bc37-ab9d18dabda5: Sun Sep 22 04:00:00 SGT 2019 to eternity
> rmsleep 'bbfb3b79-942c-4fba-bc37-ab9d18dabda5'
> showsleep

> addsleep 1.hour.later, 2.hours.later
> showsleep
87de2dec-db29-4b34-a93c-775bfe8c68c5: Sun Sep 22 04:02:36 SGT 2019 to Sun Sep 22 05:02:36 SGT 2019

We see that the phy agent provides the SCHEDULER service in Unet audio. We add a sleep schedule, check that it shows up, remove it, and check that it is deleted. We then add another schedule.

The addsleep , showsleep , and rmsleep commands use the AddScheduledSleepReq , GetSleepScheduleReq , and RemoveScheduledSleepReq messages to achieve their functionality. We can manually send this messages to confirm this, if we like:

> phy << new GetSleepScheduleReq()
SleepScheduleRsp:INFORM[(1 item)]
> ans.sleepSchedule
[87de2dec-db29-4b34-a93c-775bfe8c68c5: Sun Sep 22 04:02:36 SGT 2019 to Sun Sep 22 05:02:36 SGT 2019]

We can also use the web interface to manage the sleep schedule, if we like:

sleep schedule

A big advantage of working with the web interface for sleep scheduling is that the user interface displays date/time in a human readable format. On the other hand, programmatic access with messages requires times to be specified as Unix epoch time.

25.3. Epoch time

The Unix epoch is the number of seconds that have elapsed since January 1, 1970 (midnight UTC), not counting leap seconds. While computers find it easy to work with epoch time, we find it hard to interpret. So UnetStack introduces syntactic sugar such as "1.hour.later" that computes the Unix epoch time 1 hour from now:

> 1.hour.later

> 2.minutes.later

There are online calculators that’ll help you convert between Unix epoch time and human readable date/time. This works well, if you need to manually convert a few date/times, but what if you needed to do this programmatically? Java provides simple APIs to deal with date/times:

> import java.time.Instant
> Instant.now().epochSecond                           (1)
> Instant.ofEpochSecond(1569093616)                   (2)
> Instant.parse("2019-09-21T19:20:16Z").epochSecond   (3)
1 Get current epoch time.
2 Convert epoch time to human readable time in UTC.
3 Convert human readable time in UTC to epoch time.

If you want even nicer looking date/time strings, you should check out Java’s SimpleDateFormat class.

<<< [State persistence] [Shell] >>>