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

Linear battery voltage #208

Merged
merged 10 commits into from
Dec 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 21 additions & 8 deletions zhaquirks/__init__.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Quirks implementations for the ZHA component of Homeassistant."""
import logging
import importlib
import pkgutil

Expand All @@ -17,6 +18,8 @@
ZHA_SEND_EVENT,
)

_LOGGER = logging.getLogger(__name__)


class Bus(ListenableMixin):
"""Event bus implementation."""
Expand Down Expand Up @@ -116,8 +119,8 @@ class PowerConfigurationCluster(CustomCluster, PowerConfiguration):
cluster_id = PowerConfiguration.cluster_id
BATTERY_VOLTAGE_ATTR = 0x0020
BATTERY_PERCENTAGE_REMAINING = 0x0021
MIN_VOLTS = 2.1
MAX_VOLTS = 3.2
MIN_VOLTS = 1.5 # old 2.1
MAX_VOLTS = 2.8 # old 3.2
dmulcahey marked this conversation as resolved.
Show resolved Hide resolved

def _update_attribute(self, attrid, value):
super()._update_attribute(attrid, value)
Expand All @@ -131,14 +134,24 @@ def _calculate_battery_percentage(self, raw_value):
if raw_value in (0, 255):
return -1
volts = raw_value / 10
if volts < self.MIN_VOLTS:
volts = self.MIN_VOLTS
elif volts > self.MAX_VOLTS:
volts = self.MAX_VOLTS
volts = max(volts, self.MIN_VOLTS)
volts = min(volts, self.MAX_VOLTS)

percent = round(
((volts - self.MIN_VOLTS) / (self.MAX_VOLTS - self.MIN_VOLTS)) * 200
)

percent = ((volts - self.MIN_VOLTS) / (self.MAX_VOLTS - self.MIN_VOLTS)) * 200
_LOGGER.debug(
"%s %s, Voltage [RAW]:%s [Max]:%s [Min]:%s, Battery Percent: %s",
self.endpoint.device.manufacturer,
self.endpoint.device.model,
raw_value,
self.MAX_VOLTS,
self.MIN_VOLTS,
percent / 2,
)

return round(min(200, percent), 2)
return percent


NAME = __name__
Expand Down
15 changes: 12 additions & 3 deletions zhaquirks/centralite/3130.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
)
from zigpy.zcl.clusters.measurement import TemperatureMeasurement

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
COMMAND,
COMMAND_MOVE,
Expand All @@ -35,6 +36,14 @@
DIAGNOSTICS_CLUSTER_ID = 0x0B05 # decimal = 2821


class CustomPowerConfigurationCluster(PowerConfigurationCluster):
"""Custom PowerConfigurationCluster."""

cluster_id = PowerConfigurationCluster.cluster_id
MIN_VOLTS = 2.1
MAX_VOLTS = 3.0


class CentraLite3130(CustomDevice):
"""Custom device representing centralite 3130."""

Expand All @@ -50,7 +59,7 @@ class CentraLite3130(CustomDevice):
DEVICE_TYPE: zha.DeviceType.LEVEL_CONTROL_SWITCH,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster.cluster_id,
CustomPowerConfigurationCluster.cluster_id,
Identify.cluster_id,
PollControl.cluster_id,
TemperatureMeasurement.cluster_id,
Expand All @@ -70,7 +79,7 @@ class CentraLite3130(CustomDevice):
1: {
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster,
CustomPowerConfigurationCluster,
Identify.cluster_id,
PollControl.cluster_id,
DIAGNOSTICS_CLUSTER_ID,
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/3157100.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from zigpy.zcl.clusters.general import Basic, Identify, Ota, PollControl, Time
from zigpy.zcl.clusters.hvac import Fan, Thermostat, UserInterface

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/3300S.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/3305S.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from zigpy.zcl.clusters.measurement import OccupancySensing, TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/3310S.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
from zigpy.zcl.clusters.general import Basic, Identify, Ota, PollControl
from zigpy.zcl.clusters.measurement import TemperatureMeasurement

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
7 changes: 2 additions & 5 deletions zhaquirks/centralite/3321S.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import (
CENTRALITE,
CentraLiteAccelCluster,
PowerConfigurationCluster,
)
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE, CentraLiteAccelCluster
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
15 changes: 12 additions & 3 deletions zhaquirks/centralite/3460L.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
)
from zigpy.zcl.clusters.measurement import TemperatureMeasurement

from zhaquirks.centralite import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from zhaquirks.centralite import CENTRALITE
from zhaquirks.const import (
DEVICE_TYPE,
ENDPOINTS,
Expand All @@ -25,6 +26,14 @@
DIAGNOSTICS_CLUSTER_ID = 0x0B05 # decimal = 2821


class CustomPowerConfigurationCluster(PowerConfigurationCluster):
"""Custom PowerConfigurationCluster."""

cluster_id = PowerConfigurationCluster.cluster_id
MIN_VOLTS = 2.1
MAX_VOLTS = 3.0


class CentraLite3460L(CustomDevice):
"""Custom device representing centralite 3460L."""

Expand All @@ -40,7 +49,7 @@ class CentraLite3460L(CustomDevice):
DEVICE_TYPE: zha.DeviceType.REMOTE_CONTROL,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster.cluster_id,
CustomPowerConfigurationCluster.cluster_id,
Identify.cluster_id,
OnOffConfiguration.cluster_id,
PollControl.cluster_id,
Expand All @@ -61,7 +70,7 @@ class CentraLite3460L(CustomDevice):
1: {
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster,
CustomPowerConfigurationCluster,
Identify.cluster_id,
OnOffConfiguration.cluster_id,
PollControl.cluster_id,
Expand Down
44 changes: 0 additions & 44 deletions zhaquirks/centralite/__init__.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -3,55 +3,11 @@

from zigpy.quirks import CustomCluster
import zigpy.types as t
from zigpy.zcl.clusters.general import PowerConfiguration

_LOGGER = logging.getLogger(__name__)
CENTRALITE = "CentraLite"


class PowerConfigurationCluster(CustomCluster, PowerConfiguration):
"""Centralite power configuration cluster."""

cluster_id = PowerConfiguration.cluster_id
BATTERY_VOLTAGE_ATTR = 0x0020
BATTERY_PERCENTAGE_REMAINING = 0x0021
MIN_VOLTS = 21
MAX_VOLTS = 31
VOLTS_TO_PERCENT = {
31: 100,
30: 90,
29: 80,
28: 70,
27: 60,
26: 50,
25: 40,
24: 30,
23: 20,
22: 10,
21: 0,
}

def _update_attribute(self, attrid, value):
super()._update_attribute(attrid, value)
if attrid == self.BATTERY_VOLTAGE_ATTR:
super()._update_attribute(
self.BATTERY_PERCENTAGE_REMAINING,
self._calculate_battery_percentage(value),
)

def _calculate_battery_percentage(self, raw_value):
volts = raw_value
if raw_value < self.MIN_VOLTS:
volts = self.MIN_VOLTS
elif raw_value > self.MAX_VOLTS:
volts = self.MAX_VOLTS

percent = self.VOLTS_TO_PERCENT.get(volts, -1)
if percent != -1:
percent = percent * 2
return percent


class CentraLiteAccelCluster(CustomCluster):
"""Centralite acceleration cluster."""

Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/ias.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from . import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from . import CENTRALITE
from ..const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/centralite/motion.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from . import CENTRALITE, PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster
from . import CENTRALITE
from ..const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
14 changes: 11 additions & 3 deletions zhaquirks/netvox/z308e3ed.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@
from zigpy.zcl.clusters.general import Basic, Commissioning, Identify, PollControl
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster

from ..const import DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, OUTPUT_CLUSTERS, PROFILE_ID

DIAGNOSTICS_CLUSTER_ID = 0x0B05 # decimal = 2821


class CustomPowerConfigurationCluster(PowerConfigurationCluster):
"""Custom PowerConfigurationCluster."""

cluster_id = PowerConfigurationCluster.cluster_id
MIN_VOLTS = 2.1
MAX_VOLTS = 3.0


class Z308E3ED(CustomDevice):
"""Netvox Z308E3ED."""

Expand All @@ -25,7 +33,7 @@ class Z308E3ED(CustomDevice):
DEVICE_TYPE: zha.DeviceType.IAS_ZONE,
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster.cluster_id,
CustomPowerConfigurationCluster.cluster_id,
Identify.cluster_id,
PollControl.cluster_id,
IasZone.cluster_id,
Expand All @@ -42,7 +50,7 @@ class Z308E3ED(CustomDevice):
1: {
INPUT_CLUSTERS: [
Basic.cluster_id,
PowerConfigurationCluster,
CustomPowerConfigurationCluster,
Identify.cluster_id,
PollControl.cluster_id,
IasZone.cluster_id,
Expand Down
2 changes: 1 addition & 1 deletion zhaquirks/smartthings/moisturev4.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster

from . import SMART_THINGS
from ..const import (
Expand Down
2 changes: 1 addition & 1 deletion zhaquirks/smartthings/motionv4.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks.centralite import PowerConfigurationCluster
from zhaquirks import PowerConfigurationCluster

from . import SMART_THINGS
from ..const import (
Expand Down
3 changes: 2 additions & 1 deletion zhaquirks/smartthings/multiv4.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
from zigpy.zcl.clusters.measurement import TemperatureMeasurement
from zigpy.zcl.clusters.security import IasZone

from zhaquirks import PowerConfigurationCluster
from . import SMART_THINGS
from ..centralite import CentraLiteAccelCluster, PowerConfigurationCluster
from ..centralite import CentraLiteAccelCluster
from ..const import (
DEVICE_TYPE,
ENDPOINTS,
Expand Down
3 changes: 1 addition & 2 deletions zhaquirks/smartthings/tag_v4.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, BinaryInput, Identify, Ota, PollControl

from zhaquirks import Bus, LocalDataCluster
from zhaquirks import Bus, LocalDataCluster, PowerConfigurationCluster

from ..centralite import PowerConfigurationCluster
from ..const import DEVICE_TYPE, ENDPOINTS, INPUT_CLUSTERS, OUTPUT_CLUSTERS, PROFILE_ID

_LOGGER = logging.getLogger(__name__)
Expand Down
Loading