Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add passive support for GV5121/GV5122/GV5123/GV5125/GV5126 #89

Merged
merged 1 commit into from
Jul 16, 2024

Conversation

bdraco
Copy link
Member

@bdraco bdraco commented Jul 16, 2024

A lot of this is a guess

@bdraco bdraco merged commit 83ac0d5 into main Jul 16, 2024
6 of 7 checks passed
@bdraco bdraco deleted the govee_passive branch July 16, 2024 00:16
key = time_ms + bytes(12)
try:
decrypted = decrypt_data(key, enc_data)
except ValueError:
_LOGGER.warning("Failed to decrypt H512x: %s", hex(data))
return
model_id = decrypted[2]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gh2o model_id is a guess here. It seems to hold up as I bought multiple of the same device to confirm it, but it would be great if you had some insight here since I feel like I'm poking around in the dark with this one.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I only have the H5122 (single button), and the FW appears to hard-code decrypted[0/1/2/3] so I'm not entirely sure what the meaning of these bytes are.

One possible hint though is that the FW code does different operations to assign to those bytes. To summarize, it does something like this:

decrypted[0] = ord('1') - 0x30
decrypted[1] = ord('5') - 0x30
decrypted[2] = 8
decrypted[3] = 2

If I had to venture a wild guess, the meaning of the numbers would be:

  • decrypted[0] = version (major)
  • decrypted[1] = version (minor)
  • decrypted[2] = model ID
  • decrypted[3] = number of data bytes following this byte

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make sense to do

"GV5121" in local_name and model_id == 3

instead of or so that if this invariant breaks in the future, we can catch it?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The local name is empty when the scanner is passive

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I bought another motion sensor and 2 button remote. This pattern held true so I think we are ok here at least for now

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, good to know.

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.

2 participants