Skip to content

Commit

Permalink
Homekit: add consumption characteristic and make serial numbers for a…
Browse files Browse the repository at this point in the history
…ccessories unique
  • Loading branch information
tillsteinbach committed Aug 30, 2021
1 parent e3bfe3e commit 3a92c05
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 7 deletions.
10 changes: 5 additions & 5 deletions vwsfriend/vwsfriend/homekit/bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def update(self): # noqa: C901
displayName=f'{nickname} Climatization', climatizationStatus=climatizationStatus,
climatizationSettings=climatizationSettings, batteryStatus=batteryStatus, chargingStatus=chargingStatus,
climatizationControl=vehicle.controls.climatizationControl)
climatizationAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=vin)
climatizationAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=f'{vin}-climatization')
self.add_accessory(climatizationAccessory)
configChanged = True

Expand All @@ -97,7 +97,7 @@ def update(self): # noqa: C901

# batteryAccessory = Battery(driver=self.driver, bridge=self, aid=self.selectAID('Battery', vin), id='Battery', vin=vin,
# displayName=f'{nickname} Battery', batteryStatus=batteryStatus, chargingStatus=chargingStatus)
# batteryAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=vin)
# batteryAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=f'{vin}-battery')
# self.add_accessory(batteryAccessory)
# configChanged = True

Expand All @@ -117,7 +117,7 @@ def update(self): # noqa: C901
chargingAccessory = Charging(driver=self.driver, bridge=self, aid=self.selectAID('Charging', vin), id='Charging', vin=vin,
displayName=f'{nickname} Charging', chargingStatus=chargingStatus, plugStatus=plugStatus,
batteryStatus=batteryStatus, chargingControl=vehicle.controls.chargingControl)
chargingAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=vin)
chargingAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=f'{vin}-charging')
self.add_accessory(chargingAccessory)
configChanged = True

Expand All @@ -126,7 +126,7 @@ def update(self): # noqa: C901

plugAccessory = Plug(driver=self.driver, bridge=self, aid=self.selectAID('ChargingPlug', vin), id='ChargingPlug', vin=vin,
displayName=f'{nickname} Charging Plug', plugStatus=plugStatus)
plugAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=vin)
plugAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=f'{vin}-charging_plug')
self.add_accessory(plugAccessory)
configChanged = True

Expand All @@ -135,7 +135,7 @@ def update(self): # noqa: C901

lockingSystemAccessory = LockingSystem(driver=self.driver, bridge=self, aid=self.selectAID('LockingSystem', vin), id='LockingSystem', vin=vin,
displayName=f'{nickname} Locking System', accessStatus=accessStatus)
lockingSystemAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=vin)
lockingSystemAccessory.set_info_service(manufacturer=manufacturer, model=model, serial_number=f'{vin}-locking_system')
self.add_accessory(lockingSystemAccessory)
configChanged = True

Expand Down
14 changes: 12 additions & 2 deletions vwsfriend/vwsfriend/homekit/charging.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def __init__(self, driver, bridge, aid, id, vin, displayName, chargingStatus, pl

self.chargingControl = chargingControl

self.service = self.add_preload_service('Outlet', ['Name', 'ConfiguredName', 'On', 'OutletInUse', 'RemainingDuration'])
self.service = self.add_preload_service('Outlet', ['Name', 'ConfiguredName', 'On', 'OutletInUse', 'RemainingDuration', 'Consumption'])
self.batteryService = self.add_preload_service('BatteryService', ['BatteryLevel', 'StatusLowBattery', 'ChargingState'])
self.service.add_linked_service(self.batteryService)

Expand All @@ -34,10 +34,13 @@ def __init__(self, driver, bridge, aid, id, vin, displayName, chargingStatus, pl
if chargingStatus is not None and chargingStatus.remainingChargingTimeToComplete_min.enabled:
chargingStatus.remainingChargingTimeToComplete_min.addObserver(self.onRemainingChargingTimeToComplete,
AddressableLeaf.ObserverEvent.VALUE_CHANGED)

# Add Characteristic that is not planned for the service. This is still visible in other Apps than Apple Home
self.charRemainingDuration = self.service.configure_char('RemainingDuration', value=chargingStatus.remainingChargingTimeToComplete_min.value * 60)

if chargingStatus is not None and chargingStatus.chargePower_kW.enabled:
chargingStatus.chargePower_kW.addObserver(self.onChargePowerChange, AddressableLeaf.ObserverEvent.VALUE_CHANGED)
self.charWatt = self.service.configure_char('Consumption', value=chargingStatus.chargePower_kW.value * 1000)

if plugStatus is not None and plugStatus.plugConnectionState.enabled:
plugStatus.plugConnectionState.addObserver(self.onplugConnectionStateChange, AddressableLeaf.ObserverEvent.VALUE_CHANGED)
self.charOutletInUse = self.service.configure_char('OutletInUse')
Expand Down Expand Up @@ -101,6 +104,13 @@ def onRemainingChargingTimeToComplete(self, element, flags):
else:
LOG.debug('Unsupported event %s', flags)

def onChargePowerChange(self, element, flags):
if flags & AddressableLeaf.ObserverEvent.VALUE_CHANGED:
self.charWatt.set_value(element.value * 1000)
LOG.debug('chargePower_kW Changed: %d', element.value)
else:
LOG.debug('Unsupported event %s', flags)

def __onOnChanged(self, value):
if self.chargingControl.enabled:
if value:
Expand Down
14 changes: 14 additions & 0 deletions vwsfriend/vwsfriend/homekit/custom_characteristics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
CUSTOM_CHARACTERISTICS = {
"Consumption": {
"Format": "uint32",
"Permissions": [
"pr",
"ev"
],
"UUID": "E863F10D-079E-48FF-8F27-9C2605A29F52",
"maxValue": 4294967295,
"minStep": 1,
"minValue": 0,
"unit": "watt"
}
}
6 changes: 6 additions & 0 deletions vwsfriend/vwsfriend/vwsfriend.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from vwsfriend.homekit.bridge import VWsFriendBridge
from vwsfriend.agent_connector import AgentConnector

from vwsfriend.homekit.custom_characteristics import CUSTOM_CHARACTERISTICS

from .__version import __version__


Expand Down Expand Up @@ -145,6 +147,10 @@ def main(): # noqa: C901 pylint: disable=too-many-branches, too-many-statements
LOG.info('Starting up Homekit')
# Start the accessory on port 51826
driver = AccessoryDriver(pincode=None, persist_file=f'{args.configDir}/accessory.state')

for characteristicKey, characteristic in CUSTOM_CHARACTERISTICS.items():
driver.loader.char_types[characteristicKey] = characteristic

bridge = VWsFriendBridge(driver=driver, weConnect=weConnect, accessoryConfigFile=f'{args.configDir}/accessory.config')
driver.add_accessory(bridge)
weConnectBridgeInitialized = False
Expand Down

0 comments on commit 3a92c05

Please sign in to comment.