Skip to main content

Add your description here

Project description

edifier_es300

Control an Edifier ES300 speaker over Wi-Fi, without the Edifier Home app. Ships an asyncio library and a click-based command-line interface.

  • Library (edifier_es300): stdlib-only, fully async.
  • CLI (python -m edifier_es300): thin wrapper over the library; needs click.

Requirements

  • Python 3.13+
  • click (CLI only — the library has no third-party dependencies)
uv sync        # or: pip install click

Library usage

Everything is async. The ES300 connection is an async context manager — reuse a single connection for a burst of commands (the device drops an idle socket after a few seconds).

import asyncio
from edifier_es300 import ES300, Source, EqPreset, LightEffect, LightColor

async def main():
    async with ES300("192.168.1.123", 8080) as device:
        print(await device.status())          # parsed Status (see below)

        await device.volume(20)               # 0..30
        await device.play()                   # resume
        await device.pause()                  # pause
        await device.play_pause_toggle()      # toggle
        await device.next_track()
        await device.prev_track()

        await device.input_source(Source.AIRPLAY)

        await device.light_switch(True)
        await device.brightness(60)           # 0..100
        await device.light_effect(LightEffect.BREATHING)
        await device.light_color(LightColor.YELLOW)

        await device.eq_preset(EqPreset.VOCAL)
        await device.eq_custom([10, 5, 0, 0, 0, -5])   # tenths of a dB (-30..30)

asyncio.run(main())

Discovery

ES300.discover() broadcasts on the LAN and returns a list of ready-to-use ES300 objects (host, port, and name filled in):

speakers = await ES300.discover(seconds=3.0)
for speaker in speakers:
    print(speaker)            # "EDIFIER ES300  192.168.1.123:8080"

async with speakers[0] as device:
    await device.volume(15)

Return values

  • Command methods (volume, play, input_source, eq_custom, …) return CommandResult, a tuple[bool, Status | None] of (acknowledged, new_state).
  • status() returns a Status | None (None only if the device stays silent).

Status

str(status) renders a human-readable dump (this is what the CLI status prints):

playing: - / - (status 0)
volume : 6 / 30
source : Source.AIRPLAY
effect : LightEffect.STATIC
color  : LightColor.YELLOW
eq     : EqPreset.CLASSIC gains=[0, 0, 0, 0, 0, 0]
battery: 100% (BatteryStatus.CONNECTED)

Fields: volume, max_volume, song, lyric, player_status, input_source, light_effect, sound_index, eq_selected_index, eq_gains, battery, and raw (the full status frame for anything not surfaced).

Enums

Enum Values Notes
Source BLUETOOTH=0, AUX=1, USB=2, AIRPLAY=3 input source
EqPreset CLASSIC=0, MONITOR=1, GAME=2, VOCAL=3, CUSTOMIZED=4 CUSTOMIZED is the editable slot
LightEffect STATIC=1, BREATHING=2, WATERFLOW=3 ambient LED effect
LightColor YELLOW, WHITE value is the RGB dict; hardware only does these two
BatteryStatus CONNECTED=1, DISCONNECTED=2 external power state (read-only)

Source, EqPreset, and LightEffect are IntEnums, so methods also accept a plain int. Setting eq_custom gains automatically selects EqPreset.CUSTOMIZED.

CLI usage

python -m edifier_es300 [--host IP] [--port N] COMMAND [ARGS]
  • --host — speaker IP. Omit it to auto-discover the first speaker on the LAN.
  • --port — control-channel TCP port (default 8080).
Command Args Description
discover list speakers on the LAN (name ip:port)
status dump volume / source / light / EQ / battery
vol LEVEL (0..30) set volume
play / pause resume / pause playback
play-pause toggle play/pause
next / prev skip track
light on | off LED strip on/off
light-brightness LEVEL (0..100) LED brightness
light-effect static | breathing | waterflow LED effect
light-color yellow | white LED color
source bluetooth | aux | usb | airplay input source
preset classic | monitor | game | vocal | customized EQ preset
eq GAINS... 6 custom gains, tenths of a dB (-30..30 = -3.0..+3.0 dB)

Examples

python -m edifier_es300 discover
python -m edifier_es300 status                       # auto-discover, then dump state
python -m edifier_es300 --host 192.168.1.123 vol 22
python -m edifier_es300 source airplay
python -m edifier_es300 light-effect breathing
python -m edifier_es300 light-color yellow
python -m edifier_es300 preset vocal
python -m edifier_es300 eq -- 10 5 0 0 0 -5          # use -- so negatives aren't read as options

Note: negative EQ gains look like CLI options, so prefix the gain list with --.

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

edifier_es300-0.1.1.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

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

edifier_es300-0.1.1-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file edifier_es300-0.1.1.tar.gz.

File metadata

  • Download URL: edifier_es300-0.1.1.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for edifier_es300-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1a3a0cc17f3ada10971615f2bc59c91189d4ac07fc15f181f7c8814e735b58c1
MD5 1e8663910a72c2857d11c29818477f2a
BLAKE2b-256 ad4375a7379081f99eadf95d689278ffc5f7c1fb7a59ba7c150dab338bc0112a

See more details on using hashes here.

File details

Details for the file edifier_es300-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: edifier_es300-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for edifier_es300-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fe2f5d1e18c8b6a1bffbe28cc1e825462b8f0659596bea5d4f91f87c08908c25
MD5 7307c36e26a1507126a625fd4c911456
BLAKE2b-256 e52be66ff726e46380d330ba7de8930ea449e3e5d62a1d30ffda7c096655d147

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