SousVide 0.0.0-beta2

This is a prerelease version of SousVide.
dotnet add package SousVide --version 0.0.0-beta2                
NuGet\Install-Package SousVide -Version 0.0.0-beta2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SousVide" Version="0.0.0-beta2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SousVide --version 0.0.0-beta2                
#r "nuget: SousVide, 0.0.0-beta2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SousVide as a Cake Addin
#addin nuget:?package=SousVide&version=0.0.0-beta2&prerelease

// Install SousVide as a Cake Tool
#tool nuget:?package=SousVide&version=0.0.0-beta2&prerelease                

👨🏻‍🍳 SousVide

price: $0/month Nuget GitHub Actions Testspace Coveralls

Bluetooth client library and protocol specification for the Anova Precision Cooker sous vide.

  1. Background
    1. Device
    2. Cash Grab
    3. Remote Control Uselessness
    4. Solutions
  2. Prerequisites
  3. Usage
    1. Bluetooth Pairing
    2. Command Line Tool
    3. .NET Library
      1. Getting Started
      2. Application Programming Interface
  4. Learning
    1. Communication Protocol Specification
    2. Bluetooth Inspection
  5. Acknowledgements

Anova Precision Cooker

Background

Device

The original Anova Precision Cooker 1.0 is an 800 watt sous vide which was released in 2014. You can control it with either physical on-device inputs or a phone app over Bluetooth Low Energy. Unlike later models, it does not have a Wi-Fi transceiver. It's a really nice device with high-quality hardware, and it works very well, even though the API design is questionable.

Cash Grab

Unfortunately, Anova decided to charge users who create an account after 2024-08-21 $2/month or $10/year (USD) to control their sous vides from the phone app. They also decided to remove the existing Bluetooth connectivity from their app on 2025-09-28, so the only way to use their non–Wi-Fi devices will be with the physical controls. This library and protocol specification were inspired by a reader's objection to this bait-and-switch cash grab:

Some long-time users have pleaded with the company to think of alternative solutions. For example, a commenter called David, who claimed to own three Anova products, asked if the company could "open source the communication protocols and allow the community to take over."

"I suspect there is a strong overlap between people who own sous vides and developers (me for a start)," David said.

Remote Control Uselessness

To be clear, the ability to remotely control a sous vide is worthless. There is no advantage to starting, monitoring, or stopping cooking with your phone:

  • It's far clumsier and slower than the physical dial and button located on the sous vide itself.
  • You're going to be near the device when you start it anyway, so you don't need to start it from far away.
  • Cooking using the phone app is not better than with the manual inputs because the only relevant parameters are the target water temperature and the signal to begin cooking, so the phone app is not smarter.
  • The timer is useless because the entire point of sous vide is that it can run forever, so if you want to know when two hours have elapsed, set a timer on your phone or oven.
  • If you want to sous vide as quickly as possible, the only correct solution is to use a continuous thermometer like the Thermoworks Dot.
  • Being able to transfer online "recipes" is a waste of time because they are so simplistic that they just set a useless timer and a target water temperature, which you could have easily set yourself, either by looking it up on your handy temperature guide or a quick web search.
  • There is no reason to check the water temperature remotely, because it will always be at the target temperature thanks to the fact that the sous vide is running.
  • There is no reason to change the water temperature set point remotely, because the point of sous vide is using a constant temperature for the entire cooking duration.

Solutions

If you still want to control your Anova Precision Cooker over Bluetooth after 2025-09-28, you can try the following techniques until one works.

  1. Install an older version of the app that still has the Bluetooth functionality.
  2. Use the sample program in this repository.
  3. Write your own .NET program using the client library in this repository.
  4. Don't write .NET? No problem. Write your own program in a language of your choice by following the protocol specification in this repository.
  5. Inspect Bluetooth LE traffic between your phone and sous vide to understand and implement the GATT communication protocol yourself — its design is misguided but simple, just RPC-style string writes and response callbacks used to read and write values and invoke functions.

Prerequisites

Usage

