Files
nix-config/modules/home/programs/waybar/scripts/hass.nix
2026-01-07 09:17:34 -06:00

85 lines
2.1 KiB
Nix
Executable File

{
config,
lib,
namespace,
pkgs,
...
}:
let
cfg = config.${namespace}.programs.waybar;
pythonEnv = pkgs.python3.withPackages (
_ps: with pkgs.${namespace}; [
homeassistant-api
]
);
waybar-hass = pkgs.writeScriptBin "waybar-hass" ''
#!${pythonEnv}/bin/python
"""run with the special python"""
import argparse
import time
import json
from homeassistant_api import WebsocketClient
HASS_URL = 'ws://homeassistant.local:8123/api/websocket'
parser = argparse.ArgumentParser(prog='hass python wrapper')
parser.add_argument('--toggle_light')
parser.add_argument('--get_light')
args = parser.parse_args()
def load_key():
"""Read the api key"""
token_path = "/run/secrets/desktop/hass_token"
with open(token_path, "r") as key_file:
key = key_file.readline()
return key
def get_light_state(client, light):
"""Get light status"""
light_entity = client.get_entity(entity_id=light)
state = light_entity.get_state()
if state.state == 'on':
return "󰛨"
return "󰹏"
def toggle_light(client, light):
"""Toggle light status"""
lights = client.get_domain("light")
lights.toggle(entity_id=light)
time.sleep(0.5)
light_entity = client.get_entity(entity_id=light)
state = light_entity.get_state()
if state.state == 'on':
return "󰛨"
return "󰹏"
def main():
"""Main"""
token = load_key()
status = "err"
with WebsocketClient(HASS_URL, token) as client:
# toggle a light
if args.toggle_light is not None:
status = toggle_light(client=client, light=args.toggle_light)
# get the current light status
if args.get_light is not None:
status = get_light_state(client=client, light=args.get_light)
print(json.dumps({ "text": status }))
main()
'';
in
{
imports = [ ../options.nix ];
config = lib.mkIf cfg.enable {
home.packages = [ waybar-hass ];
};
}