SousVide 0.0.0-beta2
dotnet add package SousVide --version 0.0.0-beta2
NuGet\Install-Package SousVide -Version 0.0.0-beta2
<PackageReference Include="SousVide" Version="0.0.0-beta2" />
paket add SousVide --version 0.0.0-beta2
#r "nuget: SousVide, 0.0.0-beta2"
// 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
Bluetooth client library and protocol specification for the Anova Precision Cooker sous vide.
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.
- Install an older version of the app that still has the Bluetooth functionality.
- Use the sample program in this repository.
- Write your own .NET program using the client library in this repository.
- Don't write .NET? No problem. Write your own program in a language of your choice by following the protocol specification in this repository.
- 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
- Anova sous vide
- Tested on a Precision Cooker 1.0 with Bluetooth (2014,
Anova PC
)
- Tested on a Precision Cooker 1.0 with Bluetooth (2014,
- Bluetooth adapter
- Tested on a USB Asus USB-BT400 and onboard Intel AX211
- .NET Framework 4.6.2, 6.0, or later
Usage
Bluetooth Pairing
- Plug in the sous vide.
- Press its Bluetooth button to enter pairing mode. It will turn blue and start blinking.
- Scan for the sous vide in the Bluetooth settings of your operating system.
- Windows 10
- Go to Settings › Devices › Bluetooth & other devices > Add Bluetooth or other device › Bluetooth.
- Select
Anova
.
- Windows 11
- Go to Settings › Bluetooth & devices › Devices.
- Set Device settings › Bluetooth devices discovery to Advanced, otherwise the device will be hidden.
- Select Add device › Bluetooth.
- Select
Anova
.
- Windows 10
- Enter the PIN
0000
.
Command Line Tool
This sample program demonstrates Bluetooth connectivity and reference usage of the library.
- Download the
SousVideCtl
ZIP file for your operating system and CPU architecture from the latest release. - Extract the ZIP file.
- On Linux- and Unix-based operating systems, set the executable bit using
chmod +x sousvidectl
. - Run
./sousvidectl
.Current temperature: 73.0 °F Target temperature: 135.0 °F Start ↑↓ Set temperature Exit
- Press <kbd>S</kbd> to start and stop the sous vide.
- Press <kbd>↑</kbd> and <kbd>↓</kbd> to raise and lower the target temperature.
- Press <kbd>X</kbd> to exit.
.NET Library
Getting Started
- In your .NET project, add a dependency on the NuGet package
SousVide
.dotnet add package SousVide
- 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 likenet8.0
.<TargetFrameworks>net8.0-windows10.0.19041.0</TargetFrameworks>
- Connect to the paired sous vide.
await using ISousVide? sousVide = await AnovaPrecisionCooker.Create();
- 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 | Versions 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. |
-
.NETFramework 4.6.2
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
-
.NETStandard 2.0
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
-
net6.0
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
-
net6.0-windows10.0.19041
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
-
net8.0
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
-
net8.0-windows10.0.19041
- InTheHand.BluetoothLE (>= 4.0.37)
- KoKo (>= 2.3.0-beta1)
- UnitsNet (>= 5.57.0)
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 | 56 | 8/28/2024 |
0.0.0-beta1 | 81 | 8/19/2024 |