Deskami桌上的一个小伙伴

导出格式

导出属于 Deskami Plus,写出的就是 Deskami 在你的 Mac 上保存的那份逐分钟记录。不添加、不估算、不补全任何东西。这个页面说明文件里有什么。

约定

  • CSV 里的空单元格,或 JSON 里的 null,表示没测到。0 表示测了,结果是零。
  • 列名在所有语言里都是英文,而且固定不变;只有在 export_version 更新时才会一起变。
  • 文件是 UTF-8 编码。CSV 用逗号分隔,第一行是表头。
  • 时间是 ISO 8601 格式的 UTC,比如 2026-09-28T07:41:00Z。日期是 YYYY-MM-DD,即这一分钟被记在哪一天。
  • 小数用英文句点,从不用千位分隔符。布尔值是 true 和 false。
  • Deskami 有记录的每一分钟各占一行;什么都没记的分钟就没有行。

分钟列

CSV 按下面的顺序包含这些列;在 JSON 里,同样的字段组成每一分钟。括号里的名字是原始数据库文件里的列名。

  • minute_utc — 时间。这一分钟的开始,UTC。(minute_utc,Unix 秒)
  • local_day — 日期。这一分钟所属的那一天,按当时 Mac 所在的时区算。写入时就定下来,之后改时区也不会挪动。(day_key)
  • setup_id — 整数。当时用的使用环境:一个摄像头加一种显示器布局。在 JSON 里,使用环境列在 setups 下。(profile_id)
  • seconds_at_desk — 0 到 60。这一分钟里摄像头看到你的秒数。camera_off 为 false 时,0 表示摄像头开着但没看到你。(present_s)
  • posture_deviation — 数值,0 或更大。你的头和肩比你自己的基准低了多少,取这一分钟的平均,并以当时生效的提示阈值为单位:在基准处为 0,在阈值处为 1。没测姿势时为空。(posture_dev)
  • posture_peak — 数值,0 或更大。同一个量在这一分钟里的最大值。(posture_peak)
  • distance_deviation — 数值,0 或更大。你的脸比基准时离屏幕近了多少,用同样的刻度,从画面里两眼的间距读出。(distance_dev)
  • blinks — 整数。眼睛能被测量时数到的眨眼次数。测不了时为空。(blinks)
  • incomplete_blinks — 整数。闭得最紧的那一刻也离完全闭合差得太远的眨眼。无法判断时为空。(incomplete_blinks)
  • head_pitch_degrees — 数值。摄像头报告的头部俯仰角平均值,单位是度:相对于摄像头,而不是相对于你的基准。(head_pitch)
  • confidence — 0 到 1。人脸检测可信度的平均值。(confidence)
  • light — 0 到 1。脸部区域的平均亮度,0 为暗,1 为亮。不是房间的亮度。(light)
  • eyes_measured — 布尔值。这一分钟里眼睛至少有一次能被测量。为 false 时,blinks、incomplete_blinks 和 eye_observed_seconds 为空。(eye_valid)
  • eye_observed_seconds — 0 到 60。眼睛真正被观察到的秒数。每分钟眨眼次数是 blinks × 60 ÷ eye_observed_seconds。(eye_observed_s)
  • look_aways — 整数。完整看了一次远处的次数,也就是 20-20-20 习惯。没在测量看远处时为空。(gaze_breaks)
  • camera_off — 布尔值。这一分钟摄像头是关着的:你关掉了它、别的应用占着它,或者权限被收回了。这时摄像头相关的列为空;应用和活动相关的列可能仍有数据。(camera_off)
  • declared_break — 布尔值。你告诉过 Deskami 你在休息。不管摄像头看到什么,这一分钟都算作不在桌前。(declared_break)
  • front_app — 文本。这一分钟里大部分时间在前台的应用的包标识符,比如 com.apple.Safari。这项读数被关掉、屏幕锁定或前台什么都没有时为空。从不包含窗口标题。(app_id)
  • app_switches — 整数。这一分钟里前台应用换了几次。(app_switches)
  • active_seconds — 0 到 60。在之前 15 秒内碰过键盘或鼠标的秒数。只读取距上一次操作过了多久,从不读取按了哪个键。这项读数被关掉时为空。(active_s)
  • call_seconds — 0 到 60。通话应用在前台,或者同一个应用同时开着麦克风和扬声器的秒数。没测量时为空,包括 Deskami 开始测量这一项之前记下的每一分钟。(meeting_s)

JSON

JSON 文件是一个对象。开头是一段文件头:export_version、app_version、exported_at、time_zone(导出时的时区)、database_schema_version、range(kind、from、to)和 setups(id、camera_name、created_at)。

接着是 days,范围内每个有记录的日子一个对象。每一天都带着自己的总结、分钟和提示:

  • local_day 和 minutes_at_desk,后者是 seconds_at_desk 的总和除以 60。
  • breaks:夹在两段在桌前的时间之间、离开桌前 5 分钟或以上且不到 2 小时的时段。摄像头关着的时间两边都不算。
  • posture_fine_minutes(posture_deviation 小于 1)和 posture_attention_minutes(1 或以上)。
  • blink_rate:在眼睛被观察到的时间里,每分钟的眨眼次数;观察不到一分钟时为 null。
  • incomplete_blink_ratio:能判断的眨眼太少时为 null。
  • reminders_by_signal:显示过的提示,按信号计数。
  • minutes:上面的分钟列,每分钟一个对象。
  • reminders:每个提示一个对象,包含 time_utc、local_day、setup_id、signal(posture、distance、blink、incompleteBlink 或 gaze)、build_up_seconds(提示之前超过阈值的时间)、recover_seconds(回到阈值以下用的时间;测量先停了则为 null)、asked(有没有显示关于你基准的问题)和 answer(没问时为 null,否则为 true 或 false)。

PDF

PDF 不是表格:它就是那份总结本身——当天总结、一周或一个月——按屏幕上的样子原样打印在一页上。里面的每个数字都是屏幕上的那个数字。

原始文件

设置 › 通用 › 数据 › 在访达中显示会找到 history.sqlite,旁边是 history.sqlite-wal 和 history.sqlite-shm。Deskami 运行时,最新的几分钟可能还在 -wal 文件里;把三个文件都复制走,或者先退出 Deskami。如果在 Deskami 运行时删掉这些文件,它会在几秒内开始一份新的空白记录。导出写出的始终是一份完整的快照。数据库里存了什么,列在隐私页面上。