Add homeassistant skill in unpacked format

- Add complete homeassistant skill source to skills/ directory
- Includes all scripts, references, and automation templates
- Matches format of other skills in repository
This commit is contained in:
Felix Zösch
2025-12-16 12:49:56 +01:00
parent 43f3a0d0b4
commit 9be64a0696
14 changed files with 2393 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
#!/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()