Skip to content

Support Lelo F1s V3 as Harmony protocol - #920

Open
aabbccddeeeeee wants to merge 1 commit into
buttplugio:masterfrom
aabbccddeeeeee:agent/support-lelo-f1sv3
Open

Support Lelo F1s V3 as Harmony protocol#920
aabbccddeeeeee wants to merge 1 commit into
buttplugio:masterfrom
aabbccddeeeeee:agent/support-lelo-f1sv3

Conversation

@aabbccddeeeeee

Copy link
Copy Markdown

Summary

  • Move F1SV3 matching from the F1S V2 protocol to the Lelo Harmony protocol
  • Add an F1SV3 Harmony protocol variant that sends a zero pattern when stopping vibration
  • Add protocol tests for F1SV3 command encoding

Root cause

F1SV3 advertises similarly to the existing F1S V2 entry, but tested hardware exposes Harmony-style control characteristics and does not respond to the F1S V2 motor payloads. The device vibrates with Harmony-style writes to the tx characteristic and requires a different zero-speed stop payload.

Testing

  • cargo test -p buttplug_server lelo_harmony::test
  • cargo test -p buttplug_tests --test test_device_protocols lelo_harmony_protocol
  • cargo test -p buttplug_tests --test test_device_protocols lelo_f1s_v2_protocol
  • Manual test with LELO F1S V3 on macOS/Intiface Central

@CLAassistant

CLAassistant commented Jul 21, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@aabbccddeeeeee
aabbccddeeeeee marked this pull request as ready for review July 21, 2026 23:47
@blackspherefollower

Copy link
Copy Markdown
Collaborator

I wonder if my v3 is of an earlier generation that did support the original control structure too...

@blackspherefollower
blackspherefollower self-requested a review July 22, 2026 10:40
@blackspherefollower blackspherefollower self-assigned this Jul 22, 2026
@aabbccddeeeeee
aabbccddeeeeee force-pushed the agent/support-lelo-f1sv3 branch from a6e3603 to c22ad03 Compare July 22, 2026 23:11
@jayyyyyyyyy

Copy link
Copy Markdown

Hi all,

I am having an issue here as well and claude told me to comment this:
Device: Lelo F1S V3
Firmware: F1SV3 F.REV.M
Intiface version: 3.1.1+43 (Android)
Symptom: Device connects, sensor inputs register, no motor output
Log error: Characteristic rx (00000a04-0000-1000-8000-00805f9b34fb) not found
nRF Connect findings: 0x0A04 does not exist on this device. Device advertises a 0xFFF0 service with 0xFFF1 (READ, WRITE) and 0xFFF2 (NOTIFY, READ, WRITE), consistent with Harmony protocol.

Thanks

@aabbccddeeeeee
aabbccddeeeeee force-pushed the agent/support-lelo-f1sv3 branch from c22ad03 to 81be9bb Compare August 24, 2026 14:20
@aabbccddeeeeee

Copy link
Copy Markdown
Author

This PR has been updated and rebased on current master.

Summary of the current patch:

  • Adds LELO F1S V3 as a separate protocol instead of treating F1SV3 as lelo-f1sv2.
  • Removes the F1SV3 name match from the existing F1S V2 protocol to avoid probing V2-only characteristics.
  • Adds a dedicated lelo-f1sv3 config using the observed Harmony-style BLE layout:
    • service 0xFFF0
    • 0xFFF1 read/write
    • 0xFFF2 notify/read/write
  • Avoids the V2-only rx / whitelist characteristics that are not present on F1S V3 devices.
  • Adds an F1S V3 initializer that performs the observed authorization handshake and then routes output through the Harmony-style command path.
  • Adds protocol tests for F1S V3.
  • Keeps existing F1S V2 behavior unchanged.

Runtime testing on a physical LELO F1S V3 confirmed that vibration output works with this implementation.

The implementation also includes an optional smoothing/filtering path for very rapid vibration changes. This is intended to improve behavior with dense beat/script patterns where the device can otherwise miss short pulses or produce gaps. The
smoothing behavior is configurable and should not silently change behavior for devices/users that do not want it.

Validation performed locally:

  • cargo build -p buttplug_server_device_config
  • cargo test -p buttplug_tests --test test_device_protocols lelo_f1s_v3_protocol

The PR branch was force-pushed to replace the older conflicting commit with a clean single commit based on current master.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants