Skip to content

liskin/arbtt-chart

Repository files navigation

arbtt-chart

PyPI Python Version badge PyPI Version badge License badge

Overview

Textual chart for arbtt, the automatic, rule-based time tracker.

Similar to arbtt-graph, just in plain monospace text.

demo

(The above screenshot is generated using my liskin-arbtt-stats which provides a few handy commands and combines data from multiple X sessions and Strava.)

Raw arbtt-stats output for the same time period looks something like this:

arbtt-stats

Getting started

  1. Install arbtt and make sure arbtt-capture runs in your graphical login session.

  2. Configure arbtt rules in ~/.arbtt/categorize.cfg. See Configuring the arbtt categorizer, Effective Use of Arbtt, and sample categorize.cfg for arbtt-graph.

  3. Install arbtt-chart.

  4. Try arbtt-stats --output-format=csv --each-category | arbtt-chart or arbtt-stats --output-format=csv --category=Graph | arbtt-chart

Installation

Using pipx:

pipx ensurepath
pipx install arbtt-chart

To keep a local git clone around:

git clone https://github.com/liskin/arbtt-chart
make -C arbtt-chart pipx

Alternatively, if you don't need the isolated virtualenv that pipx provides, feel free to just:

pip install arbtt-chart

Or, since the only dependency is pandas, you can just sudo apt install python3-pandas and run arbtt_chart.py directly. :-)

Usage

$ arbtt-chart --help
usage: arbtt-chart [-h] [--no-stacked] [--subtags] [--totals-re RE]

Plot charts from arbtt-stats to terminal. Expects `arbtt-stats --output-
format=csv --category=…` or `arbtt-stats --output-format=csv --each-category`
output on stdin.

options:
  -h, --help      show this help message and exit
  --no-stacked    don't stack bar chart
  --subtags       recognize subtags (separated by '-') and sort them together
  --totals-re RE  totals row regexp, default: ^\(total time\)$

Examples

single category

$ arbtt-stats --filter='$date >= 2021-03-0220:00 && $date < 2021-03-0303:00' \
>             --min-percentage=2 --category=Activity --output-format=csv \
> | arbtt-chart
Activity                                                                        
════════                                                                        
Proj-arbttⁱ          03:11:40  ███████████▓██████████▓██████████▓██▏········÷···
Chat                 00:30:20  ···········÷··········÷··········÷··█████▊···÷···
(8 entries omitted)  00:15:40  ···········÷··········÷··········÷·······▕██▊÷···
Web-Social           00:08:20  ···········÷··········÷··········÷··········▐▓▏··
Web-otherⁱ           00:06:40  ···········÷··········÷··········÷···········÷█▍·
Web-HN               00:06:20  ···········÷··········÷··········÷···········÷·▐▊
(unmatched time)     00:01:20  ···········÷··········÷··········÷···········÷··▕
                                                                                
(total time)         04:20:20  ███████████▓██████████▓██████████▓███████████▓███

single category, subtags

$ arbtt-stats --filter='$date >= 2021-03-0220:00 && $date < 2021-03-0303:00' \
>             --min-percentage=2 --category=Activity --output-format=csv \
> | arbtt-chart --subtags
Activity                                                                        
════════                                                                        
Proj                arbttⁱ  03:11:40  █████████▓█████████▓█████████▓█·······÷···
Chat                        00:30:20  ·········÷·········÷·········÷▕████▊··÷···
Web                 Social  00:08:20  ·········÷·········÷·········÷·····▕█▏÷···
                    otherⁱ  00:06:40  ·········÷·········÷·········÷·······█▏···
                    HN      00:06:20  ·········÷·········÷·········÷········▓▏··
(8 entries omitted)         00:15:40  ·········÷·········÷·········÷········÷██▋
(unmatched time)            00:01:20  ·········÷·········÷·········÷········÷··▕
                                                                                
(total time)                04:20:20  █████████▓█████████▓█████████▓████████▓███

multiple categories

