Install the SEN66 Driver

The driver installation consists of creating a Python virtual environment, activating it, and installing the driver using pip.

Create a Python virtual environment:

python -m venv .venv

Activate the virtual environment:

source .venv/bin/activate

Install the driver:

python -m pip install sensirion_i2c_sen66

Use the SensorBridge on Windows

  1. Install the driver for the Sensirion SEK-SensorBridge:

    python -m pip install sensirion-shdlc-sensorbridge
    
  2. Connect the SEK-SensorBridge to your PC over USB.

    If the SEK-SensorBridge is not detected by your system, follow the SensorBridge FTDI Driver Installation.

  3. Connect the SEN66 sensor to the SEK-SensorBridge.

  4. Run the example script from the root of the repository.

    By default, the script assumes that the SensorBridge is connected to the COM1 serial port. If a different port is used, specify it with the --serial-port parameter:

    python examples/example_usage_sensorbridge_sen66.py --serial-port <your COM port>
    

Example script

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# (c) Copyright 2026 Sensirion AG, Switzerland
#
#     THIS FILE IS AUTOMATICALLY GENERATED!
#
# Generator:     sensirion-driver-generator 1.7.0
# Product:       sen66
# Model-Version: 1.7.3
#

import argparse
import time
from sensirion_i2c_driver import I2cConnection, CrcCalculator
from sensirion_shdlc_driver import ShdlcSerialPort, ShdlcConnection
from sensirion_shdlc_sensorbridge import (SensorBridgePort,
                                          SensorBridgeShdlcDevice,
                                          SensorBridgeI2cProxy)
from sensirion_driver_adapters.i2c_adapter.i2c_channel import I2cChannel
from sensirion_i2c_sen66.device import Sen66Device

parser = argparse.ArgumentParser()
parser.add_argument('--serial-port', '-p', default='COM1')
args = parser.parse_args()

with ShdlcSerialPort(port=args.serial_port, baudrate=460800) as port:
    bridge = SensorBridgeShdlcDevice(ShdlcConnection(port), slave_address=0)
    bridge.set_i2c_frequency(SensorBridgePort.ONE, frequency=100e3)
    bridge.set_supply_voltage(SensorBridgePort.ONE, voltage=3.3)
    bridge.switch_supply_on(SensorBridgePort.ONE)
    i2c_transceiver = SensorBridgeI2cProxy(bridge, port=SensorBridgePort.ONE)
    channel = I2cChannel(I2cConnection(i2c_transceiver),
                         slave_address=0x6B,
                         crc=CrcCalculator(8, 0x31, 0xff, 0x0))
    sensor = Sen66Device(channel)
    sensor.device_reset()
    time.sleep(1.2)
    serial_number = sensor.get_serial_number()
    print(f"serial_number: {serial_number}; "
          )
    sensor.start_continuous_measurement()
    time.sleep(1.1)
    for i in range(100):
        try:
            time.sleep(1.0)
            (mass_concentration_pm1p0, mass_concentration_pm2p5, mass_concentration_pm4p0, mass_concentration_pm10p0, humidity,
             temperature, voc_index, nox_index, co2
             ) = sensor.read_measured_values()
            print(f"mass_concentration_pm1p0: {mass_concentration_pm1p0}; "
                  f"mass_concentration_pm2p5: {mass_concentration_pm2p5}; "
                  f"mass_concentration_pm4p0: {mass_concentration_pm4p0}; "
                  f"mass_concentration_pm10p0: {mass_concentration_pm10p0}; "
                  f"humidity: {humidity}; "
                  f"temperature: {temperature}; "
                  f"voc_index: {voc_index}; "
                  f"nox_index: {nox_index}; "
                  f"co2: {co2}; "
                  )
        except BaseException:
            continue
    sensor.stop_measurement()

Use the Linux I²C Driver

On Linux systems, the sensor can alternatively be accessed directly through the Linux user-space I²C driver.

  1. Connect the SEN66 sensor to an I²C port of your system, for example I²C port 1 of a Raspberry Pi.

  2. Run the example script from the root of the repository.

    By default, the script assumes that the sensor is connected to /dev/i2c-1. If a different port is used, specify it with the --i2c-port parameter:

    python examples/example_usage_linux_sen66.py --i2c-port <your I2C port>
    

Example script

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# (c) Copyright 2026 Sensirion AG, Switzerland
#
#     THIS FILE IS AUTOMATICALLY GENERATED!
#
# Generator:     sensirion-driver-generator 1.7.0
# Product:       sen66
# Model-Version: 1.7.3
#

import argparse
import time
from sensirion_i2c_driver import LinuxI2cTransceiver, I2cConnection, CrcCalculator
from sensirion_driver_adapters.i2c_adapter.i2c_channel import I2cChannel
from sensirion_i2c_sen66.device import Sen66Device

parser = argparse.ArgumentParser()
parser.add_argument('--i2c-port', '-p', default='/dev/i2c-1')
args = parser.parse_args()

with LinuxI2cTransceiver(args.i2c_port) as i2c_transceiver:
    channel = I2cChannel(I2cConnection(i2c_transceiver),
                         slave_address=0x6B,
                         crc=CrcCalculator(8, 0x31, 0xff, 0x0))
    sensor = Sen66Device(channel)
    sensor.device_reset()
    time.sleep(1.2)
    serial_number = sensor.get_serial_number()
    print(f"serial_number: {serial_number}; "
          )
    sensor.start_continuous_measurement()
    time.sleep(1.1)
    for i in range(100):
        try:
            time.sleep(1.0)
            (mass_concentration_pm1p0, mass_concentration_pm2p5, mass_concentration_pm4p0, mass_concentration_pm10p0, humidity,
             temperature, voc_index, nox_index, co2
             ) = sensor.read_measured_values()
            print(f"mass_concentration_pm1p0: {mass_concentration_pm1p0}; "
                  f"mass_concentration_pm2p5: {mass_concentration_pm2p5}; "
                  f"mass_concentration_pm4p0: {mass_concentration_pm4p0}; "
                  f"mass_concentration_pm10p0: {mass_concentration_pm10p0}; "
                  f"humidity: {humidity}; "
                  f"temperature: {temperature}; "
                  f"voc_index: {voc_index}; "
                  f"nox_index: {nox_index}; "
                  f"co2: {co2}; "
                  )
        except BaseException:
            continue
    sensor.stop_measurement()