Betree / magicblue

đź’ˇ Unofficial Python API to control Magic Blue bulbs over Bluetooth
MIT License
101 stars 23 forks source link

question: other lights #48

Open orrpan opened 5 years ago

orrpan commented 5 years ago

I'm almost done implementing an other bulb, the functions are of the same but other byte arrays and a little other stuff. For a later pull request, do you prefer a new ....lib.py file so that the repo becomes a more of a python bulbblue package or trying smashing everything into one?

I still have decoding the read response packages and the timer functions.

Betree commented 5 years ago

Hi @orrpan, having other bulbs supported would be really interesting if you can re-use the existing code to do it :slightly_smiling_face: Can you provide more info about the manufacturer / model?

orrpan commented 5 years ago

Okey, I’ll make another lib file. Model and brand is unknown, it’s the onces with speaker and rgb light. The most “name” of them that I have figured out is the app name, “My Light”.

I still have the decoding of sound and alarm left.

But all colors, on/off, brightness, effects and white is done (and the algorithm for generating their checksum)

Edit: I’ve not decoded the responses when action is sent. Also when connected it is possible to tigger the bulb to send all current values, this will be done when everything else is done

orrpan commented 5 years ago

@Betree I figured out all checksums. Was really easy all bytearrays (2-byte addition) has to be a total value ((256* no_of_byte_in_msg/2)-1), so the "checksum" is the diff that is missing (((256* no_of_byte_in_msg/2)-1)-(msg_sum_2_byte_additon)) mod 256 .

I do have some problem with receiving, the handler 0x000e is the one to read from (with gatttool) but it does not give me any value. I can see in my wireshark log how a response is sent from the bulb at this handler (after an wirte request is done), but it does not seems to stored as "last message".

Any good guesses? I've tried gattool --listen, to see if any response will arrive but no luck. It seems like the answer is sent directly but I'm too slow/not synced to read it.

Snippet from wireshark

No. Time        Source          Destination     Protocol Length Value        Info
1   0.000000    localhost ()    remote ()       ATT      18     55aa000516e5 Sent Write Request, Handle: 0x000c (Unknown)
2   0.014610    controller      host            HCI_EVT  8                   Rcvd Number of Completed Packets
3   0.051736    remote ()       localhost ()    ATT      10                  Rcvd Write Response, Handle: 0x000c (Unknown)
4   0.053509    localhost ()    remote ()       ATT      12                  Sent Read Request, Handle: 0x000e (Unknown)
5   0.070489    controller      host            HCI_EVT  8                   Rcvd Number of Completed Packets
6   0.108053    remote ()       localhost ()    ATT      16     55aa00851764 Rcvd Read Response, Handle: 0x000e (Unknown)

Edit: It is not really necessary to get the response for every packet but for the current status if bulb is disconnected and connected would be good

orrpan commented 5 years ago

The whole No 4, Sent Read Req

No.     Time           Source                Destination           Protocol Length Value      Info
      4 0.053509       localhost ()          remote ()             ATT      12                Sent Read Request, Handle: 0x000e (Unknown)

Frame 4: 12 bytes on wire (96 bits), 12 bytes captured (96 bits)
    Encapsulation type: Bluetooth H4 with linux header (99)
    Arrival Time: Jan 17, 2019 17:50:51.082293000 CET
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1547743851.082293000 seconds
    [Time delta from previous captured frame: 0.001773000 seconds]
    [Time delta from previous displayed frame: 0.001773000 seconds]
    [Time since reference or first frame: 0.053509000 seconds]
    Frame Number: 4
    Frame Length: 12 bytes (96 bits)
    Capture Length: 12 bytes (96 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    Point-to-Point Direction: Sent (0)
    [Protocols in frame: bluetooth:hci_h4:bthci_acl:btl2cap:btatt]
Bluetooth
    [Source: 00:00:00_00:00:00 (00:00:00:00:00:00)]
    [Destination: 00:00:00_00:00:00 (00:00:00:00:00:00)]
Bluetooth HCI H4
    [Direction: Sent (0x00)]
    HCI Packet Type: ACL Data (0x02)
Bluetooth HCI ACL Packet
    .... 0000 0000 1111 = Connection Handle: 0x00f
    ..00 .... .... .... = PB Flag: First Non-automatically Flushable Packet (0)
    00.. .... .... .... = BC Flag: Point-To-Point (0)
    Data Total Length: 7
    Data
    [Expert Info (Error/Protocol): Frame is out of any "connection handle" session]
        [Frame is out of any "connection handle" session]
        [Severity level: Error]
        [Group: Protocol]
    [Source BD_ADDR: 00:00:00_00:00:00 (00:00:00:00:00:00)]
    [Source Device Name: ]
    [Source Role: Unknown (0)]
    [Destination BD_ADDR: 00:00:00_00:00:00 (00:00:00:00:00:00)]
    [Destination Device Name: ]
    [Destination Role: Unknown (0)]
    [Current Mode: Unknown (-1)]
Bluetooth L2CAP Protocol
    Length: 3
    CID: Attribute Protocol (0x0004)
Bluetooth Attribute Protocol
    Opcode: Read Request (0x0a)
        0... .... = Authentication Signature: False
        .0.. .... = Command: False
        ..00 1010 = Method: Read Request (0x0a)
    Handle: 0x000e (Unknown)
    [Response in Frame: 6]

0000  02 0f 00 07 00 03 00 04 00 0a 0e 00               ............
orrpan commented 5 years ago

Up and running, shell works (besides getting any feedback from the bulb...) repo Home Assistant kinda works, rgb does not for some reason. repo Don't know if I should just have an own fork or try to merge it, what do you think?