Add query-ha-entities.py
This commit is contained in:
75
query-ha-entities.py
Normal file
75
query-ha-entities.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Query Home Assistant API for entity IDs"""
|
||||||
|
import urllib.request
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
TOKEN = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4NmM2ZGNlMTY2MWU0M2U5YjQ2MDI3MjMxYjE0NDFlMyIsImlhdCI6MTc2NzE3ODUyNiwiZXhwIjoyMDgyNTM4NTI2fQ.E8eShOsejwDYglixpgM_d_JYBlB1OVNhN7cHPnPiLOs"
|
||||||
|
HA_URL = "http://homeassistant.local:8123"
|
||||||
|
|
||||||
|
def get_entities():
|
||||||
|
"""Get all entities from Home Assistant"""
|
||||||
|
url = f"{HA_URL}/api/states"
|
||||||
|
req = urllib.request.Request(url)
|
||||||
|
req.add_header("Authorization", f"Bearer {TOKEN}")
|
||||||
|
req.add_header("Content-Type", "application/json")
|
||||||
|
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(req) as response:
|
||||||
|
data = json.loads(response.read().decode())
|
||||||
|
return data
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error: {e}", file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def filter_weather_entities(entities):
|
||||||
|
"""Filter for weather-related entities"""
|
||||||
|
weather_keywords = ['weather', 'temperature', 'humidity', 'pressure', 'wind',
|
||||||
|
'forecast', 'rain', 'snow', 'cloud', 'uv', 'solar']
|
||||||
|
|
||||||
|
weather_entities = []
|
||||||
|
for entity in entities:
|
||||||
|
entity_id = entity.get('entity_id', '').lower()
|
||||||
|
friendly_name = entity.get('attributes', {}).get('friendly_name', entity_id)
|
||||||
|
device_class = entity.get('attributes', {}).get('device_class', '').lower()
|
||||||
|
|
||||||
|
# Check if it's a weather entity or sensor with weather-related attributes
|
||||||
|
if (any(kw in entity_id for kw in weather_keywords) or
|
||||||
|
any(kw in device_class for kw in weather_keywords) or
|
||||||
|
entity_id.startswith('weather.') or
|
||||||
|
(entity_id.startswith('sensor.') and device_class in ['temperature', 'humidity', 'pressure'])):
|
||||||
|
weather_entities.append({
|
||||||
|
'entity_id': entity.get('entity_id'),
|
||||||
|
'friendly_name': friendly_name,
|
||||||
|
'state': entity.get('state'),
|
||||||
|
'device_class': device_class
|
||||||
|
})
|
||||||
|
|
||||||
|
return sorted(weather_entities, key=lambda x: x['entity_id'])
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print("Querying Home Assistant API...")
|
||||||
|
entities = get_entities()
|
||||||
|
|
||||||
|
if entities:
|
||||||
|
print(f"\nFound {len(entities)} total entities")
|
||||||
|
weather = filter_weather_entities(entities)
|
||||||
|
print(f"\nFound {len(weather)} weather-related entities:\n")
|
||||||
|
|
||||||
|
for e in weather:
|
||||||
|
print(f"{e['entity_id']}")
|
||||||
|
print(f" Name: {e['friendly_name']}")
|
||||||
|
print(f" State: {e['state']}")
|
||||||
|
if e['device_class']:
|
||||||
|
print(f" Device Class: {e['device_class']}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
# Also show all entity IDs for reference
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("ALL ENTITY IDs (for reference):")
|
||||||
|
print("="*60)
|
||||||
|
for entity in sorted(entities, key=lambda x: x.get('entity_id', '')):
|
||||||
|
print(entity.get('entity_id'))
|
||||||
|
else:
|
||||||
|
print("Failed to retrieve entities", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
Reference in New Issue
Block a user