$ arbtt-stats --filter='$date >= 2021-03-0220:00 && $date < 2021-03-0303:00' \
>             --min-percentage=2 --each-category --output-format=csv \
> | arbtt-chart
Activity                                                                        
════════                                                                        
Proj-arbttⁱ          03:11:40  ███████████▓██████████▓██████████▓██▏········÷···
Chat                 00:30:20  ···········÷··········÷··········÷··█████▊···÷···
(8 entries omitted)  00:15:40  ···········÷··········÷··········÷·······▕██▊÷···
Web-Social           00:08:20  ···········÷··········÷··········÷··········▐▓▏··
Web-otherⁱ           00:06:40  ···········÷··········÷··········÷···········÷█▍·
Web-HN               00:06:20  ···········÷··········÷··········÷···········÷·▐▊
(unmatched time)     00:01:20  ···········÷··········÷··········÷···········÷··▕
                                                                                
(total time)         04:20:20  ███████████▓██████████▓██████████▓███████████▓███
                                                                                
Desktop                                                                         
═══════                                                                         
4_arbtt              02:21:40  ███████████▓██████████▓███▊······÷···········÷···
6_arbtt_web          00:50:20  ···········÷··········÷···▐██████▓██·········÷···
1_irc                00:34:00  ···········÷··········÷··········÷··██████▌··÷···
2_web                00:34:00  ···········÷··········÷··········÷········▐██▓███
(1 entries omitted)  00:00:20  ···········÷··········÷··········÷···········÷··▕
                                                                                
(total time)         04:20:20  ███████████▓██████████▓██████████▓███████████▓███
                                                                                
Program                                                                         
═══════                                                                         
urxvt                02:38:00  ███████████▓██████████▓██████▊···÷···········÷···
google-chrome        01:21:40  ···········÷··········÷······▐███▓██████████▉÷···
app_element_io       00:14:40  ···········÷··········÷··········÷···········▓█▉·
(3 entries omitted)  00:06:00  ···········÷··········÷··········÷···········÷·▕█
                                                                                
(total time)         04:20:20  ███████████▓██████████▓██████████▓███████████▓███

custom inputs

$ arbtt-chart --totals-re='^\(' <<END
> Tag,Time
> Act:Work,02:30:00
> Act:Social,01:20:00
> Act:Mail,00:20:00
> Act:Movie,01:30:00
> (screen),05:40:00
> 
> Tag,Time
> Act:Sport,3600
> Act:Commute,1800
> (outside),5400
> END
Act                                                                             
═══                                                                             
Work       02:30:00  ████████▓███████▓███▋···÷·······÷········÷·······÷·······÷·
Movie      01:30:00  ········÷·······÷···▐███▓███████▉········÷·······÷·······÷·
Social     01:20:00  ········÷·······÷·······÷·······▕████████▓█▊·····÷·······÷·
Sport      01:00:00  ········÷·······÷·······÷·······÷········÷·▕█████▓██·····÷·
Commute    00:30:00  ········÷·······÷·······÷·······÷········÷·······÷··████▏÷·
Mail       00:20:00  ········÷·······÷·······÷·······÷········÷·······÷······█▓▊
                                                                                
(screen)   05:40:00  ████████▓███████▓███████▓███████▓████████▓████▊··÷·······÷·
(outside)  01:30:00  ████████▓███▍···÷·······÷·······÷········÷·······÷·······÷·

custom inputs, multiple tables at same scale

$ arbtt-chart <<END
> Tag,Time
> Screen:Work,02:30:00
> Screen:Social,01:20:00
> Screen:Mail,00:20:00
> Screen:Movie,01:30:00
> (total time),05:40:00
> 
> Tag,Time
> Outside:Sport,3600
> Outside:Commute,1800
> (total time),5400
> END
Screen                                                                          
══════                                                                          
Work          02:30:00  █████████▓█████████▓████▊····÷·········÷·········÷······
Movie         01:30:00  ·········÷·········÷····▐████▓█████████▍·········÷······
Social        01:20:00  ·········÷·········÷·········÷·········▐█████████▓██▊···
Mail          00:20:00  ·········÷·········÷·········÷·········÷·········÷··▐██▉
                                                                                
(total time)  05:40:00  █████████▓█████████▓█████████▓█████████▓█████████▓██████
                                                                                
Outside                                                                         
═══════                                                                         
Sport         01:00:00  █████████▓·········÷·········÷·········÷·········÷······
Commute       00:30:00  ·········▕████▊····÷·········÷·········÷·········÷······
                                                                                
(total time)  01:30:00  █████████▓████▉····÷·········÷·········÷·········÷······