-
-
Save imduffy15/22503384557dd59edccf9293b7694d34 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
import json | |
import requests | |
import urllib3 | |
urllib3.disable_warnings() | |
cookie = open("cookie.txt").readline().strip() | |
csrf_token = [x.split("=") for x in cookie.split(";") if "csrf" in x][0][1] | |
headers = {"csrf": csrf_token, "Cookie": cookie} | |
# Get all existing groups... | |
groups = requests.get( | |
"https://alexa.amazon.co.uk/api/phoenix/group", headers=headers, verify=False | |
) | |
groups = groups.json() | |
# Delete all existing groups | |
for group in groups["applianceGroups"]: | |
print(f"Deleting group {group.get('name')}") | |
delete = requests.delete( | |
f"https://alexa.amazon.co.uk/api/phoenix/group/{group.get('groupId')}", | |
headers=headers, | |
verify=False, | |
) | |
delete.raise_for_status() | |
# Get home assistant entities and their areas | |
entity_registry_file = open("core.entity_registry") | |
entity_registry = json.load(entity_registry_file) | |
entity_registry = { | |
x["entity_id"]: {"area_id": x.get("area_id")} | |
for x in entity_registry["data"]["entities"] | |
if x.get("area_id") | |
} | |
# Get the areas so we have their pretty name format | |
area_registry_file = open("core.area_registry") | |
area_registry = json.load(area_registry_file) | |
areas = { | |
x.get("id"): x.get("name") for x in area_registry.get("data", []).get("areas", []) | |
} | |
# Get all devices on alexa | |
# This fails for some reason sometimes so there's terrible retry logic here. | |
raw_devices_json = None | |
while raw_devices_json is None: | |
try: | |
raw_devices = requests.get( | |
"https://alexa.amazon.co.uk/api/phoenix", headers=headers, verify=False | |
).json() | |
raw_devices_json = json.loads(raw_devices["networkDetail"]) | |
except Exception: | |
time.sleep(1) | |
group_updates = {} | |
# Map the alexa devices to their home assistant device and pull the area | |
# id from home assistant | |
for skill, details in raw_devices_json["locationDetails"]["locationDetails"][ | |
"Default_Location" | |
]["amazonBridgeDetails"]["amazonBridgeDetails"].items(): | |
details = details["applianceDetails"]["applianceDetails"] | |
for device, value in details.items(): | |
if value.get("manufacturerName", "") == "Royal Philips Electronics": | |
delete = requests.delete( | |
f"https://alexa.amazon.co.uk/api/phoenix/appliance/{value.get('applianceId', '')}", | |
headers=headers, | |
verify=False, | |
) | |
delete.raise_for_status() | |
elif value.get("friendlyDescription", "") == "Amazon smart device": | |
name = value.get("friendlyName", "").lower().replace(" ", "_") | |
longestMatch = 0 | |
area_id = None | |
for area in areas: | |
if area in name: | |
if len(area) > longestMatch: | |
longestMatch = len(area) | |
area_id = area | |
group_name = areas.get(area_id) | |
updates = group_updates.get(group_name, []) | |
updates.append(value.get("applianceId")) | |
group_updates[group_name] = updates | |
elif value.get("manufacturerName", "") == "Home Assistant": | |
home_assistant_entity_id = ( | |
value.get("friendlyDescription").split(" ")[0].strip() | |
) | |
group_name = areas.get( | |
entity_registry.get(home_assistant_entity_id, {}).get("area_id", ""), {} | |
) | |
if group_name: | |
updates = group_updates.get(group_name, []) | |
updates.append(value.get("applianceId")) | |
group_updates[group_name] = updates | |
# Create all the groups with their devices | |
for group_name, devices in group_updates.items(): | |
body = { | |
"applianceIds": devices, | |
"name": group_name, | |
} | |
try: | |
pretty = {"group": group_name, "devices": [device.split("#")[1] if '#' in device else device for device in devices]} | |
print(json.dumps(pretty, indent=2)) | |
update_group = requests.post( | |
f"https://alexa.amazon.co.uk/api/phoenix/group", | |
headers=headers, | |
verify=False, | |
json=body, | |
) | |
update_group.raise_for_status() | |
except: | |
print("Failed to process this payload:") | |
print(json.dumps(body, indent=2)) |
Very nice @craiggenner ! Thanks for sharing.
I haven’t had the cookies expire yet. Is that something you experienced?
@imduffy15 Yes, a lot. Varies from 5 to 15 minutes.
@craiggenner bizarre! I haven't updated mine since feb 6th and its going strong.
how do to you get the cookies file? and how do you actually run this? do I need to save in a particular folder?
this is what I get when executing:
➜ python_scripts python alexa_sync.py
Traceback (most recent call last):
File "/homeassistant/python_scripts/alexa_sync.py", line 2, in
import requests
ModuleNotFoundError: No module named 'requests'
Any ideas on what to do, @craiggenner and @imduffy15 ?
you need to install the requests
module.
That said this no longer works for me after a change at Amazons end.
@craiggenner what a shame :(. We need to find a way for this work. I will research and circle back to you guys.
Any news? Did someone manage to fix it?
I took this and made a few teaks: