storz-rs 0.2.1

Rust library for controlling Storz & Bickel vaporizers via Bluetooth Low Energy
Documentation

storz-rs

Control your Storz & Bickel vaporizers from Rust via Bluetooth Low Energy.

crates.io docs.rs CI License: MIT

A Rust library for controlling Storz & Bickel vaporizers over BLE. Built on btleplug for cross-platform support. Protocol reverse-engineered from reactive-volcano-app.

Storz & Bickel devices

Supported Devices

Device Tested Notes
Venty Full support: temp, heater, boost, brightness, vibration, settings
Volcano Hybrid Full support: temp, heater, pump, fan, workflow automation
Veazy 🔬 Same protocol as Venty
Crafty+ 🔬 Temp, heater, boost, LED brightness, factory reset

Venty and Volcano Hybrid have been verified with real hardware. Veazy and Crafty+ should work based on the shared protocol but haven't been tested yet. If you have one and want to help test, open an issue.

Quick Start

use std::time::Duration;
use futures::StreamExt;
use storz_rs::{connect, discover_vaporizers, get_adapter};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let adapter = get_adapter().await?;
    let peripherals = discover_vaporizers(&adapter, Duration::from_secs(10)).await?;

    let device = connect(peripherals.into_iter().next().unwrap()).await?;

    device.set_target_temperature(185.0).await?;
    device.heater_on().await?;

    // Stream live state updates from BLE notifications
    let mut state = device.subscribe_state().await?;
    while let Some(s) = state.next().await {
        println!("{s}");
    }
    Ok(())
}

Installation

[dependencies]
storz-rs = "0.2"

API

Full docs at docs.rs/storz-rs.

  • discover_vaporizers() — BLE scan for S&B devices
  • connect() — auto-detect model, connect, run init sequence
  • VaporizerControl trait — uniform async API across all devices
Method Volcano Venty Veazy Crafty
get_current_temperature
get/set_target_temperature
heater_on/off
pump_on/off
set_brightness
set_vibration
set_boost_temperature
set_auto_shutdown_timer
factory_reset
find_my_device
get_device_info
subscribe_state

pump_on/off returns UnsupportedOperation on devices without a pump.

Platform Support

Platform BLE Backend Status
Linux BlueZ
macOS CoreBluetooth
Windows WinRT

Requires a BLE adapter.

Troubleshooting

BlueZ needs permissions to start BLE scans.

Arch Linux — no bluetooth group, use polkit:

sudo tee /etc/polkit-1/rules.d/50-bluetooth.rules << 'EOF'
polkit.addRule(function(action, subject) {
    if (action.id === "org.bluez.Adapter.StartDiscovery" ||
        action.id === "org.bluez.Adapter.SetDiscoveryFilter") {
        return polkit.Result.YES;
    }
});
EOF

Debian/Ubuntu/Fedora — add yourself to the bluetooth group:

sudo usermod -aG bluetooth $USER

Log out and back in after.

rfkill unblock bluetooth
bluetoothctl power on
systemctl status bluetooth

Companion Client

Looking for a ready-to-use terminal app? Check out fumar — a TUI + CLI client built on storz-rs.

cargo install fumar
fumar           # TUI mode
fumar --cli status  # CLI mode

Contributing

Fork, branch, PR. Run before submitting:

cargo fmt && cargo clippy -- -D warnings

Especially interested in testing on real hardware for Volcano Hybrid, Veazy, and Crafty+.

Disclaimer

Not affiliated with Storz & Bickel GmbH. Use at your own risk. This is unofficial reverse-engineered software.

License

MIT — see LICENSE.