.. Always edit README.tpl.md and create README.md by running python -m i3pystatus.mkdocs You can also let the maintainer do the latter :) i3pystatus ========== i3pystatus is a (hopefully growing) collection of python scripts for status output compatible to i3status / i3bar of the i3 window manager. Installation ------------ Note: i3pystatus requires Python 3.2 or newer and is not compatible with Python 2.x. From PyPI package `i3pystatus `_ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ :: pip install i3pystatus Packages for your OS ++++++++++++++++++++ * `Arch Linux `_ Release Notes ------------- 3.28 (not released yet) +++++++++++++++++++++++ * **If you're currently using the ``i3pystatus`` command to run your i3bar**: Replace ``i3pystatus`` command in your i3 configuration with ``python ~/path/to/your/config.py`` * New options for `mem`_ (thanks Arvedui) * Added `cpu\_usage`_ * Improved error handling * Removed ``i3pystatus`` binary * pulseaudio: changed context name to "i3pystatus_pulseaudio" * Code changes * Do not name your script i3pystatus.py or it will break imports. 3.27 ++++ * Add weather module * Add text module * PulseAudio module: Add muted/unmuted options 3.26 ++++ * Add mem module 3.24 ++++ **This release introduced changes that may require manual changes to your configuration file** * Introduced TimeWrapper * battery module: removed remaining\_* formatters in favor of TimeWrapper, as it can not only reproduce all the variants removed, but can do much more. * mpd: Uses TimeWrapper for song_length, song_elapsed Configuration ------------- The config file is just a normal Python script. A simple configuration file could look like this (note the additional dependencies from network, wireless and pulseaudio in this example): :: # -*- coding: utf-8 -*- import subprocess from i3pystatus import Status status = Status(standalone=True) # Displays clock like this: # Tue 30 Jul 11:59:46 PM KW31 # ^-- calendar week status.register("clock", format="%a %-d %b %X KW%V",) # Shows the average load of the last minute and the last 5 minutes # (the default value for format is used) status.register("load") # Shows your CPU temperature, if you have a Intel CPU status.register("temp", format="{temp:.0f}°C",) # The battery monitor has many formatting options, see README for details # This would look like this, when discharging (or charging) # ↓14.22W 56.15% [77.81%] 2h:41m # And like this if full: # =14.22W 100.0% [91.21%] # # This would also display a desktop notification (via dbus) if the percentage # goes below 5 percent while discharging. The block will also color RED. status.register("battery", format="{status}/{consumption:.2f}W {percentage:.2f}% [{percentage_design:.2f}%] {remaining:%E%hh:%Mm}", alert=True, alert_percentage=5, status={ "DIS": "↓", "CHR": "↑", "FULL": "=", },) # This would look like this: # Discharging 6h:51m status.register("battery", format="{status} {remaining:%E%hh:%Mm}", alert=True, alert_percentage=5, status={ "DIS": "Discharging", "CHR": "Charging", "FULL": "Bat full", },) # Displays whether a DHCP client is running status.register("runwatch", name="DHCP", path="/var/run/dhclient*.pid",) # Shows the address and up/down state of eth0. If it is up the address is shown in # green (the default value of color_up) and the CIDR-address is shown # (i.e. 10.10.10.42/24). # If it's down just the interface name (eth0) will be displayed in red # (defaults of format_down and color_down) # # Note: the network module requires PyPI package netifaces-py3 status.register("network", interface="eth0", format_up="{v4cidr}",) # Has all the options of the normal network and adds some wireless specific things # like quality and network names. # # Note: requires both netifaces-py3 and basiciw status.register("wireless", interface="wlan0", format_up="{essid} {quality:03.0f}%",) # Shows disk usage of / # Format: # 42/128G [86G] status.register("disk", path="/", format="{used}/{total}G [{avail}G]",) # Shows pulseaudio default sink volume # # Note: requires libpulseaudio from PyPI status.register("pulseaudio", format="♪{volume}",) # Shows mpd status # Format: # Cloud connected▶Reroute to Remain status.register("mpd", format="{title}{status}{album}", status={ "pause": "▷", "play": "▶", "stop": "◾", },) status.run() Also change your i3wm config to the following: :: # i3bar bar { status_command python ~/.path/to/your/config/file.py position top workspace_buttons yes } Formatting ++++++++++ All modules let you specifiy the exact output formatting using a `format string (callable, file) * Where `name` is a valid identifier, which is used in the format string to access the value of that component. * `callable` is some callable to convert the contents of `file`. A common choice is float or int. * `file` names a file, relative to `base_path`. transforms is a optional dict of callables taking a single argument (a dictionary containing the values of all components). The return value is bound to the key. Settings: :format: (required) :components: (required) :transforms: (default: ``{}``) :base_path: (default: ``/``) :color: (default: ``#FFFFFF``) :interval: (default: ``5``) load ++++ Shows system load Settings: :format: format string used for output. {avg1}, {avg5} and {avg15} are the load average of the last one, five and fifteen minutes, respectively. {tasks} is the number of tasks (i.e. 1/285, which indiciates that one out of 285 total tasks is runnable). (default: ``{avg1} {avg5}``) :interval: (default: ``5``) mail ++++ Generic mail checker The `backends` setting determines the backends to use. Settings: :backends: List of backends (instances of `i3pystatus.mail.xxx.zzz`) :color: (default: ``#ffffff``) :color_unread: (default: ``#ff0000``) :format: (default: ``{unread} new email``) :format_plural: (default: ``{unread} new emails``) :hide_if_null: Don't output anything if there are no new mails (default: ``True``) :interval: (default: ``5``) imap.IMAP ~~~~~~~~~ Checks for mail on a IMAP server Settings: :host: (required) :port: (default: ``993``) :username: (required) :password: (required) :ssl: (default: ``True``) :mailbox: (default: ``INBOX``) mbox.MboxMail ~~~~~~~~~~~~~ Checks for local mail in mbox Settings: notmuchmail.Notmuch ~~~~~~~~~~~~~~~~~~~ This class uses the notmuch python bindings to check for the number of messages in the notmuch database with the tags "inbox" and "unread" Settings: :db_path: (required) thunderbird.Thunderbird ~~~~~~~~~~~~~~~~~~~~~~~ This class listens for dbus signals emitted by the dbus-sender extension for thunderbird. Requires python-dbus Settings: mem +++ Shows memory load Available formatters: * {avail_mem} * {percent_used_mem} * {used_mem} * {total_mem} Requires psutil (from PyPI) Settings: :format: format string used for output. (default: ``{avail_mem} MiB``) :divisor: divide all byte values by this value, default 1024**2(mebibytes (default: ``1048576``) :warn_percentage: minimal percentage for warn state (default: ``50``) :alert_percentage: minimal percentage for alert state (default: ``80``) :color: standard color (default: ``#00FF00``) :warn_color: defines the color used wann warn percentage ist exceeded (default: ``#FFFF00``) :alert_color: defines the color used when alert percentage is exceeded (default: ``#FF0000``) :interval: (default: ``5``) modsde ++++++ This class returns i3status parsable output of the number of unread posts in any bookmark in the mods.de forums. Settings: :format: Use {unread} as the formatter for number of unread posts (default: ``{unread} new posts in bookmarks``) :offset: subtract number of posts before output (default: ``0``) :color: (default: ``#7181fe``) :username: (required) :password: (required) :interval: (default: ``5``) mpd +++ Displays various information from MPD (the music player daemon) Available formatters (uses `formatp`_) * `{title}` — (the title of the current song) * `{album}` — (the album of the current song, can be an empty string (e.g. for online streams)) * `{artist}` — (can be empty, too) * `{song_elapsed}` — (Position in the currently playing song, uses `TimeWrapper`_, default is `%m:%S`) * `{song_length}` — (Length of the current song, same as song_elapsed) * `{pos}` — (Position of current song in playlist, one-based) * `{len}` — (Songs in playlist) * `{status}` — (play, pause, stop mapped through the `status` dictionary) * `{bitrate}` — (Current bitrate in kilobit/s) * `{volume}` — (Volume set in MPD) Left click on the module play/pauses, right click (un)mutes. Settings: :host: (default: ``localhost``) :port: MPD port (default: ``6600``) :format: formatp string (default: ``{title} {status}``) :status: Dictionary mapping pause, play and stop to output (default: ``{'stop': '◾', 'pause': '▷', 'play': '▶'}``) :interval: (default: ``1``) network +++++++ Display network information about a interface. Requires the PyPI package `netifaces-py3`. Available formatters: * `{interface}` — same as setting * `{name}` — same as setting * `{v4}` — IPv4 address * `{v4mask}` — subnet mask * `{v4cidr}` — IPv4 address in cidr notation (i.e. 192.168.2.204/24) * `{v6}` — IPv6 address * `{v6mask}` — subnet mask * `{v6cidr}` — IPv6 address in cidr notation * `{mac}` — MAC of interface Not available addresses (i.e. no IPv6 connectivity) are replaced with empty strings. Settings: :interface: Interface to obtain information for (default: ``eth0``) :format_up: (default: ``{interface}: {v4}``) :color_up: (default: ``#00FF00``) :format_down: (default: ``{interface}``) :color_down: (default: ``#FF0000``) :detached_down: If the interface doesn't exist, display it as if it were down (default: ``False``) :name: (default: ``eth0``) :interval: (default: ``5``) parcel ++++++ Settings: :instance: Tracker instance :format: (default: ``{name}:{progress}``) :name: :interval: (default: ``20``) pulseaudio ++++++++++ Shows volume of default PulseAudio sink (output). Available formatters: * `{volume}` — volume in percent (0...100) * `{db}` — volume in decibels relative to 100 %, i.e. 100 % = 0 dB, 50 % = -18 dB, 0 % = -infinity dB (the literal value for -infinity is `-∞`) * `{muted}` — the value of one of the `muted` or `unmuted` settings Settings: :format: (default: ``♪: {volume}``) :muted: (default: ``M``) :unmuted: (default: ````) pyload ++++++ Shows pyLoad status Available formatters: * `{captcha}` (see captcha_true and captcha_false, which are the values filled in for this formatter) * `{progress}` (average over all running downloads) * `{progress_all}` (percentage of completed files/links in queue) * `{speed}` (kilobytes/s) * `{download}` (downloads enabled, also see download_true and download_false) * `{total}` (number of downloads) * `{free_space}` (free space in download directory in gigabytes) Settings: :address: Address of pyLoad webinterface (default: ``http://127.0.0.1:8000``) :format: (default: ``{captcha} {progress_all:.1f}% {speed:.1f} kb/s``) :captcha_true: (default: ``Captcha waiting``) :captcha_false: (default: ````) :download_true: (default: ``Downloads enabled``) :download_false: (default: ``Downloads disabled``) :username: (required) :password: (required) :interval: (default: ``5``) regex +++++ Simple regex file watcher The groups of the regex are passed to the format string as positional arguments. Settings: :format: format string used for output (default: ``{0}``) :regex: (required) :file: file to search for regex matches :flags: Python.re flags (default: ``0``) :interval: (default: ``5``) runwatch ++++++++ Expands the given path using glob to a pidfile and checks if the process ID found inside is valid (that is, if the process is running). You can use this to check if a specific application, such as a VPN client or your DHCP client is running. Available formatters are {pid} and {name}. Settings: :format_up: (default: ``{name}``) :format_down: (default: ``{name}``) :color_up: (default: ``#00FF00``) :color_down: (default: ``#FF0000``) :path: (required) :name: (required) :interval: (default: ``5``) temp ++++ Shows CPU temperature of Intel processors AMD is currently not supported as they can only report a relative temperature, which is pretty useless Settings: :format: format string used for output. {temp} is the temperature in degrees celsius, {critical} and {high} are the trip point temps. (default: ``{temp} °C``) :color: (default: ``#FFFFFF``) :color_critical: (default: ``#FF0000``) :high_factor: (default: ``0.7``) :interval: (default: ``5``) text ++++ Display static, colored text. Settings: :text: (required) :color: HTML color code #RRGGBB (default: ``None``) weather +++++++ This module gets the weather from weather.com using pywapi module First, you need to get the code for the location from the www.weather.com Available formatters: * {current_temp} * {humidity} Requires pywapi from PyPI. Settings: :location_code: (required) :units: Celsius (metric) or Fahrenheit (imperial) (default: ``metric``) :format: (default: ``{current_temp}``) :interval: (default: ``20``) wireless ++++++++ Display network information about a interface. Requires the PyPI packages `netifaces-py3` and `basiciw`. This is based on the network module, so all options and formatters are the same, except for these additional formatters and that detached_down doesn't work. * `{essid}` — ESSID of currently connected wifi * `{freq}` — Current frequency * `{quality}` — Link quality in percent Settings: :interface: Interface to obtain information for (default: ``wlan0``) :format_up: (default: ``{interface}: {v4}``) :color_up: (default: ``#00FF00``) :format_down: (default: ``{interface}``) :color_down: (default: ``#FF0000``) :detached_down: If the interface doesn't exist, display it as if it were down (default: ``False``) :name: (default: ``eth0``) :interval: (default: ``5``) Contribute ---------- To contribute a module, make sure it uses one of the Module classes. Most modules use IntervalModule, which just calls a function repeatedly in a specified interval. The output attribute should be set to a dictionary which represents your modules output, the protocol is documented `here `_. **Patches and pull requests are very welcome :-)**