Skip to main content

ESP32IO is a Python API that turns an ESP32‑S3 into a USB‑connected I/O device.

Project description

ESP32IO Python API

日本語 / English


日本語

ESP32IO は、ESP32-S3 を USB シリアル経由で Python から扱うための軽量クライアントです。 ESP32 側で JSON コマンドを受け取るファームウェアと組み合わせることで、デジタル入出力、ADC、PWM をシンプルな Python API で操作できます。

特徴

  • USB シリアル経由で ESP32-S3 と通信
  • JSON プロトコルを ESP32IO クラスが隠蔽
  • ping、DIO、ADC、PWM、全体状態取得をサポート
  • PWM 周波数と分解能の取得・更新をサポート
  • タイムアウト、プロトコル不整合、ESP32 側エラーを例外として統一処理
  • 低レベル API command() も用意

動作環境

  • Python 3.8 以上
  • pyserial>=3.5
  • 対応する ESP32-S3 ファームウェア

インストール

開発中のローカル環境で使う場合:

pip install -e .

依存関係だけ入れる場合:

pip install -r requirements.txt

クイックスタート

from esp32io import ESP32IO

esp = ESP32IO("COM4", debug=False, recv_timeout=2.0)

print("ping =", esp.ping())
print("di0 =", esp.read_di(0))
print("adc0 =", esp.read_adc(0))
print("pwm config =", esp.get_pwm_config())

esp.set_do(0, 1)
esp.set_pwm(0, 128)

state = esp.get_io_state()
print(state)

esp.close()

サンプル実行:

py -m examples.esp32io_sample

API 一覧

  • ESP32IO(port, baud=115200, timeout=2.0, debug=False, recv_timeout=None) シリアルポートを開いて ESP32 に接続します。
  • ping() -> bool 疎通確認を行い、pong 応答を検証します。
  • read_di(pin_id) -> int デジタル入力を 0 または 1 で返します。
  • set_do(pin_id, value) -> dict デジタル出力を設定します。
  • read_adc(pin_id) -> int ADC 値を返します。
  • set_pwm(pin_id, duty) -> dict PWM デューティを設定します。
  • get_pwm_config() -> dict PWM の周波数 (freq) と分解能 (res) を返します。
  • set_pwm_config(freq, res) -> dict PWM の周波数と分解能を設定して、適用後の値を返します。
  • get_io_state() -> dict DIO、ADC、PWM の状態をまとめて返します。
  • command(cmd, **kwargs) -> dict 任意の JSON コマンドを送る低レベル API です。
  • close() -> None シリアルポートを閉じます。

例外

  • ESP32IOError ESP32 が status=error を返した場合
  • ESP32IOTimeoutError 応答待ちがタイムアウトした場合
  • ESP32IOProtocolError JSON 不正や期待しない応答を受けた場合

想定コマンド

このクライアントは、少なくとも以下のコマンドを実装したファームウェアを前提にしています。

  • ping
  • read_di
  • set_do
  • read_adc
  • set_pwm
  • get_pwm_config
  • set_pwm_config
  • get_io_state

プロジェクト構成

.
├── esp32io/
│   ├── __init__.py
│   ├── client.py
│   ├── exceptions.py
│   └── protocol.py
├── examples/
│   └── esp32io_sample.py
├── pyproject.toml
├── requirements.txt
├── LICENSE
└── README.md

ファームウェアについて

この Python パッケージ自体には ESP32 側ファームウェアは含まれていません。 別途、同じ JSON コマンド仕様に従う ESP32-S3 ファームウェアを用意してください。

ファームウェア:
https://github.com/noritama-lab/esp32io-firmware

ライセンス

MIT License

Copyright (c) 2026 Noritama-Lab


English

ESP32IO is a lightweight Python client for controlling an ESP32-S3 over USB serial. When paired with firmware that accepts JSON commands, it provides a small and practical API for digital I/O, ADC, and PWM control.

