Lelo F1s V3 connects and authorises but does not respond to commands (macOS)

Note: I’m not a software/hardware engineer, so this report was put together with the help of Claude based on my logs and troubleshooting. Apologies if any of the technical framing is off — happy to clarify or test anything.


Summary

Lelo F1s V3 is detected, connects, completes the security tap authorisation, and is correctly identified by name as “Lelo F1s V3” in Intiface Central. However, moving either of the two vibration sliders in the Devices tab produces no response from the device. Commands appear to be sent (visible in log as write-without-response fallback to write-with-response), but the motors do not activate. Device is fully charged and works normally with the official Lelo app when connected on iOS.

The log shows the device is being handled by the lelo-f1sv2 protocol with identifier F1SV3, suggesting V3 detection is in place but the V2 command protocol may not be fully compatible with V3 hardware.

Environment

  • Intiface Central version: 3.0.4+40
  • Device config version: 4.197
  • OS: macOS Taho 26.5
  • Hardware: MacBook Pro 14" M2
  • Device: Lelo F1s V3, fully charged
  • Bluetooth: System Bluetooth on, Intiface granted Bluetooth permission in System Settings → Privacy & Security

Steps to reproduce

  1. Quit Lelo mobile app fully (force quit)
  2. Power on F1s V3
  3. Start Intiface Central server
  4. Start scanning in Devices tab
  5. Device appears in log, prompts for power button tap
  6. Tap power button on device — authorisation completes, device added as “Lelo F1s V3”
  7. Move either vibration slider in the Devices tab

Expected: Device vibrates in response to slider position.

Actual: No vibration. Device remains connected. Log shows write-with-response fallback warnings at the moment the slider is moved, but no error and no device response.

Already ruled out

  • Battery (fully charged)
  • Lelo app interference (force quit before scanning)
  • Reconnecting from scratch (toy fully off, then on, fresh scan, re-authorise)
  • Both feature indices (index 0 and index 1 sliders) tested at multiple intensities including 100%
  • System Bluetooth and Intiface Bluetooth permission confirmed working (device connects)
  • No other Bluetooth hosts connected to the F1s V3

Relevant log excerpt

26.687 Lelo F1s V2 isn't authorised: Tap the device's power button to complete connection.
[... repeated authorisation prompts ...]
28.298 Device map does not contain key 0.
28.298 Assigning index 0 to Lelo F1s V3
28.299 Updating device Lelo F1s V3 index to 0
28.299 Device connected: Lelo F1s V3
28.299 Device Added: 0 - Lelo F1s V3 - UserDeviceIdentifier { protocol: "lelo-f1sv2", identifier: Some("F1SV3"), address: "PeripheralId(eb1036f6-da6e-b74e-057e-82d037d1caeb)" }
28.299 ServerDeviceDefinition { name: "Lelo F1s V3", ... features: {0: ServerDeviceFeature { ... vibrate: Some(...) }, 1: ServerDeviceFeature { ... vibrate: Some(...) }} }
32.463 BTLEPlug device doesn't support write-without-response! Falling back to write-with-response!
33.322 BTLEPlug device doesn't support write-without-response! Falling back to write-with-response!

The two write-with-response warnings at 32.463 and 33.322 correspond directly to slider movements. No errors are logged after the writes.

Hypothesis

V3 hardware appears to be detected (correct device name and identifier F1SV3) but routed through the lelo-f1sv2 protocol handler. If the V3 uses a different command format or characteristic structure than the V2, writes would succeed at the BLE layer (hence no error) but the device would silently ignore them. This would match the observed behaviour.

I figured out the issue, the newer versions of the F1S V3 uses the same protocol as the F2S/Harmony. I was able to make it work locally by editing the buttplug-device-config-v4.json with the following changes:

@@ -11400,8 +11400,7 @@
           "btle": {
             "names": [
               "F1SV2A",
-              "F1SV2X",
-              "F1SV3"
+              "F1SV2X"
             ],
             "services": {
               "0000fff0-0000-1000-8000-00805f9b34fb": {
@@ -11423,13 +11422,6 @@
             "F1SV2X"
           ],
           "name": "Lelo F1s V2"
-        },
-        {
-          "id": "36adf7ce-98bf-4fad-b916-b44d20a5d9e1",
-          "identifier": [
-            "F1SV3"
-          ],
-          "name": "Lelo F1s V3"
         }
       ],
       "defaults": {
@@ -11481,6 +11473,7 @@
               "SONA3 Cruise",
               "Switch",
               "SURFER2",
+              "F1SV3",
               "F2"
             ],
             "services": {
@@ -11685,6 +11678,39 @@
           ],
           "name": "Lelo Switch"
         },
+        {
+          "features": [
+          {
+            "id": "90bd67a5-4601-4c49-97bb-0845ab7011ba",
+            "index": 0,
+            "output": {
+              "vibrate": {
+                "value": [
+                  0,
+                  100
+                ]
+              }
+            }
+          },
+          {
+            "id": "05fc758b-a3fe-4156-b3ae-9cdcb9ae95c6",
+            "index": 1,
+            "output": {
+              "vibrate": {
+                "value": [
+                  0,
+                  100
+                ]
+              }
+            }
+          }
+        ],
+          "id": "36adf7ce-98bf-4fad-b916-b44d20a5d9e1",
+          "identifier": [
+            "F1SV3"
+          ],
+          "name": "Lelo F1s V3"
+        },
         {

This shouldn’t be taken as a 100% fix though, I just pieced it together from this Issue: Some Lelo F1S-V3 models are using the Lelo Harmony protocol · Issue #679 · buttplugio/buttplug · GitHub

Looks like whatever they did wasn’t enough to fix it for newer firmwares maybe? My LELO app says F1SV3 F.REV.M.