Compare commits
	
		
			3 Commits
		
	
	
		
			9c434bf22c
			...
			1812642773
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1812642773 | |||
| 85190aa9dd | |||
| 
						 | 
					fd3c2db642 | 
@ -6,6 +6,7 @@ from homeassistant import config_entries
 | 
			
		||||
from homeassistant.helpers.event import async_track_point_in_utc_time
 | 
			
		||||
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
 | 
			
		||||
import homeassistant.util.dt as dt_util
 | 
			
		||||
from homeassistant.helpers import device_registry as dr
 | 
			
		||||
 | 
			
		||||
from . import pyplejd
 | 
			
		||||
 | 
			
		||||
@ -28,7 +29,21 @@ async def async_setup(hass, config):
 | 
			
		||||
async def async_setup_entry(hass, config_entry):
 | 
			
		||||
 | 
			
		||||
    plejdManager = pyplejd.PlejdManager(config_entry.data)
 | 
			
		||||
 | 
			
		||||
    devices = await plejdManager.get_devices()
 | 
			
		||||
 | 
			
		||||
    if sum(d.type in ["light", "switch"] for d in devices.values()) == 0:
 | 
			
		||||
        site_data = await plejdManager.get_site_data()
 | 
			
		||||
 | 
			
		||||
        device_registry = dr.async_get(hass)
 | 
			
		||||
        device_registry.async_get_or_create(
 | 
			
		||||
            config_entry_id=config_entry.entry_id,
 | 
			
		||||
            identifiers={(DOMAIN, config_entry.data["siteId"])},
 | 
			
		||||
            manufacturer="Plejd",
 | 
			
		||||
            name=site_data.get("site", {}).get("title", "Unknown site"),
 | 
			
		||||
            entry_type=dr.DeviceEntryType.SERVICE,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    for dev in devices.values():
 | 
			
		||||
        ble_device = bluetooth.async_ble_device_from_address(
 | 
			
		||||
            hass, dev.BLE_address, True
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								custom_components/plejd/diagnostics.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								custom_components/plejd/diagnostics.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
from . import pyplejd
 | 
			
		||||
 | 
			
		||||
async def async_get_config_entry_diagnostics(hass, config_entry):
 | 
			
		||||
    plejdManager = pyplejd.PlejdManager(config_entry.data)
 | 
			
		||||
 | 
			
		||||
    return await plejdManager.get_site_data()
 | 
			
		||||
@ -48,10 +48,10 @@ class PlejdLight(LightEntity, CoordinatorEntity):
 | 
			
		||||
            "identifiers": {(DOMAIN, self.device.BLE_address)},
 | 
			
		||||
            "name": self.device.name,
 | 
			
		||||
            "manufacturer": "Plejd",
 | 
			
		||||
            "model": f"{self.device.model} ({self.device.hardwareId})",
 | 
			
		||||
            "model": {self.device.model},
 | 
			
		||||
            #"connections": ???,
 | 
			
		||||
            "suggested_area": self.device.room,
 | 
			
		||||
            "sw_version": self.device.firmware,
 | 
			
		||||
            "sw_version": f"{self.device.firmware} ({self.device.hardwareId})",
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ from datetime import timedelta
 | 
			
		||||
from bleak_retry_connector import close_stale_connections
 | 
			
		||||
 | 
			
		||||
from .mesh import PlejdMesh
 | 
			
		||||
from .api import get_cryptokey, get_devices
 | 
			
		||||
from .api import get_cryptokey, get_devices, get_site_data
 | 
			
		||||
from .plejd_device import PlejdDevice
 | 
			
		||||
 | 
			
		||||
from .const import PLEJD_SERVICE
 | 
			
		||||
@ -32,6 +32,9 @@ class PlejdManager:
 | 
			
		||||
    def connected(self):
 | 
			
		||||
        return self.mesh is not None and self.mesh.connected
 | 
			
		||||
 | 
			
		||||
    async def get_site_data(self):
 | 
			
		||||
        return await get_site_data(**self.credentials)
 | 
			
		||||
 | 
			
		||||
    async def get_devices(self):
 | 
			
		||||
        devices = await get_devices(**self.credentials)
 | 
			
		||||
        self.devices = {k: PlejdDevice(self, **v) for (k,v) in devices.items()}
 | 
			
		||||
 | 
			
		||||
@ -43,13 +43,17 @@ async def _get_site_details(session, siteId):
 | 
			
		||||
        #     fp.write(json.dumps(data))
 | 
			
		||||
        return data
 | 
			
		||||
 | 
			
		||||
site_data = None
 | 
			
		||||
async def get_site_data(username, password, siteId):
 | 
			
		||||
    # TODO: Memoize this somehow?
 | 
			
		||||
    global site_data
 | 
			
		||||
    if site_data is not None:
 | 
			
		||||
        return site_data
 | 
			
		||||
    async with ClientSession(base_url=API_BASE_URL, headers=headers) as session:
 | 
			
		||||
        session_token = await _login(session, username, password)
 | 
			
		||||
        _LOGGER.debug("Session token: %s", session_token)
 | 
			
		||||
        session.headers["X-Parse-Session-Token"] = session_token
 | 
			
		||||
        details = await _get_site_details(session, siteId)
 | 
			
		||||
        site_data = details
 | 
			
		||||
        return details
 | 
			
		||||
 | 
			
		||||
async def get_sites(username, password):
 | 
			
		||||
 | 
			
		||||
@ -74,7 +74,7 @@ class PlejdMesh():
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        self.client = client
 | 
			
		||||
        self.connected_node = binascii.a2b_hex(address.replace(":", ""))[::-1]
 | 
			
		||||
        self.connected_node = binascii.a2b_hex(address.replace(":", "").replace("-", ""))[::-1]
 | 
			
		||||
 | 
			
		||||
        await asyncio.sleep(2)
 | 
			
		||||
 | 
			
		||||
@ -149,7 +149,7 @@ class PlejdMesh():
 | 
			
		||||
            return False
 | 
			
		||||
        try:
 | 
			
		||||
            _LOGGER.debug("Authenticating")
 | 
			
		||||
            await self.client.write_gatt_char(PLEJD_AUTH, [0], response=True)
 | 
			
		||||
            await self.client.write_gatt_char(PLEJD_AUTH, b"\0x00", response=True)
 | 
			
		||||
            challenge = await self.client.read_gatt_char(PLEJD_AUTH)
 | 
			
		||||
            response = auth_response(self.crypto_key, challenge)
 | 
			
		||||
            await self.client.write_gatt_char(PLEJD_AUTH, response, response=True)
 | 
			
		||||
 | 
			
		||||
@ -7,10 +7,10 @@ Device = namedtuple("Device", ["model", "type", "dimmable"])
 | 
			
		||||
LIGHT = "light"
 | 
			
		||||
SENSOR = "sensor"
 | 
			
		||||
SWITCH = "switch"
 | 
			
		||||
 | 
			
		||||
UNKNOWN = "unknown"
 | 
			
		||||
 | 
			
		||||
HARDWARE_TYPES = {
 | 
			
		||||
    "0": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "0": Device("-unknown-", UNKNOWN, False),
 | 
			
		||||
    "1": Device("DIM-01", LIGHT, True),
 | 
			
		||||
    "2": Device("DIM-02", LIGHT, True),
 | 
			
		||||
    "3": Device("CTR-01", LIGHT, False),
 | 
			
		||||
@ -19,18 +19,15 @@ HARDWARE_TYPES = {
 | 
			
		||||
    "6": Device("WPH-01", SWITCH, False),
 | 
			
		||||
    "7": Device("REL-01", SWITCH, False),
 | 
			
		||||
    "8": Device("SPR-01", SWITCH, False),
 | 
			
		||||
    "9": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "10": Device("WRT-01", SWITCH, False),
 | 
			
		||||
    "11": Device("DIM-01", LIGHT, True),
 | 
			
		||||
    "12": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "13": Device("Generic", LIGHT, False),
 | 
			
		||||
    "14": Device("DIM-01", LIGHT, True),
 | 
			
		||||
    "15": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "16": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "17": Device("REL-01", SWITCH, False),
 | 
			
		||||
    "15": Device("DIM-02", LIGHT, True),
 | 
			
		||||
    "17": Device("REL-01-2P", SWITCH, False),
 | 
			
		||||
    "18": Device("REL-02", SWITCH, False),
 | 
			
		||||
    "19": Device("-unknown-", LIGHT, False),
 | 
			
		||||
    "20": Device("SPR-01", SWITCH, False),
 | 
			
		||||
    "36": Device("LED-75", LIGHT, True),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class PlejdDevice:
 | 
			
		||||
 | 
			
		||||
@ -19,8 +19,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
 | 
			
		||||
            async def updateCallback(data):
 | 
			
		||||
                coordinator.async_set_updated_data(data)
 | 
			
		||||
            dev.updateCallback = updateCallback
 | 
			
		||||
            light = PlejdSwitch(coordinator, dev)
 | 
			
		||||
            entities.append(light)
 | 
			
		||||
            switch = PlejdSwitch(coordinator, dev)
 | 
			
		||||
            entities.append(switch)
 | 
			
		||||
    async_add_entities(entities, False)
 | 
			
		||||
 | 
			
		||||
class Coordinator(DataUpdateCoordinator):
 | 
			
		||||
@ -48,10 +48,10 @@ class PlejdSwitch(SwitchEntity, CoordinatorEntity):
 | 
			
		||||
            "identifiers": {(DOMAIN, self.device.BLE_address)},
 | 
			
		||||
            "name": self.device.name,
 | 
			
		||||
            "manufacturer": "Plejd",
 | 
			
		||||
            "model": f"{self.device.model} ({self.device.hardwareId})",
 | 
			
		||||
            "model": self.device.model,
 | 
			
		||||
            #"connections": ???,
 | 
			
		||||
            "suggested_area": self.device.room,
 | 
			
		||||
            "sw_version": self.device.firmware,
 | 
			
		||||
            "sw_version": f"{self.device.firmware} ({self.device.hardwareId})",
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user