Features

  • USB serial communication with ESP32-S3
  • JSON protocol hidden behind the ESP32IO client
  • Support for ping, DIO, ADC, PWM, and full I/O state reads
  • Support for reading and updating PWM frequency and resolution
  • Unified exception handling for device errors, timeouts, and protocol issues
  • Includes a low-level command() API for custom commands

Requirements

  • Python 3.8+
  • pyserial>=3.5
  • Compatible ESP32-S3 firmware

Installation

For local development:

pip install -e .

To install dependencies only:

pip install -r requirements.txt

Quick Start

from esp32io import ESP32IO

esp = ESP32IO("COM4", debug=False, recv_timeout=2.0)

print("ping =", esp.ping())
print("di0 =", esp.read_di(0))
print("adc0 =", esp.read_adc(0))
print("pwm config =", esp.get_pwm_config())

esp.set_do(0, 1)
esp.set_pwm(0, 128)

state = esp.get_io_state()
print(state)

esp.close()

Run the sample:

py -m examples.esp32io_sample

API Summary

  • ESP32IO(port, baud=115200, timeout=2.0, debug=False, recv_timeout=None) Opens the serial port and prepares the client.
  • ping() -> bool Verifies connectivity by checking for a pong response.
  • read_di(pin_id) -> int Reads a digital input and returns 0 or 1.
  • set_do(pin_id, value) -> dict Sets a digital output.
  • read_adc(pin_id) -> int Reads an ADC value.
  • set_pwm(pin_id, duty) -> dict Sets a PWM duty cycle.
  • get_pwm_config() -> dict Returns PWM frequency (freq) and resolution (res).
  • set_pwm_config(freq, res) -> dict Updates PWM frequency and resolution, then returns the applied values.
  • get_io_state() -> dict Returns DIO, ADC, and PWM state in one response.
  • command(cmd, **kwargs) -> dict Low-level API for sending custom JSON commands.
  • close() -> None Closes the serial port.

Exceptions

  • ESP32IOError Raised when the device returns status=error
  • ESP32IOTimeoutError Raised when waiting for a response times out
  • ESP32IOProtocolError Raised for invalid JSON or unexpected responses

Expected Firmware Commands

The client expects firmware that implements at least these commands:

  • ping
  • read_di
  • set_do
  • read_adc
  • set_pwm
  • get_pwm_config
  • set_pwm_config
  • get_io_state

Project Structure

.
├── esp32io/
│   ├── __init__.py
│   ├── client.py
│   ├── exceptions.py
│   └── protocol.py
├── examples/
│   └── esp32io_sample.py
├── pyproject.toml
├── requirements.txt
├── LICENSE
└── README.md

Firmware

This repository contains the Python package only. Prepare separate ESP32-S3 firmware that follows the same JSON command protocol.

Firmware repository:
https://github.com/noritama-lab/esp32io-firmware

License

MIT License

Copyright (c) 2026 Noritama-Lab

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

esp32io-0.1.2.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

esp32io-0.1.2-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file esp32io-0.1.2.tar.gz.

File metadata

  • Download URL: esp32io-0.1.2.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for esp32io-0.1.2.tar.gz
Algorithm Hash digest
SHA256 993307d7ae146507dd94966676716b710dc9368e78114722c637815eb63ea178
MD5 606f06a6c625d1a8709e468b177c5d2a
BLAKE2b-256 594cdc46b92d5e3787adc05fcd42368fc237bfe19016f397c4611265c3c74e5c

See more details on using hashes here.

File details

Details for the file esp32io-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: esp32io-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 8.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for esp32io-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 78f37f6a0927da7f98a9d9b786439449820a6f164d5f60838936f2d4ed417c79
MD5 89960d4dfdb1159fad0cfdcf0240fa89
BLAKE2b-256 486bc55202cf035946788d49f154a4a193a91637a410590f7c44d225dcee6fc0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page