Skip to content
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
66 changes: 66 additions & 0 deletions hatasmota/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,72 @@
SENSOR_UNIT_SPEED = "SpeedUnit"
SENSOR_UNIT_TEMPERATURE = "TempUnit"

# #### UNITS OF MEASUREMENT ####
# Power units
POWER_WATT = "W"

# Voltage units
VOLT = "V"

# Energy units
ENERGY_WATT_HOUR = f"{POWER_WATT}h"
ENERGY_KILO_WATT_HOUR = f"k{ENERGY_WATT_HOUR}"

# Electrical units
ELECTRICAL_CURRENT_AMPERE = "A"
ELECTRICAL_VOLT_AMPERE = f"{VOLT}{ELECTRICAL_CURRENT_AMPERE}"

# Temperature units
TEMP_CELSIUS = "C"
TEMP_FAHRENHEIT = "F"
TEMP_KELVIN = "K"

# Time units
TIME_SECONDS = "s"
TIME_HOURS = "h"

# Length units
LENGTH_CENTIMETERS: str = "cm"
LENGTH_METERS: str = "m"
LENGTH_KILOMETERS: str = "km"

# Frequency units
FREQUENCY_HERTZ = "Hz"

# Pressure units
PRESSURE_HPA: str = "hPa"
PRESSURE_MMHG: str = "mmHg"

# Volume units
VOLUME_CUBIC_METERS = f"{LENGTH_METERS}³"

# Mass units
MASS_KILOGRAMS: str = "kg"
MASS_MICROGRAMS = "µg"

# Light units
LIGHT_LUX: str = "lx"
Comment thread
effelle marked this conversation as resolved.

# Percentage units
PERCENTAGE = "%"

# Concentration units
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER = f"{MASS_MICROGRAMS}/{VOLUME_CUBIC_METERS}"
CONCENTRATION_PARTS_PER_MILLION = "ppm"
CONCENTRATION_PARTS_PER_BILLION = "ppb"

# Speed units
SPEED_METERS_PER_SECOND = f"{LENGTH_METERS}/{TIME_SECONDS}"
SPEED_KILOMETERS_PER_HOUR = f"{LENGTH_KILOMETERS}/{TIME_HOURS}"
SPEED_KNOT = "kn"
SPEED_MILES_PER_HOUR = "mph"
SPEED_FEET_PER_SECOND = "ft/s"
SPEED_YARDS_PER_SECOND = "yd/s"

# Signal_strength units
SIGNAL_STRENGTH_DECIBELS = "dB"
SIGNAL_STRENGTH_DECIBELS_MILLIWATT = "dBm"

STATE_OFF = 0
STATE_ON = 1
STATE_TOGGLE = 2
Expand Down
94 changes: 66 additions & 28 deletions hatasmota/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,23 @@
import attr

