/ambient

What can a public hotspot tell you?

Primary LanguageShellThe UnlicenseUnlicense

ambient

This is a script which captures ambient information available on certain public networks, such as the route, speed and delay information available on:

  • German ICE trains
  • Eurostar
  • Austrian RailJet trains

If you spot a network with some tidbits of information available, please open a PR to add it!

Requirements

The set of dependencies is intentionally kept small:

  • fish (the shell)
  • iw (to check what network you're on)
  • jq
  • The POSIX standard tools, such as grep and sed (On macOS, you'll need to install the GNU coreutils with brew install coreutils)

Usage

If you just run ambient on its own, it'll output all the data it can find in KEY=VALUE format, such that it can be given to env.

As a convenience, running eg. ambient myscript.py will run the given command with all of this data in the environment.

Example output (abbreviated):

$ ./ambient
AMBIENT_DE_ICE_SPEED=158
AMBIENT_DE_ICE_SPEED_UNIT=km/h
AMBIENT_DE_ICE_TZN=Tz4652
AMBIENT_DE_ICE_SERIES=406
AMBIENT_DE_ICE_WAGON_CLASS=SECOND
AMBIENT_DE_ICE_TRAIN_TYPE=ICE
AMBIENT_DE_ICE_TRIP_DATE=2020-01-02
AMBIENT_DE_ICE_VZN=14
AMBIENT_DE_ICE_STOP_FIRST=Frankfurt (Main) Hbf
AMBIENT_DE_ICE_STOP_FIRST_DEPART_SCHEDULED=2020-01-02T13:29:00Z
AMBIENT_DE_ICE_STOP_FIRST_DEPART_ACTUAL=2020-01-02T13:54:00Z
AMBIENT_DE_ICE_STOP_FIRST_DEPART_DELAY=+25
AMBIENT_DE_ICE_STOP_LAST=Bruxelles Midi
AMBIENT_DE_ICE_STOP_LAST_ARRIVE_SCHEDULED=2020-01-02T16:35:00Z
AMBIENT_DE_ICE_STOP_LAST_ARRIVE_ACTUAL=2020-01-02T17:32:00Z
AMBIENT_DE_ICE_STOP_LAST_ARRIVE_DELAY=+57
AMBIENT_DE_ICE_STOP_NEXT=Bruxelles-Nord
AMBIENT_DE_ICE_STOP_NEXT_DEPART_SCHEDULED=2020-01-02T16:28:00Z
AMBIENT_DE_ICE_STOP_NEXT_DEPART_ACTUAL=2020-01-02T17:25:00Z
AMBIENT_DE_ICE_STOP_NEXT_DEPART_DELAY=+57
AMBIENT_DE_ICE_STOP_NEXT_ARRIVE_SCHEDULED=2020-01-02T16:26:00Z
AMBIENT_DE_ICE_STOP_NEXT_ARRIVE_ACTUAL=2020-01-02T17:23:00Z
AMBIENT_DE_ICE_STOP_NEXT_ARRIVE_DELAY=+57

Running ambient-widgets will run the built-in widget scripts (WIP, uses Font Awesome):

$ ./ambient-widgets
 Bruxelles-Nord
 ICE-14
 219 km/h

Status bar usage

Do you want to see how late your current train is, from the comfort of your status bar? Look no further!

i3status-rs

[[block]]
block = "custom"
command = "/path/to/ambient/ambient-widgets | tr '\n' ' '"
interval = 120
hide_when_empty = true

awesomewm (+ vicious)

Create a custom widget which calls the widget script, and replace all newlines with spaces.

myambien = wibox.widget.textbox()
vicious.register(myambien, function(format, warg)
    local f = io.popen("echo -n ' '; " .. os.getenv("HOME") .. "/path/to/ambient/ambient-widgets")
    local out = f:read("*all")
    f:close()
    return { out:gsub('\n', ' ') }
end, "$1", 31)

Remember to add it to your wibox list! Search for mytextclock with a default configuration.

BitBar

Link bitbar/ambient.60s.sh into your BitBar plugin directory.

ln -s $(pwd)/bitbar/ambient.60s.sh ~/.bitbar

You can put a file named bitbar/plugins/ambient.json in one of the usual locations (e.g. ~/.config) to configure the plugin:

  • If showIfEmpty is false, the plugin will disappear entirely from your menu bar as long as you're not in a known network. Note that BitBar displays its own menu if none of the plugins are active. (Default: true)

Why fish? Why not bash or zsh?

First of all, this was written on a horribly delayed ICE train, and I happen to use fish as my daily driver.

Second, it's quite fast and has a number of nice features like lazy-loaded functions, and semantics that make it harder to shoot yourself in the foot.

If people want it migrated to bash or zsh, that's totally doable.