The solution, as per here:
Was to multiply by 1000000, like so:
cpu_temp_pack = struct.pack('h', int(cpu_temp))
bat_pack = struct.pack('h', int(bat))
lat_pack = struct.pack('i', int(lat * 1000000))
lon_pack = struct.pack('i', int(lon * 1000000))
Then decode like so:
payload = (bat_pack + cpu_temp_pack + lat_pack + lon_pack)
function Decoder(bytes, port) {
var decoded = {};
if (port === 1)
{
decoded.bat = (bytes[1] << 8) | bytes[0];
decoded.cpu_temp = (bytes[3] << 8) | bytes[2];
decoded.lat = (bytes[7]<<24 | bytes[6]<<16 | bytes[5]<<8 | bytes[4]) / 1000000;
decoded.lon = (bytes[11]<<24 | bytes[10]<<16 | bytes[9]<<8 | bytes[8]) / 1000000
}
return decoded;
}