When's the best time to visit the DMV? Never. Fair enough, so when's the second best time to visit the DMV?
That's the question I pondered yesterday, as I had an errand to run that required just such a visit.
I was pleased to learn that Virginia shows the wait times for their DMV locations. For example:
After an hour of hitting refresh on that page I realized that I needed a better solution. Looking at the source of the page, I see that the data is just a simple curl call away:
$ curl -s https://www.dmv.virginia.gov/data/api/v2/csc/182 | jq . | head -5
{
"unitId": "223",
"parentUnitId": "16",
"workingHoursId": "231",
"parentunitName": "FFX North District",
Using jq I was able to put together this Unix one-liner:
$ while true ; do date ; curl -s 'https://www.dmv.virginia.gov/data/api/v2/csc/5' | \
jq -r '.webWaitTimes | .[] | .estimatedWaitTime + " | " + .peopleWaiting + " | " + .serviceName' ; \
sleep 5m ; done
Thu, Jul 12, 2018 10:02:59 AM
0:35:29 | 8 | Original Driver's License/ID Card (without testing)
0:20:24 | 1 | Learner’s Permit and All Testing
0:28:21 | 2 | Driver’s License and Vehicle Combination Transactions
0:03:06 | 1 | * Replacement/Renewal of Driver’s License or ID Card, and Address Change
0:21:53 | 0 | * Reinstate Driving Privilege
0:12:34 | 2 | * Vehicle Registration Transactions, Registration Renewal, Disabled Parking Placards, Surrender Plates, Permits, and Record Requests
0:31:29 | 2 | All Title Transactions
0:21:53 | 0 | Motor Carrier
0:21:53 | 0 | Other Government Services: Vital Records, Hunting and Fishing Licenses, Boat Titles and Registration and More
This was a vast improvement over hitting refresh on a web page. Though I was curious if I could enhance this further to show the wait time trend. For that, I wrote a proper shell script. The script is below, but here's a screenshot of it in action:
I was able to annotate the wait time and number of people in line with either ^, v or = depending on whether the value is increasing, decreasing or holding steady. I didn't graph the data, but that would have been my next move.
At 3pm Shira called me to see if I'd been to the DMV yet. I asked, did I really need to go today? In a couple of days I'd have the data I needed to truly optimize what time I visited. Her response: Just. Go. Now. I did and after a mere 21 minutes of waiting, I took care of my required transaction.
This experience was a reminder that data is hiding in the most unsuspecting places. I'm not sure what I can do with this wait time information, but it seems like I should be hording it and analyzing it to tell me some greater truth.
Here's the full source code to my shell script. Hopefully you'll never need it.
#!/bin/bash
##
## What's the wait time on the DMV?
##
DATA_URL=https://www.dmv.virginia.gov/data/api/v2/csc/5
LAST_DATA=/tmp/$$.last
NOW_DATA=/tmp/$$.now
SLEEP_BETWEEN_RUNS=5m
flatten() {
jq -r '.webWaitTimes | .[] | .estimatedWaitTime + " | " + .peopleWaiting + " | " + .serviceName' |
sed 's/[*]/-/'
}
trend() {
now=$(echo $1 | tr -d :)
last=$(echo $2 | tr -d :)
if [ "$now" -eq "$last" ] ; then
echo "="
elif [ "$now" -gt "$last" ] ; then
echo "^"
else [ "$now" -lt "$last" ]
echo "v"
fi
}
curl -s $DATA_URL | flatten > $NOW_DATA
while true ; do
mv $NOW_DATA $LAST_DATA
curl -s $DATA_URL | flatten > $NOW_DATA
lines=$(cat $NOW_DATA | wc -l | cut -f 1 -d ' ')
echo
date
for i in $(seq 1 $lines) ; do
now_line=$(sed -n "${i}p" $NOW_DATA)
last_line=$(sed -n "${i}p" $LAST_DATA)
service=$(echo $now_line | cut -f 3 -d '|')
now_wait=$(echo $now_line | cut -f 1 -d '|')
last_wait=$(echo $last_line | cut -f 1 -d '|')
sym_wait=$(trend $now_wait $last_wait)
now_people=$(echo $now_line | cut -f 2 -d '|')
last_people=$(echo $last_line | cut -f 2 -d '|')
sym_people=$(trend $now_people $last_people)
printf "%s%s | %s%2s | %s\n" \
$sym_wait $now_wait \
$sym_people $now_people \
"$service"
done
sleep $SLEEP_BETWEEN_RUNS
done
And a post about the DMV wouldn't be complete without at least one pic of someone doing what the DMV does best: making us wait.
No comments:
Post a Comment