{ pkgs, ... }: let homeassistant-api = pkgs.python3.pkgs.buildPythonPackage rec { pname = "homeassistant_api"; version = "5.0.0"; format = "pyproject"; src = pkgs.fetchPypi { inherit pname version; sha256 = "sha256-UNKTtgInrVJtjHb1WVlUbcbhjBOtTX00eHmm54ww0rY="; }; # do not run tests doCheck = false; nativeBuildInputs = with pkgs.python3.pkgs; [ poetry-core requests-cache ]; dependencies = with pkgs.python3.pkgs; [ requests-cache pydantic websockets ]; propagatedBuildInputs = with pkgs.python3.pkgs; [ aiohttp aiohttp-client-cache pydantic requests requests-cache simplejson websockets ]; pythonRelaxDeps = [ "requests-cache" "pydantic" "websockets" ]; pythonImportsCheck = [ "homeassistant_api" ]; }; pythonEnv = pkgs.python3.withPackages (ps: [ 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 { home.packages = [ waybar-hass ]; }