diff --git a/README.md b/README.md index 37d8c04..f2fa0c2 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,15 @@ This component add some sensor for GeoRide Tracker Get GeoRide position Get GeoRide lock status Change GeoRide lock status - Add GeoRide from configuration.yml - Add GeoRide from interface Get stollen status Get crashed status Get is owner status Get subsription status + Get odomoter to km an m (2 entities) + Internal battery (of georide 3) (not work on GR1) + External battery (of the bike) (not work on GR1) + Fixtime (last registered positition of the georide) + ### What's events are available: you can filter by data.device_id == XX (XX is your tracker id) @@ -53,7 +56,7 @@ here is the alarm type available: (listen the georide_alarm_event) ## Question: -### How to have the odometer in Km ? +### How to have the odometer in Km ? (Deprecated, now you have an entity - thx @Inervo) Simply add a sensor like this in configuration.yaml (Replace XX by your tracker id) @@ -66,8 +69,6 @@ sensor: friendly_name: "Odometter - Km" value_template: "{{ states.sensor.odometer_XX.state | multiply(0.001) | round(3, 'flour') }}" unit_of_measurement: 'Km' - - ``` ### How to use the event: diff --git a/custom_components/georide/binary_sensor.py b/custom_components/georide/binary_sensor.py index ac3ddff..a733420 100644 --- a/custom_components/georide/binary_sensor.py +++ b/custom_components/georide/binary_sensor.py @@ -30,6 +30,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): # pylint: d entities.append(GeoRideCrashedBinarySensorEntity(coordinator, tracker_device)) entities.append(GeoRideOwnerBinarySensorEntity(coordinator, tracker_device)) entities.append(GeoRideActiveSubscriptionBinarySensorEntity(coordinator, tracker_device)) + entities.append(GeoRideNetworkBinarySensorEntity(coordinator, tracker_device)) + entities.append(GeoRideMovingBinarySensorEntity(coordinator, tracker_device)) hass.data[GEORIDE_DOMAIN]["devices"][tracker_device.tracker.tracker_id] = coordinator @@ -68,6 +70,11 @@ class GeoRideStolenBinarySensorEntity(GeoRideBinarySensorEntity): """Return the unique ID.""" return f"is_stolen_{self._tracker_device.tracker.tracker_id}" + @property + def device_class(self): + """Return the device class.""" + return "problem" + @property def is_on(self): """state value property""" @@ -93,6 +100,11 @@ class GeoRideCrashedBinarySensorEntity(GeoRideBinarySensorEntity): """Return the unique ID.""" return f"is_crashed_{self._tracker_device.tracker.tracker_id}" + @property + def device_class(self): + """Return the device class.""" + return "problem" + @property def is_on(self): """state value property""" @@ -154,4 +166,63 @@ class GeoRideOwnerBinarySensorEntity(GeoRideBinarySensorEntity): def name(self): """ GeoRide odometer name """ return f"{self._name} is own tracker" - \ No newline at end of file + +class GeoRideNetworkBinarySensorEntity(GeoRideBinarySensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device: Device): + """Set up Georide entity.""" + super().__init__(coordinator, tracker_device) + self.entity_id = f"{ENTITY_ID_FORMAT.format('have_network')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + @property + def unique_id(self): + """Return the unique ID.""" + return f"have_network_{self._tracker_device.tracker.tracker_id}" + + @property + def device_class(self): + """Return the device class.""" + return "connectivity" + + @property + def is_on(self): + """state value property""" + if self._tracker_device.tracker.status == "online": + return True + return False + + @property + def name(self): + """ GeoRide name """ + return f"{self._name} have network" + +class GeoRideMovingBinarySensorEntity(GeoRideBinarySensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device: Device): + """Set up Georide entity.""" + super().__init__(coordinator, tracker_device) + self.entity_id = f"{ENTITY_ID_FORMAT.format('moving')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + @property + def unique_id(self): + """Return the unique ID.""" + return f"moving_{self._tracker_device.tracker.tracker_id}" + + @property + def device_class(self): + """Return the device class.""" + return "moving" + + @property + def is_on(self): + """state value property""" + return self._tracker_device.tracker.moving + + @property + def name(self): + """ GeoRide name """ + return f"{self._name} is moving" diff --git a/custom_components/georide/manifest.json b/custom_components/georide/manifest.json index af72fb5..69a2a00 100644 --- a/custom_components/georide/manifest.json +++ b/custom_components/georide/manifest.json @@ -9,5 +9,5 @@ ], "dependencies": [], "codeowners": ["ptimatth"], - "version": "0.7.2" + "version": "0.8.0" } \ No newline at end of file diff --git a/custom_components/georide/sensor.py b/custom_components/georide/sensor.py index 52d190d..d02f732 100644 --- a/custom_components/georide/sensor.py +++ b/custom_components/georide/sensor.py @@ -27,9 +27,12 @@ async def async_setup_entry(hass, config_entry, async_add_entities): # pylint: d for coordoned_tracker in coordoned_trackers: tracker_device = coordoned_tracker['tracker_device'] coordinator = coordoned_tracker['coordinator'] - entity = GeoRideOdometerSensorEntity(coordinator, tracker_device, hass) hass.data[GEORIDE_DOMAIN]["devices"][tracker_device.tracker.tracker_id] = coordinator - entities.append(entity) + entities.append(GeoRideOdometerSensorEntity(coordinator, tracker_device, hass)) + entities.append(GeoRideOdometerKmSensorEntity(coordinator, tracker_device, hass)) + entities.append(GeoRideInternalBatterySensorEntity(coordinator, tracker_device)) + entities.append(GeoRideExternalBatterySensorEntity(coordinator, tracker_device)) + entities.append(GeoRideFixtimeSensorEntity(coordinator, tracker_device)) async_add_entities(entities) @@ -58,7 +61,8 @@ class GeoRideOdometerSensorEntity(CoordinatorEntity, SensorEntity): @property def state(self): """state property""" - return self._tracker_device.tracker.odometer + odometer = self._tracker_device.tracker.odometer + return odometer @property def unit_of_measurement(self): @@ -79,3 +83,176 @@ class GeoRideOdometerSensorEntity(CoordinatorEntity, SensorEntity): def device_info(self): """Return the device info.""" return self._tracker_device.device_info + +class GeoRideOdometerKmSensorEntity(CoordinatorEntity, SensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device:Device, hass): + """Set up GeoRide entity.""" + super().__init__(coordinator) + self._tracker_device = tracker_device + self._name = tracker_device.tracker.tracker_name + self._unit_of_measurement = "km" + self.entity_id = f"{ENTITY_ID_FORMAT.format('odometer_km')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + self._state = 0 + self._hass = hass + + @property + def unique_id(self): + """Return the unique ID.""" + return f"odometer_km_{self._tracker_device.tracker.tracker_id}" + + @property + def state(self): + """state property""" + odometer = self._tracker_device.tracker.odometer // 1000 + return odometer + + @property + def unit_of_measurement(self): + """unit of mesurment property""" + return self._unit_of_measurement + + @property + def name(self): + """ GeoRide odometer name """ + return f"{self._name} odometer km" + + @property + def icon(self): + """icon getter""" + return "mdi:counter" + + @property + def device_info(self): + """Return the device info.""" + return self._tracker_device.device_info + +class GeoRideInternalBatterySensorEntity(CoordinatorEntity, SensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device:Device): + """Set up GeoRide entity.""" + super().__init__(coordinator) + self._tracker_device = tracker_device + self._name = tracker_device.tracker.tracker_name + self._unit_of_measurement = "V" + self.entity_id = f"{ENTITY_ID_FORMAT.format('internal_battery_voltage')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + self._state = 0 + + @property + def unique_id(self): + """Return the unique ID.""" + return f"internal_battery_voltage_{self._tracker_device.tracker.tracker_id}" + + @property + def state(self): + """state property""" + return self._tracker_device.tracker.internal_battery_voltage + + @property + def unit_of_measurement(self): + """unit of mesurment property""" + return self._unit_of_measurement + + @property + def name(self): + """ GeoRide internal_battery_voltage name """ + return f"{self._name} internal_battery_voltage" + + @property + def icon(self): + """icon getter""" + return "mdi:battery" + + @property + def device_info(self): + """Return the device info.""" + return self._tracker_device.device_info + +class GeoRideExternalBatterySensorEntity(CoordinatorEntity, SensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device:Device): + """Set up GeoRide entity.""" + super().__init__(coordinator) + self._tracker_device = tracker_device + self._name = tracker_device.tracker.tracker_name + self._unit_of_measurement = "V" + self.entity_id = f"{ENTITY_ID_FORMAT.format('external_battery_voltage')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + self._state = 0 + + @property + def unique_id(self): + """Return the unique ID.""" + return f"external_battery_voltage_{self._tracker_device.tracker.tracker_id}" + + @property + def state(self): + """state property""" + return self._tracker_device.tracker.external_battery_voltage + + @property + def unit_of_measurement(self): + """unit of mesurment property""" + return self._unit_of_measurement + + @property + def name(self): + """ GeoRide internal_battery_voltage name """ + return f"{self._name} external_battery_voltage" + + @property + def icon(self): + """icon getter""" + return "mdi:battery" + + @property + def device_info(self): + """Return the device info.""" + return self._tracker_device.device_info + +class GeoRideFixtimeSensorEntity(CoordinatorEntity, SensorEntity): + """Represent a tracked device.""" + + def __init__(self, coordinator: DataUpdateCoordinator[Mapping[str, Any]], + tracker_device:Device): + """Set up GeoRide entity.""" + super().__init__(coordinator) + self._tracker_device = tracker_device + self._name = tracker_device.tracker.tracker_name + self.entity_id = f"{ENTITY_ID_FORMAT.format('fixtime')}.{tracker_device.tracker.tracker_id}"# pylint: disable=C0301 + + self._state = 0 + self._device_class = "timestamp" + + @property + def unique_id(self): + """Return the unique ID.""" + return f"fixtime_{self._tracker_device.tracker.tracker_id}" + + @property + def state(self): + """state property""" + return self._tracker_device.tracker.fixtime + + @property + def name(self): + """ GeoRide fixtime name """ + return f"{self._name} last fixed position" + + @property + def icon(self): + """icon getter""" + return "mdi:map-clock" + + @property + def device_info(self): + """Return the device info.""" + return self._tracker_device.device_info