├── art └── screenshot.png ├── README.md └── pmlogs_to_ical.py /art/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nst/pmlogs_to_ical/master/art/screenshot.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | $ sudo pmset -g log > /tmp/pmlog.txt 2 | $ python pmlogs_to_ical.py /tmp/pmlog.txt > ~/Desktop/pmlog.ics 3 | 4 | ![Screenshot](https://github.com/nst/pmlogs_to_ical/raw/master/art/screenshot.png "Screenshot") 5 | -------------------------------------------------------------------------------- /pmlogs_to_ical.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | Create a calendar of wake-sleep sessions based on power management logs. 5 | 6 | $ sudo pmset -g log > /tmp/pmlog.txt 7 | $ python pmlogs_to_ical.py /tmp/pmlog.txt > ~/Desktop/pmlog.ics 8 | """ 9 | 10 | import sys 11 | from datetime import datetime 12 | import uuid 13 | 14 | def datetime_from_pm_line(line): 15 | 16 | parts = line.split(' ') 17 | date_string = parts[3] 18 | time_string = parts[4] 19 | am_pm_string = parts[5] 20 | 21 | s = ' '.join((date_string, time_string, am_pm_string)) 22 | # 1/2/12 12:45:02 AM 23 | 24 | return datetime.strptime(s, "%m/%d/%y %I:%M:%S %p") 25 | 26 | def formatted_datetime(dt): 27 | return dt.strftime("%Y%m%dT%H%M%S") 28 | 29 | def formatted_timedelta(td): 30 | hours = td.seconds / (60*60) 31 | minutes = (td.seconds % (60*60)) / 60 32 | seconds = td.seconds % 60 33 | return "%d:%02d:%02d" % (hours, minutes, seconds) 34 | 35 | class State: 36 | UNKNOWN, WAKE, SLEEP, READ_TIME_WAKE, READ_TIME_SLEEP = range(5) 37 | 38 | state = State.UNKNOWN 39 | event = None 40 | 41 | print "BEGIN:VCALENDAR" 42 | print "PRODID:-//pm_activity.py//seriot.ch//" 43 | print "VERSION:2.0" 44 | 45 | for line in open(sys.argv[1]): 46 | 47 | if state in (State.UNKNOWN, State.READ_TIME_SLEEP): 48 | if line.startswith(' * Domain: wake'): 49 | state = State.WAKE 50 | print "BEGIN:VEVENT" 51 | 52 | elif state in (State.UNKNOWN, State.READ_TIME_WAKE): 53 | if line.startswith(' * Domain: sleep'): 54 | state = State.SLEEP 55 | 56 | elif state == State.WAKE: 57 | if line.startswith(' - Time: '): 58 | state = State.READ_TIME_WAKE 59 | date_start = datetime_from_pm_line(line) 60 | print "UID:%s-pm_activity.py" % date_start #str(uuid.uuid4()) 61 | print "DTSTART:%s" % formatted_datetime(date_start) 62 | 63 | elif state == State.SLEEP: 64 | if line.startswith(' - Time: '): 65 | state = State.READ_TIME_SLEEP 66 | date_stop = datetime_from_pm_line(line) 67 | delta = date_stop - date_start 68 | print "SUMMARY:Session %s" % formatted_timedelta(delta) 69 | print "DTEND:%s" % formatted_datetime(date_stop) 70 | print "END:VEVENT" 71 | 72 | # end of current event 73 | if state == State.READ_TIME_WAKE: 74 | state = State.READ_TIME_SLEEP 75 | print "DTEND:%s" % formatted_datetime(datetime.now()) 76 | print "END:VEVENT" 77 | 78 | print "END:VCALENDAR" 79 | --------------------------------------------------------------------------------