Logitech Harmony removes local API


#21

Thanks. Logged a generic reply on that support page asking for local api to be reinstated.

I just ordered a harmony elite yesterday and was hoping to connect it to my HA :confused:


#22

you still can, jus dont update the firmware :slight_smile:


#23

The .net repository looks like a great resource. They have figured out discovery and the returned hub info seems to be everything needed to discover and set up a connection.


#24

Good to hear, but I hope Logitech reverts or make an option in the app to open API access if a user wants it


#25

I can’t believe that there hasn’t been a response yet from Logitech. It’s been almost 24 hours since it was reported on the Logitech forums, and Logitech is yet to give an official response. I would have thought that if it was an accident/mistake they would have come out already and said so and that they are working on a fix. Most people would be happy with that and happy to wait a day or so.

In my opinion, the fact that nothing has been said, to me seems like this was intentional and “we will see what the fall out is and go from there”. It seems that more people use the local API than they thought and it’s has bitten them in the rear end and they are scrambling to come up with a solution.

I sincerely hope that this is a mistake and that there has been a lack of communication and that things are restored, but I’m not holding my breath. I’m prepared to pack my Harmony Elite back in the box and get a refund. I’ve been using harmony remotes for years, and they are good at what they do. I don’t know where I’d go if I was to go with another vendor.


#26

Initially I’ve blocked the hub from reaching the internet myself after doing the firmware rollback. The iOS app will be stuck at getting device configuration and switching the activities from the HA will work but for some reason the activity is changed after ~ 1 minute. Why this insane delay?


#27

yes, noticed this delay too in the beginning, i think the hub is in a timeout or something
my delay is now gone


#28

What can I do to help? I have a week off starting soon.


#29

yeah, I have Ubiquiti and I was shocked that the process of blocking a website by name was so incredibly difficult. Something any cheesy $50 router can do in a few clicks.

I ended up solving the problem with my pi-hole. a few clicks and it was done.


#30

Can someone try this and see if it returns your hubId? Just don’t post it publicly. Replacing the IP of course with your own. I wasn’t able to get the hub to reply by sending it a broadcast. Probably code error on my part…But noticed the iOS app makes a POST to the hub on 8088 when you manually enter the IP address of your hub.

So it’s looking like if you at least know your hub ip addresses, you could query it for the hubId, and then from the hubId, pull down the config with all of your devices/activities, etc… I will say, the hub itself seems to continually broadcast itself out. So a listener may be able to notice these if on the same L2 network and identify all hubs.

    import requests
    import json

    hub_ip = '192.168.10.5'
    hub_port = '8088'


    # POST capture via Wireshark.
    # This is from manually connecting to hub via iOS app
    # ie, manually enter hub IP Address
    #
    #
    #POST / HTTP/1.1
    #Host: 192.168.10.5:8088
    #Origin: http//:localhost.nebula.myharmony.com
    #Accept-Charset: utf-8
    #Content-Type: application/json
    #Content-Length: 56
    #Connection: keep-alive
    #Accept: application/json
    #User-Agent: Harmony_iOS_5.5_16
    #Referer: http//:localhost.nebula.myharmony.com/mobile-fat.html
    #Accept-Language: en-us
    #Accept-Encoding: gzip, deflate

    headers = {'Content-type': 'application/json', 'Accept': 'text/plain', 'Origin': 'http//:localhost.nebula.myharmony.com'}
    r = requests.post('http://' + hub_ip + ':' + hub_port, json={"id": 124, "cmd": "connect.discoveryinfo?get", "params": {}}, headers=headers)

    hub_data = json.loads(r.text)

    hub_id = hub_data['data']['remoteId']
    account_id = hub_data['data']['accountId']
    print('Harmony Hub ID: ' + hub_id)
    #print('Harmony Account ID: ' + account_id)

#31

I’ll give it a whirl, but I blocked the update. Won’t be home til later.


#32

I have a shitty router, not as easy as you think… I had to block all internet connection for the harmony.


#33

“The WebSocket implementation has a real annoying “feature” though where to connect you have to know the device’s “remote id”… which seemingly isn’t published anywhere, and requires a bonjur style discovery call to get the hubs to advertise themselves.”

I found that if you do an http POST to the Hub, you can get the hub id (remoteId) back. Someone else will have to also test and make sure it works also.


#34

@chadcb

Can confirm when I run your code I get the hubId back:

[email protected]:~$ python hub_test.py
Harmony Hub ID: ****100

From my harmony app settings I’m on 4.15.206 firmware

EDIT: Also confirmed same behavior on my second hub.


#35

Great. So then running this code (after doing a find/replace on YOUR_HUB_IP and YOUR_HUB_ID) leaving the quotes in tact, should return all of your devices, their ID’s, and available actions for each.

Note: Regarding find/replace, I haven’t successfully re-structured the json data to where I can substitute variables. Thus, the find/replace. Just quickly cobbling together code to test things. So using raw strings for now. Sorry!


#36

Careful. There are distinct HubId (not unique), UUID (unique), and RemoteId values. You want the RemoteId one specifically for the websocket connection.


#37

Not a bad shout, ended up setting up OpenDNS Home VIP and blocked the domains on there…


#38

@chadcb

Ok I ran your code and here’s the result. I’m not sure if the deviceIds are secret, so I blanked them out:


#39

Worked for me as well.


#40

For Finxbox users ( I know that there are a few on this board) you can always go into your device and “pause” internet access forever. Just another way to stop the hub to communicate with Logitech servers.


Sony Bravia TV component with Pre-Shared Key