from .const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_DEVICENAME,
CONF_MAC,
CONF_SENSOR,
ELECTRICAL_CURRENT_AMPERE,
ELECTRICAL_VOLT_AMPERE,
ENERGY_KILO_WATT_HOUR,
FREQUENCY_HERTZ,
LENGTH_CENTIMETERS,
LIGHT_LUX,
MASS_KILOGRAMS,
PERCENTAGE,
POWER_WATT,
PRESSURE_HPA,
PRESSURE_MMHG,
SENSOR_AMBIENT,
SENSOR_APPARENT_POWERUSAGE,
SENSOR_BATTERY,
Expand Down Expand Up @@ -50,6 +64,16 @@
SENSOR_VOLTAGE,
SENSOR_WEIGHT,
SENSOR_YESTERDAY,
SPEED_FEET_PER_SECOND,
SPEED_KILOMETERS_PER_HOUR,
SPEED_KNOT,
SPEED_METERS_PER_SECOND,
SPEED_MILES_PER_HOUR,
SPEED_YARDS_PER_SECOND,
TEMP_CELSIUS,
TEMP_FAHRENHEIT,
TEMP_KELVIN,
VOLT,
)
from .entity import (
TasmotaAvailability,
Expand Down Expand Up @@ -112,49 +136,60 @@


SENSOR_UNIT_MAP = {
SENSOR_APPARENT_POWERUSAGE: "VA",
SENSOR_BATTERY: "%",
SENSOR_CURRENT: "A",
SENSOR_DISTANCE: "cm",
SENSOR_FREQUENCY: "Hz",
SENSOR_HUMIDITY: "%",
SENSOR_ILLUMINANCE: "lux",
SENSOR_MOISTURE: "%",
SENSOR_APPARENT_POWERUSAGE: ELECTRICAL_VOLT_AMPERE,
SENSOR_BATTERY: PERCENTAGE,
SENSOR_CURRENT: ELECTRICAL_CURRENT_AMPERE,
SENSOR_DISTANCE: LENGTH_CENTIMETERS,
SENSOR_FREQUENCY: FREQUENCY_HERTZ,
SENSOR_HUMIDITY: PERCENTAGE,
SENSOR_ILLUMINANCE: LIGHT_LUX,
SENSOR_MOISTURE: PERCENTAGE,
SENSOR_PB0_3: "ppd",
SENSOR_PB0_5: "ppd",
SENSOR_PB1: "ppd",
SENSOR_PB2_5: "ppd",
SENSOR_PB5: "ppd",
SENSOR_PB10: "ppd",
SENSOR_PM1: "µg/m³",
SENSOR_PM2_5: "µg/m³",
SENSOR_PM10: "µg/m³",
SENSOR_PM1: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
SENSOR_PM2_5: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
SENSOR_PM10: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
SENSOR_POWERFACTOR: "Cos φ",
SENSOR_POWERUSAGE: "W",
SENSOR_POWERUSAGE: POWER_WATT,
SENSOR_TOTAL_START_TIME: " ",
SENSOR_REACTIVE_POWERUSAGE: "VAr",
SENSOR_TODAY: "kWh",
SENSOR_TOTAL: "kWh",
SENSOR_VOLTAGE: "V",
SENSOR_WEIGHT: "kg",
SENSOR_YESTERDAY: "kWh",
SENSOR_CO2: "ppm",
SENSOR_ECO2: "ppm",
SENSOR_TVOC: "ppb",
SENSOR_TODAY: ENERGY_KILO_WATT_HOUR,
SENSOR_TOTAL: ENERGY_KILO_WATT_HOUR,
SENSOR_VOLTAGE: VOLT,
SENSOR_WEIGHT: MASS_KILOGRAMS,
SENSOR_YESTERDAY: ENERGY_KILO_WATT_HOUR,
SENSOR_CO2: CONCENTRATION_PARTS_PER_MILLION,
SENSOR_ECO2: CONCENTRATION_PARTS_PER_MILLION,
SENSOR_TVOC: CONCENTRATION_PARTS_PER_BILLION,
SENSOR_COLOR_RED: "R",
SENSOR_COLOR_GREEN: "G",
SENSOR_COLOR_BLUE: "B",
SENSOR_CCT: "K",
SENSOR_CCT: TEMP_KELVIN,
SENSOR_PROXIMITY: " ",
SENSOR_AMBIENT: "lux",
SENSOR_AMBIENT: LIGHT_LUX,
}

SUPPORTED_PRESSURE_UNITS = [PRESSURE_HPA, PRESSURE_MMHG]
SUPPORTED_SPEED_UNITS = [
SPEED_METERS_PER_SECOND,
SPEED_KILOMETERS_PER_HOUR,
SPEED_KNOT,
SPEED_MILES_PER_HOUR,
SPEED_FEET_PER_SECOND,
SPEED_YARDS_PER_SECOND,
]
SUPPORTED_TEMPERATURE_UNITS = [TEMP_CELSIUS, TEMP_FAHRENHEIT]

SENSOR_DYNAMIC_UNIT_MAP = {
SENSOR_DEWPOINT: SENSOR_UNIT_TEMPERATURE,
SENSOR_PRESSURE: SENSOR_UNIT_PRESSURE,
SENSOR_PRESSUREATSEALEVEL: SENSOR_UNIT_PRESSURE,
SENSOR_SPEED: SENSOR_UNIT_SPEED,
SENSOR_TEMPERATURE: SENSOR_UNIT_TEMPERATURE,
SENSOR_DEWPOINT: (SENSOR_UNIT_TEMPERATURE, SUPPORTED_TEMPERATURE_UNITS),
SENSOR_PRESSURE: (SENSOR_UNIT_PRESSURE, SUPPORTED_PRESSURE_UNITS),
SENSOR_PRESSUREATSEALEVEL: (SENSOR_UNIT_PRESSURE, SUPPORTED_PRESSURE_UNITS),
SENSOR_SPEED: (SENSOR_UNIT_SPEED, SUPPORTED_SPEED_UNITS),
SENSOR_TEMPERATURE: (SENSOR_UNIT_TEMPERATURE, SUPPORTED_TEMPERATURE_UNITS),
}

_LOGGER = logging.getLogger(__name__)
Expand All @@ -178,7 +213,10 @@ def from_discovery_message(
"""Instantiate from discovery message."""
unit = SENSOR_UNIT_MAP.get(quantity, " ")
if quantity in SENSOR_DYNAMIC_UNIT_MAP:
unit = sensor_config[CONF_SENSOR].get(SENSOR_DYNAMIC_UNIT_MAP[quantity])
key, supported_units = SENSOR_DYNAMIC_UNIT_MAP[quantity]
unit = sensor_config[CONF_SENSOR].get(key)
if unit not in supported_units:
_LOGGER.warning("Unknown unit %s for %s", unit, quantity)

return cls(
endpoint="sensor",
Expand Down
6 changes: 4 additions & 2 deletions hatasmota/status_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
from .const import (
CONF_DEVICENAME,
CONF_MAC,
PERCENTAGE,
SENSOR_STATUS_IP,
SENSOR_STATUS_LINK_COUNT,
SENSOR_STATUS_MQTT_COUNT,
SENSOR_STATUS_RESTART,
SENSOR_STATUS_RSSI,
SENSOR_STATUS_SIGNAL,
SENSOR_STATUS_UPTIME,
SIGNAL_STRENGTH_DECIBELS,
)
from .entity import (
TasmotaAvailability,
Expand Down Expand Up @@ -112,8 +114,8 @@
SENSOR_STATUS_LINK_COUNT: None,
SENSOR_STATUS_MQTT_COUNT: None,
SENSOR_STATUS_RESTART: None,
SENSOR_STATUS_RSSI: "%",
SENSOR_STATUS_SIGNAL: "dB",
SENSOR_STATUS_RSSI: PERCENTAGE,
SENSOR_STATUS_SIGNAL: SIGNAL_STRENGTH_DECIBELS,
SENSOR_STATUS_UPTIME: None,
}

Expand Down