Bluetooth Pairing

  1. Plug in the sous vide.
  2. Press its Bluetooth button to enter pairing mode. It will turn blue and start blinking.
  3. Scan for the sous vide in the Bluetooth settings of your operating system.
    • Windows 10
      1. Go to Settings › Devices › Bluetooth & other devices > Add Bluetooth or other device › Bluetooth.
      2. Select Anova.
    • Windows 11
      1. Go to Settings › Bluetooth & devices › Devices.
      2. Set Device settings › Bluetooth devices discovery to Advanced, otherwise the device will be hidden.
      3. Select Add device › Bluetooth.
      4. Select Anova.
  4. Enter the PIN 0000.

Command Line Tool

This sample program demonstrates Bluetooth connectivity and reference usage of the library.

  1. Download the SousVideCtl ZIP file for your operating system and CPU architecture from the latest release.
  2. Extract the ZIP file.
  3. On Linux- and Unix-based operating systems, set the executable bit using chmod +x sousvidectl.
  4. Run ./sousvidectl.
    Current temperature:  73.0 °F
    Target temperature:  135.0 °F
    
    Start  ↑↓ Set temperature  Exit
    
  5. Press <kbd>S</kbd> to start and stop the sous vide.
  6. Press <kbd>↑</kbd> and <kbd>↓</kbd> to raise and lower the target temperature.
  7. Press <kbd>X</kbd> to exit.

.NET Library

Getting Started
  1. In your .NET project, add a dependency on the NuGet package SousVide.
    dotnet add package SousVide
    
  2. When targeting Windows, add a Windows 10 target framework moniker to the <TargetFrameworks> in your .csproj project file, otherwise it will use the Linux implementation if you only target an OS-agnostic TFM like net8.0.
    <TargetFrameworks>net8.0-windows10.0.19041.0</TargetFrameworks>
    
  3. Connect to the paired sous vide.
    await using ISousVide? sousVide = await AnovaPrecisionCooker.Create();
    
  4. Call methods, and read or subscribe to reactive properties, on the ISousVide instance.
    Console.WriteLine($"{(sousVide.IsRunning.Value ? "Running" : "Stopped")}, desired temperature: {sousVide.DesiredTemperature.Value:N1}");
    
Application Programming Interface

ISousVide is the public interface of this library. Construct instances by calling AnovaPrecisionCooker.Create(string?).

ISousVide.DeviceId

The unique ID of this Bluetooth device. Can be persisted and passed to AnovaPrecisionCooker.Create(string?) later to reconnect to the exact same device, in case there are multiple paired Precision Cookers.

ISousVide.IsRunning

true if the sous vide is cooking, or false otherwise. Change this with Start() and Stop().

ISousVide.ActualTemperature

The current temperature of the water.

ISousVide.DesiredTemperature

The target of the water temperature. Change this with SetDesiredTemperature(Temperature).

ISousVide.SetDesiredTemperature(Temperature)

Change the set point of the water temperature. Changes DesiredTemperature.

ISousVide.Start()

Begin cooking. Changes IsRunning. Stop with Stop().

ISousVide.Stop()

Stop cooking. Changes IsRunning.

ISousVide.StartTimer(TimeSpan)

Start a countdown timer that will stop cooking after the given duration elapses. After calling this method, call Start() to begin cooking for this duration. Can be cancelled with StopTimer().

ISousVide.StopTimer()

Cancels any existing countdown timer that was previously started with StartTimer(TimeSpan).

Learning

Communication Protocol Specification

To learn about the requests and responses for the Anova Bluetooth LE API, see Communication Protocol.

Bluetooth Inspection

To learn how to inspect traffic between an Android phone and a Bluetooth LE device, see Bluetooth Low Energy Interception.

Acknowledgements

  • Luke Ma for generously giving me an Anova Precision Cooker as a Christmas present in 2020.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net6.0-windows10.0.19041 is compatible.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net8.0-windows10.0.19041 is compatible. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 is compatible.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.0.0-beta2 52 8/28/2024
0.0.0-beta1 75 8/19/2024