Many thanks for your feedback. I resolved it slightly different. The main bug was that the status was never updated once the initialization was successful:

/**    mlx.begin() always returns true, hence we need to check the I2C adress */
bool isMLX90614Present() {
  Wire.beginTransmission(MLX90614_I2CADDR);
  byte error = Wire.endTransmission();
  mlx.begin();
  mlxData.status = (error == 0);
  return (mlxData.status);
}

void updateMLX() {
 if (mlxData.status || (mlxData.status = isMLX90614Present())) {
   mlxData.ambient_t = mlx.readAmbientTempC();
   mlxData.object_t  = mlx.readObjectTempC();
 }
}

Could you please check if this works for you?

Read More...