stpihkal
stpihkal copied to clipboard
Lovense: add more information and make formatting consistent
I intend to do more research and work on these docs. However, last time I told myself that I got distracted and never submitted my changes, so here's a start, with hopefully more to follow.
Irritatingly, Lovense appears to have renamed "Quake" to "Dolce" as of today (for trademark reasons): https://www.xbiz.com/news/261947/lovense-renames-new-dual-motor-stimulator-quake-to-dolce. But as all of the products that people currently have say "Quake" on them, I think it's okay to leave this as-is for now. It can be addressed in a follow-up PR.
Unvetted observations:
- Firmware updates work by running the
DFU;
command (in-band), which then enables this separate Bluetooth service with DFU operations: https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v4.x.x/doc/html/group__dfu__ble__service__spec.html- After running
DFU
on aDomi
, it shuts the service and opens a new one advertising itself asDfuDomi
- After running
- The
Gsensor
andBeginMove
commands seems to have been replaced withBM
([B]egin[M]ove). - The
StopMove
command appears to have been replaced withEM
([E]nd[M]ove). - The
AW
([A]larm[W]rite) command can be used to set alarms (delayed activations of the toy). Up to ten alarms can be stored. The first argument is the alarm ID (0-9
). The second is the vibration strenght of the alarm (0-20
). The third is how many seconds away the alarm is. The fourth is how many seconds the alarm should run for. - The
AG
([A]larm[G]et) command a list of digits corresponding the IDs of pending alarms, ornull
if none are pending. - The
AC
([A]larm[C]ancel) andAD
([A]larm[D]elete) commands both delete the alarm with the specified index from the device. -
AIW
writes some kind of value thatAI
returns. It must contain at least one colon. My best guess is that it's used for some kind-of alarm metadata (ordering?) that isn't relevant to the on-device behaviour but is useful to maintain across apps, but I could be way off. -
Remove:N
deletes a pattern saved on the device, by index, returns what looks like it might be the number of bytes of preset storage now available on the device. -
Pl
commands can be used to set patterns in the same format asGetPatten
returns them, except withPl
instead ofP
. Patterns can consist of up to 100 segments each of 10 half-second levels from 0 to 9. If all 100 segments are used, 100 is indicated with aj
instead of100
to save characters. - The "s" in the battery prefix when there is high power draw might be for "skip", because the result value seems to be a lot less accurate in these cases.
edit: I see that some of this was already discussed in https://github.com/buttplugio/stpihkal/issues/70#issuecomment-894040491
The fully-detailed g-sensor data appears to be gone (or at least, I can't figure out where it is), replaced with a stream of simple values from 0
to 4
indicating amount of motion, formatted as M:S0
to M:S4
for Max, and the same but with ,O1
appended for non-0 values from Nora. (These after after BM
is sent, until EM
is sent.)
The fully-detailed g-sensor data appears to be gone (or at least, I can't figure out where it is), replaced with a stream of simple values from
0
to4
indicating amount of motion, formatted asM:S0
toM:S4
. (These after afterBM
is sent, untilEM
is sent.)
Yeah from what I heard, this happened quite a while ago? Not exactly sure when, might be nice to at least bound it by firmware versions, but we'd have to find the switch point. Worse comes to worse, can just ask Lovense heh.
Aha! It looks like BT:On
and BT:Off
give us the raw accelerometer data on Nora (prefixed with BT:
instead of G:
), but on Max it seems to just return one bit of motion information, BT0
or BT1
.
There appears to be some Max-specific command for integration with the game https://www.mirrorlife.com/. Mirr:1
and Mirr:0
are valid commands. I'm not sure exactly what we do, but the game seems to use the toy's buttons as controls for the game itself, so... let's see...
while enabled, the buttons on the Max send MirLife:1
and MirLife:2
instead of controlling the toy.
So just checking: Should I hold off on bringing this branch PR in until you finish doing research? :)
@qdot Doesn't really matter, but I suggest going ahead and merging at your convenience.
I think it would be nice to have the formatting/consistency merged so that the next PR's substance changes are easier to see on their own.
I'm just shoving notes in this thread so they're findable by others.
...hah, there are official docs for the web API whose command names give us more bluetooth command names: https://www.lovense.com/sextoys/developer/doc
AVibrate:1:2
will vibrate at level 1
for duration 2
seconds
There are similar device-specific ARotate
, AAirLevel
, AVibRotate
, AVibAir
, AVibrate1
, AVibrate2
The Flash
command flashes the light on the toy three times. This occurs even if the light has been disabled with Light:off
.
Here are some example sessions testing commands for compatibility across devices: https://gist.github.com/teledildonics-dev/03a861302270c8eaaa1a2a76c95a4ffd