For those who don't know, Hammerspoon is a fantastic automation tool for OS X. It's basically a bridge between the operating system and the Lua scripting language. With its set of extensions (which you can write your own, by the way) you can automate pretty much anything.
You can write Lua code that interacts with OS X APIs for applications, windows, mouse pointers, filesystem objects, audio devices, batteries, screens, low-level keyboard/mouse events, clipboards, location services, wifi, and more.
Here's the current script i'm using on my development laptop. It currently does the following:
- Auto reloads whenever i change the configuration script;
- Sets up a menu bar button so i can control whether my laptop goes to sleep or is continuously awake. If you know the app Caffeine, you know what i'm saying;
- Monitors my Wifi connection and warns me when i lose connection or connect to a different SSID;
- Monitors my battery and warns me when i get to 10 and 5%.
- Work in progress: Monitor google.com and bing.com from times to times to check if i have Internet connection.
The great thing about it is its simplicity. Even if you don't know Lua, you'll find it very easy to write simple watchers and callbacks.
Give it a try! :)
init.lua
------------------------------------------------------------------------------------- -- Auto Reloading when config changes ------------------------------------------------------------------------------------- function reload_config(files) -- Kill bat watcher if batWatcher then batWatcher:stop() end -- Kill wifi watcher if wifiWatcher then wifiWatcher:stop() end -- Kill caffeine if caffeine then caffeine:delete() end -- Reload config hs.reload() end hs.pathwatcher.new(os.getenv("HOME") .. "/.hammerspoon/", reload_config):start() hs.alert.show("Config reloaded") ------------------------------------------------------------------------------------- -- Keep display on or allow going to sleep ------------------------------------------------------------------------------------- local caffeine = hs.menubar.new() function setCaffeineDisplay(state) if state then caffeine:setTitle("AWAKE") else caffeine:setTitle("SLEEPY") end end function caffeineClicked() setCaffeineDisplay(hs.caffeinate.toggle("displayIdle")) end if caffeine then caffeine:setClickCallback(caffeineClicked) setCaffeineDisplay(hs.caffeinate.get("displayIdle")) end ------------------------------------------------------------------------------------- -- Network connection and disconnection ------------------------------------------------------------------------------------- local wifiWatcher = nil function ssidChangedCallback() newSSID = hs.wifi.currentNetwork() if newSSID then hs.alert.show("Network connected: " .. newSSID) else hs.alert.show("Network lost :(") end end wifiWatcher = hs.wifi.watcher.new(ssidChangedCallback) wifiWatcher:start() ------------------------------------------------------------------------------------- -- Battery Low warnings ------------------------------------------------------------------------------------- local batWatcher = nil local lastBatVal = hs.battery.percentage() function batPercentageChangedCallback() currentPercent = hs.battery.percentage() if currentPercent == 10 and lastBatVal > 10 then hs.alert.show("Getting low on juice...") end if currentPercent == 5 and lastBatVal > 5 then hs.alert.show("Captain, she can't take any more!") end lastBatVal = currentPercent end batWatcher = hs.battery.watcher.new(batPercentageChangedCallback) batWatcher:start() --status, data, headers = hs.http.get("http://example.com") --hs.alert.show(status) --hs.alert.show(data)