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

Working RA3 Support for Pairing, Switches/Dimmers, Sunnata Keypads and PICOs #101

Merged
merged 27 commits into from Aug 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2bf0025
Initial Support for RA3
Feb 8, 2022
e6469bb
update compatablity for homeassistant lutron_caseta component
May 1, 2022
feff305
add pairing compatibility for ra3 processors
May 1, 2022
5f42dad
Query /project to determine bridge type instead of empty /device resp…
May 2, 2022
8a772df
Merge pull request #2 from danaues/ra3
johninaustin May 4, 2022
498f344
Fix import of controldevices without serialnumber
May 4, 2022
c2ec516
Merge branch 'johninaustin:ra3' into ra3
danaues Jun 27, 2022
a96a5fd
Add Sunnata Keypad Button Support
danaues Jun 30, 2022
bf1e31d
Merge branch 'ra3' of github.com:danaues/pylutron-caseta into ra3
danaues Jun 30, 2022
c00a5b3
Merge remote-tracking branch 'upstream/dev' into ra3
danaues Jun 30, 2022
fc99eb4
Fixed Pairing error resutling from last merge with upstream (ready ar…
danaues Jun 30, 2022
673a635
update code based on suggestions from mdonoughe
danaues Jul 14, 2022
902a0cd
undo passing None serial in _load_ra3_zones until serial discussion i…
danaues Jul 14, 2022
395daaa
revise multi and single zone status handling to share common method a…
danaues Jul 14, 2022
080933c
remove false serialization and return non for serial of zones and but…
danaues Jul 15, 2022
50d1a9b
remove unused import
mdonoughe Aug 9, 2022
71fcde7
remove unused return value
mdonoughe Aug 9, 2022
af695f1
fix initial status loading for caseta
mdonoughe Aug 9, 2022
a0adf9f
fix lint issues
mdonoughe Aug 9, 2022
fe583fc
add missing project read
mdonoughe Aug 9, 2022
df04e33
update changelog
mdonoughe Aug 9, 2022
92fe96a
Merge pull request #6 from mdonoughe/ra3
danaues Aug 9, 2022
bf83561
Fix tests for RA3 support
danaues Aug 9, 2022
3c70b0c
Fix Python3.10 linting issues with test_smartbridge.py
danaues Aug 11, 2022
6c9eee4
put back missing module docstring
mdonoughe Aug 13, 2022
b6863a3
constants for different processor types
mdonoughe Aug 13, 2022
fcdf7ec
move changes to correct changelog section
mdonoughe Aug 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added
- Support for RadioRA 3.
- Support for RadioRA 2 InLineDimmer and InLineSwitch.

## [0.14.0] - 2022-06-18

### Added
Expand Down
32 changes: 31 additions & 1 deletion pylutron_caseta/__init__.py
Expand Up @@ -5,22 +5,40 @@
from .messages import Response, ResponseStatus

_LEAP_DEVICE_TYPES = {
"light": ["WallDimmer", "PlugInDimmer"],
"light": [
"WallDimmer",
"PlugInDimmer",
"InLineDimmer",
"SunnataDimmer",
"TempInWallPaddleDimmer",
"WallDimmerWithPreset",
"Dimmed",
mdonoughe marked this conversation as resolved.
Show resolved Hide resolved
],
"switch": [
"WallSwitch",
"OutdoorPlugInSwitch",
"PlugInSwitch",
"InLineSwitch",
"PowPakSwitch",
"SunnataSwitch",
"TempInWallPaddleSwitch",
"Switched",
],
"fan": [
"CasetaFanSpeedController",
"MaestroFanSpeedController",
"FanSpeed",
],
"cover": [
"SerenaHoneycombShade",
"SerenaRollerShade",
"TriathlonHoneycombShade",
"TriathlonRollerShade",
"QsWirelessShade",
"QsWirelessHorizontalSheerBlind",
"QsWirelessWoodBlind",
"RightDrawDrape",
"Shade",
"SerenaTiltOnlyWoodBlind",
],
"sensor": [
Expand All @@ -34,6 +52,18 @@
"Pico4ButtonZone",
"Pico4Button2Group",
"FourGroupRemote",
"SeeTouchTabletopKeypad",
"SunnataKeypad",
"SunnataKeypad_2Button",
"SunnataKeypad_3ButtonRaiseLower",
"SunnataKeypad_4Button",
"SeeTouchHybridKeypad",
"SeeTouchInternational",
"SeeTouchKeypad",
"HomeownerKeypad",
"GrafikTHybridKeypad",
"AlisseKeypad",
"PalladiomKeypad",
],
}

Expand Down
48 changes: 48 additions & 0 deletions pylutron_caseta/assets.py
Expand Up @@ -85,3 +85,51 @@
uHnNjMTXCVxNy4tkARwLRwI+1aV5PMzFSi+HyuWmBaWOe19uz3SFbYs=
-----END RSA PRIVATE KEY-----
"""

LUTRON_ROOT_CA_PEM = """
-----BEGIN CERTIFICATE-----
MIIH5DCCBMygAwIBAgIJAKk++JqaJetSMA0GCSqGSIb3DQEBCwUAMH8xCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJQQTELMAkGA1UEBwwCQ0IxHzAdBgNVBAoMFkx1dHJv
biBFbGVjdHJvbmljcyBJbmMxHzAdBgNVBAsMFkx1dHJvbiBFbGVjdHJvbmljcyBJ
bmMxFDASBgNVBAMMC2x1dHJvbi1yb290MB4XDTE2MDkyODE5NTk0MVoXDTM2MDky
MzE5NTk0MVowfzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlBBMQswCQYDVQQHDAJD
QjEfMB0GA1UECgwWTHV0cm9uIEVsZWN0cm9uaWNzIEluYzEfMB0GA1UECwwWTHV0
cm9uIEVsZWN0cm9uaWNzIEluYzEUMBIGA1UEAwwLbHV0cm9uLXJvb3QwggMiMA0G
CSqGSIb3DQEBAQUAA4IDDwAwggMKAoIDAQDBZbMODMzm+qpsOF5hhQ272GUlOaKz
n5b5YxokSAoxY4TqQApb9/uRHIBuuGLntq0QhR0Y3b0lXBeJWzWC6zscZJrheUKW
+2aHVvU4ugPAAXK/WVI68adBSY1UP0BcO1paYrXONcuXQgdy2/GV1mo1b+bmjNFT
zeDopkUoBxivBDZZ7B5vFfbJSgSF47Xsz8cspCEUIaV1rZbaDYBzsimdvrKusJfZ
Pci+Cx71sZuKunGTCgwHduYFsBfYRgTG1ihNEASi2++Er67AcabUGaqVQr/kIrUD
sS9jB6uaqPgMajjwXiZPDm82tTHobbKSav7aq+kSBNIFyvhK5y+vAWoGeZr5WK7n
9EekO3x7LXc6XSCASuhzK6zquAGUBSQNEO3c7sZ1rIdNs1lBSkCSxs+Bl8eEHO8k
O20TqKzKF9bQtccNkFWtRKIhVLFxQt234P+XJtWvWKVOlkLCAo0QgDivFJQVnNKM
Hr2/CIsOLC+ZSWAYl0lZEJaszt7wjR9cc7DRizq9aoKcGlPRvxzobFoQ4H0Z8vIR
DQRUQWFaTTOGiEk7JKxqjXX8xuGZpoXWw8VX0gz3Y0Bz8sU58ZZbugmVjvnKKYzd
ueZ/9+FsaYX6CKdJDANEJf+fqfkGXwQGt8Ns7SeG0JyCdJ4K2ECoOURYS4P1vSY1
40L9OldDjsW2qhpSBPHppfJ4rPRUu5J9Ux3AX4Mz+ibl6MS3wRpP1Rg+9TLITK5o
3AYrJO6oMsYrQkQvc+k20ocD7Iq0522iyw62/DpKMsPZXHNTT/rqzIihkaZaR8aa
ZOgAKi5o398mcfsuv42f8DriYc0Gr+3btiDU7rINqM935YNIABBDtVT9Ybc5uPHa
wXLmAIx2yLjqYaRDhr01Sql6WGy8Y0HcI5lM1pw4Vpx+VKWG/QdORGtZgKySGZ0+
9bY9cRN9IBFz4J60xoqx0MsM5o6FqVDypDCB32KaobVZSAnHifwEGtJJimNIzHpY
jGCTzBHSpuZcvV2dVAuPTHzck37ifpNTUFUCAwEAAaNjMGEwHQYDVR0OBBYEFErb
2SmGkh+4kYe2twSie5+xaqRsMB8GA1UdIwQYMBaAFErb2SmGkh+4kYe2twSie5+x
aqRsMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4IDAQAP9t0STrn0xENQEDNwRMQUBYTA/r7BmzXX6b0Ip6HW7QNmTkFc5pUb
KT86v6g8cJ7ls96JwdTu1kRQt4Qpbyvzp2p5YlRFnm3NTVVdcffcZNo95x9Z/1Cv
5xZgw0OKODwPBJLCyq5ET4W6WrIZucRVBs035YXIN+z3EzCxBj6O1lcjOTTHSFFR
jI3t3AGdkFo7tCBu5TFlNEFfmaqjse140vfGWJpRKyOT4ahzXLcVxzfg/SKRID3Q
2Rop4KqLNCddzz+UM+IiwyFkOfjrXWStW46cLUzM1k5GRrl0aBg5oqMCBY4/Eeh3
W0ZATsxxfg2Ly4FIO5d7/xiZqARFuurYe/2PSzVSPIKQrPVjDEekD+qQ0bRRQGvL
KBiMhYZHwnz/OEQl21PNp5rksuFjKG4/PimQ8V96jpbzzsOZuic3aScszgNUPbdI
0LYjCQ8xCOFPpFC4x1+rGubRjKEuGCvvYErVkX9rQlFRGPOp+k8bYTlIUKZeNsuL
KiZ4VH5+ZUAIf94DHayoo/SvBsQ5Qizb17KVRKil+vidUkMtndrNtjr3GWmH+nkn
PhRXBlekUy3dgRvTE8RFDOG9TYAN1Bs/uMgNc8Sg5Yz0SG96SLXVer2zsjmQ7tf9
6s+UVvrr+wlL7jSJCfJo6gaUQh1sD3umPXDS+Fq+J7tiRwOvP3cejo8dLyhesDun
FGIHlKmUCIwS/3Kzvd9OtAJMsmV9Q2B1dXudJloj6ADaAmVvhI/eMUncL9sXMJZH
3CCorh2OSZt0vtdA59osgDSMrsQZSMrtovrKgeFmP1Z0ENvo90Zenm7Bjn6Hw3Y/
GebIgSgoc149ElxjN4nagIqSJJHRrYq85sjTUSESvQUL1oi4R/VU+qMIRSHju/ZM
bkqONDohUc7/pg5rnLTZnnaQ09KvdF0yySx3hYph7L7MZWV/tF7O7yj1egRKh7lT
rgZOI7EiN4DPfTTpXoWVmIpiB/ouKp6uZ/Zrq00WthT8lUaBsFYaC3FDkkcxwdkk
lJ+cvdbUdsU=
-----END CERTIFICATE-----
"""
20 changes: 16 additions & 4 deletions pylutron_caseta/pairing.py
Expand Up @@ -15,7 +15,7 @@
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509.oid import NameOID # type: ignore

from .assets import LAP_CA_PEM, LAP_CERT_PEM, LAP_KEY_PEM
from .assets import LAP_CA_PEM, LAP_CERT_PEM, LAP_KEY_PEM, LUTRON_ROOT_CA_PEM

LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -77,9 +77,20 @@ async def async_pair(
None, _generate_csr_with_ssl_context
)

cert_pem, ca_pem = await _async_generate_certificate(
server_addr, ssl_context, csr, ready
)
try:
cert_pem, ca_pem = await _async_generate_certificate(
server_addr, ssl_context, csr, ready
)
except ssl.SSLCertVerificationError:
# SSL certificate verification error - might be an RA3 processor,
# try to connect using the lutron-root certificate instead of LAP_CA
ssl_context.load_verify_locations(cadata=LUTRON_ROOT_CA_PEM)
cert_pem, ca_pem = await _async_generate_certificate(
server_addr, ssl_context, csr, ready
)
# Generate certificates worked with RA3 lutron-root so bridge is RA3.
# Discard the ca_pem for caseta and replace with LUTRON_ROOT_CA_PEM
ca_pem = LUTRON_ROOT_CA_PEM

signed_ssl_context = await loop.run_in_executor(
None, _generate_signed_ssl_context, key_bytes_pem, cert_pem, ca_pem
Expand Down Expand Up @@ -117,6 +128,7 @@ async def _async_generate_certificate(
),
timeout=SOCKET_TIMEOUT,
)

json_socket = JsonSocket(reader, writer)
LOGGER.info("Press the small black button on the back of the Caseta bridge...")
if ready is not None:
Expand Down