Pulled out my Nexus 7 tablet and got it working on that. Now which packet/fields were you able to find things in?
It will be an HTTPS call to api.anovaculinary.com You are looking for one that has the cooker ID and secret in the request like this:
That f56-xxxxxxxxxxx is the cooker ID.
Perfect thanks, I thought it might be in the header but wasn’t sure.
Looks like the Precision has a different API/call. Not seeing any packets going to api.anovaculinary.com. They’re going to api.segment.io and anovaculinary.io and nothing looking at all like what you posted
I think I may have found the ID, but i think they’re doing a token now
Interesting, So I fired my capture back up and I do see those calls to api.segment.io and anovaculinary.io.
Mixed in though are the api.anovaculinary.com calls. I see the tokens you are talking about in the other ones but I’m not using either of those domains and my control is working correctly so maybe those are some sort of telemetry domains? I really don’t know. It’s also entirely possible the new cooker is using a different API altogether.
A couple of screenshots:
I’ll run it for longer another day. Travelling this weekend. I’m fairly certain the segments.io is a tracking API, not sure about anovaculinary.io. How frequent are the api.anovaculinary.com calls?
It looks like roughly every 1 in 4 calls from the app is api.anovaculinary.com. You should get them though just by firing up the app with the packet capture running. You do have it paired to the cooker right? Make sure the Anova app has been killed. Fire up the packet capture then fire up the Anova app. You should get calls pretty quick to the API. I would say less than 60 seconds you will have them. At least that’s how it is with my cooker.
I’ll try killing the app first, but i’m definitely not seeing them 1 in 4 calls. And yes I have the cooker paired.
Well that sucks. Sounds like the new cooker is using a new API. It also sounds like mine may be using both in parallel or maybe the app is just using both to support the old and new cookers. I’m all out of ideas then since I don’t have a new cooker to play with.
Just for reference, here’s some of the packets I’m getting. I tried again killing the app/fresh starting and i got some different/unique hits but still nothing to api.anovaculinary.com.
Request Head:
POST /authenticate HTTP/1.1
accept: application/json, text/plain, */*
authorization: Bearer eyJhbGciXXXXXXXXXXXXXXXXXXupuycA
Content-Type: application/json;charset=utf-8
Content-Length: 2
Host: anovaculinary.io
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1
Body:
{
}
Response Head:
HTTP/1.1 200 OK
Date: Wed, 09 Oct 2019 00:25:02 GMT
Content-Type: application/json
Content-Length: 381
Connection: keep-alive
Expires: Wed, 09 Oct 2019 00:35:02 +0000
Vary: Accept-Encoding
Body:
{
"jwt": "eyJhbGciXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXetsoi14"
}
Request Head:
GET /devices/2lXdXXXXXXXXXXXXXXX/states/?limit=1 HTTP/1.1
accept: application/json, text/plain, */*
Host: anovaculinary.io
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1
If-Modified-Since: Fri, 04 Oct 2019 23:49:34 GMT
Body:
Response Head:
HTTP/1.1 200 OK
Date: Wed, 09 Oct 2019 00:25:02 GMT
Content-Type: application/json
Content-Length: 1350
Connection: keep-alive
Body:
[
{
"body": {
"boot-id": "434XXXXXXX963",
"job": {
"cook-time-seconds": 0,
"id": "98XXXXXXX379",
"mode": "IDLE",
"ota-url": "",
"target-temperature": 37.78,
"temperature-unit": "F"
},
"job-status": {
"cook-time-remaining": 0,
"job-start-systick": 1721,
"provisioning-pairing-code": 0,
"state": "",
"state-change-systick": 1721
},
"network-info": {
"bssid": "XXXXXXXX",
"connection-status": "connected-station",
"is-provisioning": false,
"mac-address": "XXXXXXXX",
"mode": "station",
"security-type": "WPA2",
"ssid": "XXXXXXXX"
},
"pin-info": {
"device-safe": 1,
"water-leak": 0,
"water-level-critical": 1,
"water-temp-too-high": 0
},
"system-info-3220": {
"firmware-version": "VM176_A_01.04.03",
"largest-free-heap-size": 26648,
"systick": 57727,
"total-free-heap-size": 27576,
"total-heap-size": 65536
},
"system-info-nxp": {
"version-string": "VM171_A_01.04.03"
},
"temperature-info": {
"heater-temperature": 21.41,
"triac-temperature": 21.73,
"water-temperature": 21.72
}
},
"header": {
"created-at": "2019-10-09T00:25:01.965259Z",
"e-tag": "4668cXXXXXXXXX4bb2",
"entity-id": "12XXXXXXX"
}
}
]
Request Head:
GET /identities/03ae7XXXXXXXXX/connected-cooks?archived=false HTTP/1.1
accept: application/json, text/plain, */*
authorization: Bearer eyJhbGciOXXXXXXXXXXetsoi14
Host: anovaculinary.io
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1
If-Modified-Since: Fri, 04 Oct 2019 23:46:56 GMT
Body:
Response Head:
HTTP/1.1 200 OK
Date: Wed, 09 Oct 2019 00:25:06 GMT
Content-Type: application/json
Content-Length: 975
Connection: keep-alive
Body:
{
"connected-cooks": [
{
"body": {
"archived": false,
"guide-id": "",
"identity-id": "03aeXXXXXXXX2915c",
"name": "",
"nonce": "yfyXXXXXXXQtS",
"recipe-id": "",
"temperature": 60,
"time-in-minutes": 0
},
"header": {
"created-at": "2019-10-04T23:42:57.780841Z",
"e-tag": "9bf69XXXXXXX83ec7",
"entity-id": "41bXXXXXXXXe479"
}
},
{
"body": {
"archived": false,
"guide-id": "",
"identity-id": "03ae7XXXXXXX915c",
"name": "",
"nonce": "Kv1gXXXXXXkwE14",
"recipe-id": "",
"temperature": 60,
"time-in-minutes": 0
},
"header": {
"created-at": "2019-10-04T23:46:55.486877Z",
"e-tag": "63cb41bXXXXXXXXf39b7ae728",
"entity-id": "17f0XXXXXXXX214"
}
}
]
}
Request Head:
POST /users/03ae7XXXXXXXX915c/push-notification-tokens HTTP/1.1
accept: application/json, text/plain, */*
authorization: Bearer eyJhbXXXXXXXXXXXXXXXXXetsoi14
Content-Type: application/json
Content-Length: 262
Host: anovaculinary.io
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1
Body:
{
"user-id":"03ae7XXXXXXXXXXXXX2915c",
"token":"fsye2fiXXXXXXXXXXXXXXXXXkyIqYeHz",
"platform":"android"
}
Response Head:
HTTP/1.1 200 OK
Date: Wed, 09 Oct 2019 00:25:06 GMT
Content-Type: application/json
Content-Length: 272
Connection: keep-alive
Entity-Id: d170dXXXXXXXXXXXXXXXXX94491
Etag: 8862XXXXXXXXXXXXXXXXbb13bf
Body:
{
"platform": "android",
"token": "fsyeXXXXXXXXXXXXXXXXXyIqYeHz",
"user-id": "03ae7XXXXXXXX915c"
}
So yeah, looks like it’s a totally different API . Guess I’ll be taking out the HASS code for now.
authorization: Bearer
Yep they have moved to oauth authentication.
This would require a new reverse-engineering of the API and device calls. Also would need to figure out how to get the proper tokens. The other implication, albeit one that doesn’t apply to you, means the old API Is bound to be shut down at some point rendering those devices largely bricks.
I’m not overly happy with the lack of an open API to control these devices. I will not be purchasing another Anova device.
Yeah, I’m annoyed about the lack of API. The only thing I can say in their favor right now is they FINALLY allow for multiple devices to be paired to the same cooker, so everybody in my house can have access.
I have found this, and it works:
I have never done an integration before so I do not know how to proceed, but maybe we are closer?
Can somebody help me? I’m at the very beginning of the study of python, and really can’t find what I do with wrong.
- I downloaded repo all files from danodemano/anova.py and moved to /hassio/scripts/anova.py-master/ folder
- Changed cooker_id and secret in anova_control.py, set chmod 755
- In folder /anova.py-master/ installed with command “pip3 install .”
- Trying to start anova_control.py and get the message:
pi@raspberrypi:~/smarthome/hassio/homeassistant/scripts/anova.py-master $ sudo ./anova_control.py
Traceback (most recent call last):
File “./anova_control.py”, line 6, in
import anova
ModuleNotFoundError: No module named ‘anova’
Where is my mistake?
Does this work?
Looks like it was made before the oAuth transition.
depends on which Anova you have I guess. It sure doesn’t work with my Anova Precision Cooker Bluetooth & WI-FI (not nano)
I have the Anova Precision Cooker and ammarzuberi/pyanova-api is working OK for me. I can query the cooker status and if I add the login/password, can set temperature and time.
Really annoying having to go via anovaculinary.io to do so.
[My cooker was purchased in December 2020]
Geoff
for those having problems with ammarzuberi pyanova-api, try this, it works for me:
I managed to make it work from a python console, but I’m still learning python and I don’t know how to write a script to make use of it. How did you integrate it with your HA instance?
I never got around to try using my version in hassio to be honest.
I’d assume you can use a wrapper in the same way the original version did, but I can’t be of much help until I get to do this for myself, which honestly could be months, if ever at this rate.