Last active
February 3, 2025 18:44
-
-
Save dreness/a3cc628b83aac6618fecaaa4d0f1e9e9 to your computer and use it in GitHub Desktop.
Reconstitute the "wake requests" data from `pmset -g log` into a more digestible form
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!python3 | |
import re | |
import fileinput | |
import sys | |
import csv | |
# 2022-10-31 01:57:27 -0700 Wake Requests [*process=mDNSResponder request=Maintenance deltaSecs=7198 wakeAt=2022-10-31 03:57:25 info="upkeep wake"] [process=powerd request=TCPKATurnOff deltaSecs=316637 wakeAt=2022-11-03 17:54:44] [process=powerd request=UserWake deltaSecs=7850 wakeAt=2022-10-31 04:08:17 info="com.apple.alarm.user-visible-com.apple.CalendarNotification.EKTravelEngine.periodicRefreshTimer,14054"] | |
# 2024-01-18 18:18:15 -0800 Wake Requests [process=mDNSResponder request=Maintenance deltaSecs=2648 wakeAt=2024-01-18 19:02:23 info="DHCP lease renewal"] [*process=dasd request=SleepService deltaSecs=950 wakeAt=2024-01-18 18:34:05 info="com.apple.dasd:501:com.apple.proactive.ProactiveHarvesting.Harvest.DelayedBudgeted"] [process=powerd request=TCPKATurnOff deltaSecs=316858 wakeAt=2024-01-22 10:19:13] [process=powerd request=CSPNEvaluation deltaSecs=7253 wakeAt=2024-01-18 20:19:08] [process=powerd request=UserWake deltaSecs=8999 wakeAt=2024-01-18 20:48:15 info="com.apple.alarm.user-invisible-com.apple.acmd.alarm,294"] | |
# match a Wake Requests line; grab the time stamp and the wake reasons | |
WakeRequests = re.compile(r"^(.*?)\sWake\sRequests\s+(.*)$") | |
# match a single wake reason, which has a handful of k/v pairs | |
WakeRequest = re.compile(r"\[(.*?)\]") | |
# match a single wake reason and extract the k/v pairs | |
# note that some of the string values contain spaces and aren't quoted, so we can't | |
# split on = | |
kvs = re.compile(r""" | |
\*?process=(?P<process>.*?) | |
\s | |
request=(?P<request>.*?) | |
\s | |
deltaSecs=(?P<deltaSecs>\d+) | |
\s | |
wakeAt=(?P<wakeAt>\S*\s\S*) | |
(\sinfo=(?P<info>.*))? # <-- optional! | |
""", | |
re.VERBOSE) | |
def process(line): | |
m1 = re.match(WakeRequests, line) | |
# if there is insufficient group match, skip to the next line | |
if not m1 or len(m1.groups()) < 2: | |
return | |
log_time = m1.group(1) | |
wrequests = m1.group(2) | |
# [process=mDNSResponder request=Maintenance deltaSecs=7198 wakeAt=2022-11-06 09:05:21 info=upkeep wake] [process=powerd request=TCPKATurnOff deltaSecs=294258 wakeAt=2022-11-09 16:49:41] [*process=powerd request=UserWake deltaSecs=2905 wakeAt=2022-11-06 07:53:48 info=com.apple.alarm.user-visible-Weekly Usage Report,71182] | |
# [process=mDNSResponder request=Maintenance deltaSecs=2516 wakeAt=2024-01-18 19:02:38 info="DHCP lease renewal"] [*process=dasd request=SleepService deltaSecs=1045 wakeAt=2024-01-18 18:38:07 info="com.apple.dasd:501:com.apple.chronod.nextScheduledTimelineRefresh"] [process=powerd request=TCPKATurnOff deltaSecs=316712 wakeAt=2024-01-22 10:19:13] [process=powerd request=CSPNEvaluation deltaSecs=7107 wakeAt=2024-01-18 20:19:08] [process=powerd request=UserWake deltaSecs=8853 wakeAt=2024-01-18 20:48:15 info="com.apple.alarm.user-invisible-com.apple.acmd.alarm,294"] | |
m2 = re.findall(WakeRequest, wrequests) | |
for r in m2: | |
#print(f"r in m2: {r}") | |
m3 = re.match(kvs, r) | |
#print(f"m3: {m3}") | |
logLine = [ | |
log_time, | |
m3.group('info') or '', | |
m3.group('process'), | |
m3.group('request'), | |
m3.group('deltaSecs'), | |
m3.group('wakeAt') or '' | |
] | |
# replace any commas with spaces | |
logLine = [s.replace(',', ' ') for s in logLine] | |
# print(logLine) | |
csvOut.writerow(logLine) | |
f = open('wake_reasons.csv', 'w+') | |
csvOut = csv.writer(f, delimiter=',', | |
quotechar='|', quoting=csv.QUOTE_MINIMAL) | |
csvOut.writerow(['logTime', 'info', 'process', 'request', 'deltaSecs', 'wakeAt']) | |
for line in fileinput.input(encoding="utf-8"): | |
process(line) | |
f.close() |
Author
dreness
commented
Nov 6, 2022
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment