- Add complete homeassistant skill source to skills/ directory - Includes all scripts, references, and automation templates - Matches format of other skills in repository
89 lines
2.8 KiB
Python
Executable File
89 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
List all Home Assistant entities and their states
|
|
|
|
This script queries Home Assistant and displays all entities with their current states.
|
|
Can filter by domain (e.g., light, switch, sensor) and format output.
|
|
|
|
Usage:
|
|
# List all entities
|
|
python3 list_entities.py --url http://homeassistant.local:8123 --token YOUR_TOKEN
|
|
|
|
# List only lights
|
|
python3 list_entities.py --url http://homeassistant.local:8123 --token YOUR_TOKEN --domain light
|
|
|
|
# Output as JSON
|
|
python3 list_entities.py --url http://homeassistant.local:8123 --token YOUR_TOKEN --format json
|
|
|
|
Environment variables:
|
|
HA_URL: Home Assistant URL
|
|
HA_TOKEN: Long-lived access token
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
import urllib.request
|
|
|
|
|
|
def get_entities(url: str, token: str):
|
|
"""Get all entity states from Home Assistant."""
|
|
api_url = f"{url.rstrip('/')}/api/states"
|
|
headers = {
|
|
'Authorization': f'Bearer {token}',
|
|
'Content-Type': 'application/json'
|
|
}
|
|
|
|
req = urllib.request.Request(api_url, headers=headers)
|
|
|
|
try:
|
|
with urllib.request.urlopen(req) as response:
|
|
return json.loads(response.read().decode('utf-8'))
|
|
except Exception as e:
|
|
print(f"Error: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='List Home Assistant entities')
|
|
parser.add_argument('--url', help='Home Assistant URL',
|
|
default=os.getenv('HA_URL'))
|
|
parser.add_argument('--token', help='Long-lived access token',
|
|
default=os.getenv('HA_TOKEN'))
|
|
parser.add_argument('--domain', help='Filter by domain (e.g., light, switch, sensor)')
|
|
parser.add_argument('--format', choices=['table', 'json', 'list'],
|
|
default='table', help='Output format')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if not args.url or not args.token:
|
|
print("Error: URL and token are required", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
entities = get_entities(args.url, args.token)
|
|
|
|
# Filter by domain if specified
|
|
if args.domain:
|
|
entities = [e for e in entities if e['entity_id'].startswith(f"{args.domain}.")]
|
|
|
|
if args.format == 'json':
|
|
print(json.dumps(entities, indent=2))
|
|
elif args.format == 'list':
|
|
for entity in entities:
|
|
print(entity['entity_id'])
|
|
else: # table format
|
|
print(f"{'Entity ID':<40} {'State':<20} {'Last Changed':<20}")
|
|
print("-" * 80)
|
|
for entity in entities:
|
|
entity_id = entity['entity_id']
|
|
state = entity['state']
|
|
last_changed = entity.get('last_changed', 'N/A')[:19] # Truncate timestamp
|
|
print(f"{entity_id:<40} {state:<20} {last_changed:<20}")
|
|
|
|
print(f"\nTotal: {len(entities)} entities")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|