Meater thermometer

Hi Floyduww;
Since I posted I spent last night tinkering your program to test. Turns out I had all sorts of environment issues with Python (i’m hopeless with it). I have “more results” with Python3, is that the correct environment for it?

Is there a way to test if I have all the modules loaded?

I can confirm it is receiving the UDP Hex dump, but only when I launch the app. I haven’t seen any other packets coming in but that I suspect is the program crashing.

It appears I get all sorts of python errors, which i’m putting down to either modules not on my machine or the hex data been in the wrong order from the Meater+ hex packet and causing issues.

Hex dump below is;
Meater+ probe
Target Temp 57
Internal 18 (maybe 17)
Ambient: (too low, no reading)
“Sirloin Steak, beef”
(ignore all the extra prints, I was slowly trying to work out the data packet break down, let me know if you need me to remove).

python3 meater_reader_v2.py
-----------------
len(m)=2
len(m[0])=68
len(m[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
	power:2
bc is: 
50
offset is: 
61
probe[offset] is: 
61
probe[end] is: 
112
probeData is: 
b'.52\x0211'
probe[bc] is: 
50
probe[data] is: 
b'.52\x0211'
probe[batt] is: 
0
probe[sig] is: 

cook_data_bc is: 
50
cook_data is: 
b'2\x0211'
probe[cooking] is: 

temp_data_start is: 
54
temp_data_bc is: 
0
temp data[1:3] is: 
b''
temp data[4:6] is: 
b''
Traceback (most recent call last):
  File "meater_reader_v2.py", line 245, in <module>
    processPacket(data)
  File "meater_reader_v2.py", line 177, in processPacket
    probes[1] = probe_data(probe_1_start, theData)
  File "meater_reader_v2.py", line 77, in probe_data
    probe["m_temp"] = math.floor(toCelsius(convertHex(temp_data[1:3].hex())))
  File "meater_reader_v2.py", line 113, in convertHex
    incrementor = int(hex[0:2], 16) - 128
ValueError: invalid literal for int() with base 16: ''

Next Hex dump;
Meater+ probe
Target Temp 70degC
Internal 18 degC
Ambient: (too low, no reading)
“Pork Chop”

-----------------
len(m)=2
len(m[0])=68
len(m[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
	power:2
bc is: 
50
offset is: 
61
probe[offset] is: 
61
probe[end] is: 
112
probeData is: 
b'.52\x0211'
probe[bc] is: 
50
probe[data] is: 
b'.52\x0211'
probe[batt] is: 
0
probe[sig] is: 

cook_data_bc is: 
50
cook_data is: 
b'2\x0211'
probe[cooking] is: 

temp_data_start is: 
54
temp_data_bc is: 
0
temp data[1:3] is: 
b''
temp data[4:6] is: 
b''
Traceback (most recent call last):
  File "meater_reader_v2.py", line 245, in <module>
    processPacket(data)
  File "meater_reader_v2.py", line 177, in processPacket
    probes[1] = probe_data(probe_1_start, theData)
  File "meater_reader_v2.py", line 77, in probe_data
    probe["m_temp"] = math.floor(toCelsius(convertHex(temp_data[1:3].hex())))
  File "meater_reader_v2.py", line 113, in convertHex
    incrementor = int(hex[0:2], 16) - 128
ValueError: invalid literal for int() with base 16: ''

Thanks for your efforts, this is great!! :smiley:
Let me know if you need more Hex dumps under different conditions etc!
ta!

Edit; the MQTT is working, I have receiving “off” when the “blockOff” sends/prints

This is the data that is coming from your phone, notice the Google Pixel 5 in the Hex dump. If you are getting meater data the string will be longer and not have your phone model in the dump. Also I updated the code today, download the latest and it wont crash when getting data from the phone.

Give me 5, running new program, will get hex dumps now

Hex dump;
latest python;
Conditions; probe not turned on (still in holder), app launched;

-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app
^CTraceback (most recent call last):
  File "meater_reader_v2.py", line 225, in <module>
    inputs, outputs, inputs, socket_timeout)
KeyboardInterrupt

Hex dump; latest program
App already launched, probe removed from holder, no cook set up;

-----------------
len(packet)=2
len(packet[0])=60
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \r)\x9ami\xfa\xf1`\xf8)\x12%\n\x08\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 0d 29 9a 6d 69 fa f1 60 f8 29 12 25 0a 08 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app

Hex dump;
As above, cook setup with;
Lamb chop, target = 60 degreesC, internal 20degreesC
(I had to close and re-launch the app, the script only reported “blockOff”)

blockOff
-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app

Hex dump;
Lamp chop, target = 60, internal 22, ambient 32 (again, had to relaunch app to get packet)

-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app

Need any more conditions?

From the phone app in the My devices section can you tell what the IP of your meater+ is. It seems as though the meater+ is not broadcasting the UDP packet or at least not on port 7878.

It won’t have an IP. It’s bluetooth to the phone, phone app broadcasts the packets. Phone IP is .74 (in the hex dump).

Edit: app version 2.5 if that helps

Ah ha, there’s the rub. My code does not know how to read the data from the phone to bluetooth connection yet. You said you have a meater+ can you connect it to your wifi and get the data to your phone that way?

Nudda, it’s bluetooth only!
Meater = probe -> bluetooth -> phone
Meater+ = probe -> bluetooth -> Meater+ block -> bluetooth -> phone

no wifiy’s

Do you by chance have another device you can install the meater app on and try to connect to the first with meater link? From the dumps I can’t tell if probe data is actually being sent. I am wondering if meater link data from the device connected to the probe is only sent if another device has asked for it. The data sent for each probe from the block would be longer than what is in the packets the phone dumps seen. And sorry in all this I assumed you had a meater+ not a meater.

I thought the same thing - I had the same setup, with my wife’s phone as the second meater app running. I will get hex dumps when she returns from work (9:30am here). I only have one working phone.

All good about arrangements!

Would be another 8-9 hours before I can do a hex dump again.

Any chance you can show me how to loop the program to keep constantly dumping every 10 seconds?

Edit that, I thought the meater+ output over wifi not bluetooth. I did not misunderstand you, I misunderstood the product.

For the dumps, if I have the meater app running I get data every couple seconds.

Yeah mine don’t update, I have to keep re-launching the app. When wifey gets home, I will connect as below and report back data.

probe -> (bluetooth) -> meater+ -> (bluetooth) -> phone app master -> (wifi) -> phone app slave

@matticas here is the breakdown of the data from your phone:

                                                                  bc rest of packet
                           dev   inc   |- phone mac         -|    bc    bc |- app id ?          -| |- probe mac         -|          bc |- Phone type                          -|    bc |-ver -|    bc |? ?|          
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 

bc - byte count
sp - seperator

dev - meaterblock (02), phone (01) ?
inc - goes up every push, just rolls over
ver - Phone app version #
?? - not sure if this is an id like probe id or a verion sub number
probe mac - bluetooth id of the probe
phone mac - bluetooth id of the phone
app id - id of the meater app

There is no cook data provided in this data.

I just connected a via:
ble(probe) -> phone 1 -> wifi -> phone 2.

I was not able to see any extra UDP or TCP over my wireless router between my phones. Yet the data was getting through. I do not have meater cloud setup. So at this point I have no idea how meater link is communicating.

ok short answer; once the slave app opens, it sends a UDP packet (your python grabs it), which must broadcast the slave is open looking for master app’s.

No other UDP’s seen (with your script), with exception of when either the master or slave app’s are closed and re-opened.

Sorry about mess of code dumps below.

Note the IP’s; master = .74 slave = .24

Master phone app launched, no cook set up, probe out;
-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app



Beef Rib Eye, 60 degreesC setup cook, 22 internal, no ambient
app closed and re-launched on master  IP = .74
-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app




app running on master, app launched on slave phone;  ip = .24
-----------------
len(packet)=2
len(packet[0])=70
len(packet[1])=2
('192.168.1.24', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\xe5\xd7Hzb\xb8\x13?\x12/\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 3*\x052.4.12\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 e5 d7 48 7a 62 b8 13 3f 12 2f 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 33 2a 05 32 2e 34 2e 31 32 02 31 31 
I think this is the phone app



Slave phone app closed and re-launched;  slave IP =.24
-----------------
len(packet)=2
len(packet[0])=70
len(packet[1])=2
('192.168.1.24', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\xe5\xd7Hzb\xb8\x13?\x12/\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 3*\x052.4.12\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 e5 d7 48 7a 62 b8 13 3f 12 2f 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 33 2a 05 32 2e 34 2e 31 32 02 31 31 
I think this is the phone app



Master app closed and re-launched;  slave phone sent packet once connect broke; slave IP = .24
-----------------
len(packet)=2
len(packet[0])=62
len(packet[1])=2
('192.168.1.24', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \t)\xe5\xd7Hzb\xb8\x13?\x12\'\n\x08\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 3*\x052.4.12\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 09 29 e5 d7 48 7a 62 b8 13 3f 12 27 0a 08 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 33 2a 05 32 2e 34 2e 31 32 02 31 31 
I think this is the phone app



Master app opened;
-----------------
len(packet)=2
len(packet[0])=68
len(packet[1])=2
('192.168.1.74', 7878)
b'\n\x13\x08\xca\xa8\x01\x10\x0c\x18\x01 \x01)\x9ami\xfa\xf1`\xf8)\x12-\n\x10,\xef\xe77\x91x \xee\x7f}\xdc\xcb\xa1\x16\x11^\x10\x02"\x0eGoogle Pixel 5*\x032.52\x0211'
0a 13 08 ca a8 01 10 0c 18 01 20 01 29 9a 6d 69 fa f1 60 f8 29 12 2d 0a 10 2c ef e7 37 91 78 20 ee 7f 7d dc cb a1 16 11 5e 10 02 22 0e 47 6f 6f 67 6c 65 20 50 69 78 65 6c 20 35 2a 03 32 2e 35 32 02 31 31 
I think this is the phone app

ok, currently heading down a big rabbit hole trying to get wireshark running and capturing on a remote AP via ssh.
So far with tcpdump I can’t see any packets directly from phone to phone.

Funny that your second phone did the same as my second. It got app version 2.4.1, where my main phone, as yours, has version 2.5 . Just fun info, doesn’t help with the issue.

One other thing I thought of later was if bluetooth was still on on the second device, and they were possibly communicating that way, which is why neither of us saw anything with tcpdump. Don’t have a second device here to test making sure bluetooth is off on the second device at the moment.

CAn someone help out a noob here. i have HA in docker with no Bluetooth.
I have a raspberry pi that i could use as the bluetooth server but i have no clue what i have to set up on the pi for it to work as a MQTT broker, and where is should put in code for it to work. i have a Meater+

1 Like

Hi Stefan;
We haven’t solved this yet for Meater+.
We are working on it