"""Sensor definitions for SMA WebConnect library for Python."""

from .const import Identifier
from .const_webconnect import (
    DEVICE_INFO,
    ENERGY_METER_VIA_INVERTER,
    GENERIC_SENSORS,
    JMESPATHS_TAG,
    OPTIMIZERS_VIA_INVERTER,
)
from .sensor import Sensor

# Status - Operation
#: Status of the device
status = Sensor(
    "6180_08214800", Identifier.status, path=JMESPATHS_TAG, l10n_translate=True
)
#: General operating status
operating_status_general = Sensor(
    "6180_08412800",
    Identifier.operating_status_genereal,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)
#: Operating status
operating_status = Sensor(
    "6180_08412B00",
    Identifier.operating_status,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)
# Status - Operation - Inverter
#: General operating status
inverter_condition = Sensor(
    "6180_08414C00",
    Identifier.inverter_condition,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)
#: Inverter Condition
inverter_system_init = Sensor(
    "6800_08811F00",
    Identifier.inverter_system_init,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)
#: Grid connection status
grid_connection_status = Sensor(
    "6180_0846A700",
    Identifier.grid_connection_status,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)
#: Grid relay status
grid_relay_status = Sensor(
    "6180_08416400",
    Identifier.grid_relay_status,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)

# DC side - DC measurements PV
#: Current power generated by the solar panels (A side)
pv_power_a = Sensor("6380_40251E00_0", Identifier.pv_power_a, unit="W")
#: Current power generated by the solar panels (B side)
pv_power_b = Sensor("6380_40251E00_1", Identifier.pv_power_b, unit="W")
#: Current power generated by the solar panels (C side)
pv_power_c = Sensor("6380_40251E00_2", Identifier.pv_power_c, unit="W", enabled=False)
#: Current voltage generated by the solar panels (A side)
pv_voltage_a = Sensor(
    "6380_40451F00_0", Identifier.pv_voltage_a, unit="V", factor=100, enabled=False
)
#: Current voltage generated by the solar panels (B side)
pv_voltage_b = Sensor(
    "6380_40451F00_1", Identifier.pv_voltage_b, unit="V", factor=100, enabled=False
)
#: Current voltage generated by the solar panels (C side)
pv_voltage_c = Sensor(
    "6380_40451F00_2", Identifier.pv_voltage_c, unit="V", factor=100, enabled=False
)
#: Current amperage generated by the solar panels (A side)
pv_current_a = Sensor("6380_40452100_0", Identifier.pv_current_a, unit="A", factor=1000)
#: Current amperage generated by the solar panels (B side)
pv_current_b = Sensor("6380_40452100_1", Identifier.pv_current_b, unit="A", factor=1000)
#: Current amperage generated by the solar panels (C side)
pv_current_c = Sensor(
    "6380_40452100_2", Identifier.pv_current_c, unit="A", factor=1000, enabled=False
)
#: Isolation Resistance
pv_isolation_resistance = Sensor(
    "6102_00254F00_0",
    Identifier.pv_isolation_resistance,
    unit="kOhm",
    factor=1000,
    enabled=False,
)

# DC Side - Insulation monitoring
#: Insulation residual current
insulation_residual_current = Sensor(
    "6102_40254E00", Identifier.insulation_residual_current, unit="mA", enabled=False
)

# AC Side - PV Power measurements
#: Current power generated by the solar panels
pv_power = Sensor("6100_0046C200", Identifier.pv_power, unit="W", enabled=False)

# AC Side - Grid measurements
#: Power supplied to the grid. grid_power = power_l1 + power_l2 + power_l3
grid_power = Sensor("6100_40263F00", Identifier.grid_power, unit="W")
#: Grid frequency
frequency = Sensor(
    "6100_00465700", Identifier.frequency, unit="Hz", factor=100, enabled=False
)

# AC Side - Grid measurements - Active power
#: Power for phase 1
power_l1 = Sensor("6100_40464000", Identifier.power_l1, unit="W", enabled=False)
#: Power for phase 2
power_l2 = Sensor("6100_40464100", Identifier.power_l2, unit="W", enabled=False)
#: Power for phase 3
power_l3 = Sensor("6100_40464200", Identifier.power_l3, unit="W", enabled=False)

# AC Side - Grid measurements - Reactive power
#: Total Reactive Power
grid_reactive_power = Sensor(
    "6100_40265F00", Identifier.grid_reactive_power, unit="var", enabled=False
)
#: Reactive Power for phase 1
grid_reactive_power_l1 = Sensor(
    "6100_40666000", Identifier.grid_reactive_power_l1, unit="var", enabled=False
)
#: Reactive Power for phase 2
grid_reactive_power_l2 = Sensor(
    "6100_40666100", Identifier.grid_reactive_power_l2, unit="var", enabled=False
)
#: Reactive Power for phase 3
grid_reactive_power_l3 = Sensor(
    "6100_40666200", Identifier.grid_reactive_power_l3, unit="var", enabled=False
)

# AC Side - Grid measurements - Apparent power
#: Total Apparent Power
grid_apparent_power = Sensor(
    "6100_40666700", Identifier.grid_apparent_power, unit="VA", enabled=False
)
#: Apparent Power for phase 1
grid_apparent_power_l1 = Sensor(
    "6100_40666800", Identifier.grid_apparent_power_l1, unit="VA", enabled=False
)
#: Apparent Power for phase 2
grid_apparent_power_l2 = Sensor(
    "6100_40666900", Identifier.grid_apparent_power_l2, unit="VA", enabled=False
)
#: Apparent Power for phase 3
grid_apparent_power_l3 = Sensor(
    "6100_40666A00", Identifier.grid_apparent_power_l3, unit="VA", enabled=False
)


# AC Side - Grid measurements - Power factor
#: Grid Power factor
grid_power_factor = Sensor(
    "6100_00665900", Identifier.grid_power_factor, unit="", factor=1000, enabled=False
)
#: Grid Power factor excitation
grid_power_factor_excitation = Sensor(
    "6180_08465A00",
    Identifier.grid_power_factor_excitation,
    path=JMESPATHS_TAG,
    l10n_translate=True,
    enabled=False,
)

# AC Side - Grid measurements - Phase Current
#: Current for phase 1
current_l1 = Sensor(
    "6100_40465300", Identifier.current_l1, unit="A", factor=1000, enabled=False
)
#: Current for phase 2
current_l2 = Sensor(
    "6100_40465400", Identifier.current_l2, unit="A", factor=1000, enabled=False
)
#: Current for phase 3
current_l3 = Sensor(
    "6100_40465500", Identifier.current_l3, unit="A", factor=1000, enabled=False
)
#: Total Current
current_total = Sensor("6100_00664F00", Identifier.current_total, unit="A", factor=1000)

# AC Side - Grid measurements - Phase voltage
#: Voltage for phase 1
voltage_l1 = Sensor(
    "6100_00464800", Identifier.voltage_l1, unit="V", factor=100, enabled=False
)
#: Voltage for phase 2
voltage_l2 = Sensor(
    "6100_00464900", Identifier.voltage_l2, unit="V", factor=100, enabled=False
)
#: Voltage for phase 3
voltage_l3 = Sensor(
    "6100_00464A00", Identifier.voltage_l3, unit="V", factor=100, enabled=False
)

# AC Side - Measured values - energy
#: Total power yield from a solar installation
total_yield = Sensor("6400_00260100", Identifier.total_yield, unit="kWh", factor=1000)
#: The solar plant's yield for today
daily_yield = Sensor("6400_00262200", Identifier.daily_yield, unit="Wh")

# AC Side - Measured values - Grid measurements
#: Power supplied to grid measured by energy meter
metering_power_supplied = Sensor(
    "6100_40463600", Identifier.metering_power_supplied, unit="W"
)
#: Power absorbed fromgrid measured by energy meter
metering_power_absorbed = Sensor(
    "6100_40463700", Identifier.metering_power_absorbed, unit="W"
)
#: Grid frequency measured by energy meter
metering_frequency = Sensor(
    "6100_00468100", Identifier.metering_frequency, unit="Hz", factor=100
)
#: Total power supplied to the grid measured by energy meter
metering_total_yield = Sensor(
    "6400_00462400", Identifier.metering_total_yield, unit="kWh", factor=1000
)
#: Total power from the grid measured by energy meter
metering_total_absorbed = Sensor(
    "6400_00462500", Identifier.metering_total_absorbed, unit="kWh", factor=1000
)

# AC Side - Measured values - Phase currents
#: Current for phase 1 measured by energy meter
metering_current_l1 = Sensor(
    "6100_40466500", Identifier.metering_current_l1, unit="A", factor=1000
)
#: Current for phase 2 measured by energy meter
metering_current_l2 = Sensor(
    "6100_40466600", Identifier.metering_current_l2, unit="A", factor=1000
)
#: Current for phase 3 measured by energy meter
metering_current_l3 = Sensor(
    "6100_40466B00", Identifier.metering_current_l3, unit="A", factor=1000
)

# AC Side - Measured values - Phase voltage
#: Voltage for phase 1 measured by energy meter
metering_voltage_l1 = Sensor(
    "6100_0046E500", Identifier.metering_voltage_l1, unit="V", factor=100, enabled=False
)
#: Voltage for phase 2 measured by energy meter
metering_voltage_l2 = Sensor(
    "6100_0046E600", Identifier.metering_voltage_l2, unit="V", factor=100, enabled=False
)
#: Voltage for phase 3 measured by energy meter
metering_voltage_l3 = Sensor(
    "6100_0046E700", Identifier.metering_voltage_l3, unit="V", factor=100, enabled=False
)

# AC Side - Electricity meter - Measured values - Active power feed-in
#: Active Power feed-in for phase 1 measured by energy meter
metering_active_power_feed_l1 = Sensor(
    "6100_0046E800", Identifier.metering_active_power_feed_l1, unit="W"
)
#: Active Power feed-in  for phase 2 measured by energy meter
metering_active_power_feed_l2 = Sensor(
    "6100_0046E900", Identifier.metering_active_power_feed_l2, unit="W"
)
#: Active Power feed-in  for phase 3 measured by energy meter
metering_active_power_feed_l3 = Sensor(
    "6100_0046EA00", Identifier.metering_active_power_feed_l3, unit="W"
)

# AC Side - Electricity meter - Measured values - Active power drawn
#: Active Power drawn for phase 1 measured by energy meter
metering_active_power_draw_l1 = Sensor(
    "6100_0046EB00", Identifier.metering_active_power_draw_l1, unit="W"
)
#: Active Power drawn for phase 2 measured by energy meter
metering_active_power_draw_l2 = Sensor(
    "6100_0046EC00", Identifier.metering_active_power_draw_l2, unit="W"
)
#: Active Power drawn for phase 3 measured by energy meter
metering_active_power_draw_l3 = Sensor(
    "6100_0046ED00", Identifier.metering_active_power_draw_l3, unit="W"
)
#: Current power consumption measured by energy meter
metering_current_consumption = Sensor(
    "6100_00543100", Identifier.metering_current_consumption, unit="W", enabled=False
)
#: Total power consumption measured by energy meter
metering_total_consumption = Sensor(
    "6400_00543A00",
    Identifier.metering_total_consumption,
    unit="kWh",
    factor=1000,
    enabled=False,
)

# AC Side - PV generation
#: Total kWh generated to date
pv_gen_meter = Sensor("6400_0046C300", Identifier.pv_gen_meter, unit="kWh", factor=1000)

# AC Side - Emergency power measurements (Secure Power Supply)
#: Secure power supply voltage
sps_voltage = Sensor(
    "6100_0046C600", Identifier.sps_voltage, unit="V", factor=100, enabled=False
)
#: Secure power supply current
sps_current = Sensor(
    "6100_0046C700", Identifier.sps_current, unit="A", factor=1000, enabled=False
)
#: Secure power supply power
sps_power = Sensor("6100_0046C800", Identifier.sps_power, unit="W", enabled=False)

# PV Inverter Optimizers
#: Serial number of optimizer
optimizer_serial = Sensor("6800_10852600", Identifier.optimizer_serial)
#: Power supplied by optimizer
optimizer_power = Sensor("6100_40652A00", Identifier.optimizer_power, unit="W")
#: Current supplied by optimizer
optimizer_current = Sensor(
    "6100_40652900", Identifier.optimizer_current, unit="A", factor=1000, enabled=False
)
#: Voltage supplied by optimizer
optimizer_voltage = Sensor(
    "6100_40652800", Identifier.optimizer_voltage, unit="V", factor=100, enabled=False
)
#: Temperature of optimizer
optimizer_temp = Sensor(
    "6100_40652B00", Identifier.optimizer_temp, unit="°C", factor=10, enabled=False
)


# Battery (inverter) - Battery (general parameters)
#: Total battery state of charge
battery_soc_total = Sensor("6100_00295A00", Identifier.battery_soc_total, unit="%")
#: State of charge battery A
battery_soc_a = Sensor(
    "6100_00498F00_0", Identifier.battery_soc_a, unit="%", enabled=False
)
#: State of charge battery B
battery_soc_b = Sensor(
    "6100_00498F00_1", Identifier.battery_soc_b, unit="%", enabled=False
)
#: State of charge battery C
battery_soc_c = Sensor(
    "6100_00498F00_2", Identifier.battery_soc_c, unit="%", enabled=False
)
#: Voltage battery A
battery_voltage_a = Sensor(
    "6100_00495C00_0", Identifier.battery_voltage_a, unit="V", factor=100, enabled=False
)
#: Voltage battery B
battery_voltage_b = Sensor(
    "6100_00495C00_1", Identifier.battery_voltage_b, unit="V", factor=100, enabled=False
)
#: Voltage battery C
battery_voltage_c = Sensor(
    "6100_00495C00_2", Identifier.battery_voltage_c, unit="V", factor=100, enabled=False
)
#: Current battery A
battery_current_a = Sensor(
    "6100_40495D00_0", Identifier.battery_current_a, unit="A", factor=1000
)
#: Current battery B
battery_current_b = Sensor(
    "6100_40495D00_1", Identifier.battery_current_b, unit="A", factor=1000
)
#: Current battery C
battery_current_c = Sensor(
    "6100_40495D00_2", Identifier.battery_current_c, unit="A", factor=1000
)
#: Temperature battery A
battery_temp_a = Sensor(
    "6100_40495B00_0", Identifier.battery_temp_a, unit="°C", factor=10
)
#: Temperature battery B
battery_temp_b = Sensor(
    "6100_40495B00_1", Identifier.battery_temp_b, unit="°C", factor=10
)
#: Temperature battery C
battery_temp_c = Sensor(
    "6100_40495B00_2", Identifier.battery_temp_c, unit="°C", factor=10
)
#: Battery status operating mode
battery_status_operating_mode = Sensor(
    "6180_08495E00",
    Identifier.battery_status_operating_mode,
    path=JMESPATHS_TAG,
    l10n_translate=True,
)

# Battery (inverter) - Diagnosis
#: Total battery capacity
battery_capacity_total = Sensor(
    "6100_00696E00", Identifier.battery_capacity_total, unit="%"
)
#: Capacity battery A
battery_capacity_a = Sensor(
    "6100_00499100_0", Identifier.battery_capacity_a, unit="%", enabled=False
)
#: Capacity battery B
battery_capacity_b = Sensor(
    "6100_00499100_1", Identifier.battery_capacity_b, unit="%", enabled=False
)
#: Capacity battery C
battery_capacity_c = Sensor(
    "6100_00499100_2", Identifier.battery_capacity_c, unit="%", enabled=False
)

# Battery (inverter) - Charge (voltage)
#: Charging voltage battery A
battery_charging_voltage_a = Sensor(
    "6102_00493500_0",
    Identifier.battery_charging_voltage_a,
    unit="V",
    factor=100,
    enabled=False,
)
#: Charging voltage battery B
battery_charging_voltage_b = Sensor(
    "6102_00493500_1",
    Identifier.battery_charging_voltage_b,
    unit="V",
    factor=100,
    enabled=False,
)
#: Charging voltage battery C
battery_charging_voltage_c = Sensor(
    "6102_00493500_2",
    Identifier.battery_charging_voltage_c,
    unit="V",
    factor=100,
    enabled=False,
)

# Battery (inverter) - Battery charge (power & energy)
#: Total charging power
battery_power_charge_total = Sensor(
    "6100_00496900", Identifier.battery_power_charge_total, unit="W"
)
#: Charging power battery A
battery_power_charge_a = Sensor(
    "6100_00499300_0", Identifier.battery_power_charge_a, unit="W", enabled=False
)
#: Charging power battery B
battery_power_charge_b = Sensor(
    "6100_00499300_1", Identifier.battery_power_charge_b, unit="W", enabled=False
)
#: Charging power battery C
battery_power_charge_c = Sensor(
    "6100_00499300_2", Identifier.battery_power_charge_c, unit="W", enabled=False
)
#: Total charge
battery_charge_total = Sensor(
    "6400_00496700", Identifier.battery_charge_total, unit="kWh", factor=1000
)
#: Charge battery A
battery_charge_a = Sensor(
    "6400_00499500_0",
    Identifier.battery_charge_a,
    unit="kWh",
    factor=1000,
    enabled=False,
)
#: Charge battery B
battery_charge_b = Sensor(
    "6400_00499500_1",
    Identifier.battery_charge_b,
    unit="kWh",
    factor=1000,
    enabled=False,
)
#: Charge battery C
battery_charge_c = Sensor(
    "6400_00499500_2",
    Identifier.battery_charge_c,
    unit="kWh",
    factor=1000,
    enabled=False,
)

# Battery (inverter) - Battery discharge (power & energy)
#: Total discharging power
battery_power_discharge_total = Sensor(
    "6100_00496A00", Identifier.battery_power_discharge_total, unit="W"
)
#: Disharging power battery A
battery_power_discharge_a = Sensor(
    "6100_00499400_0", Identifier.battery_power_discharge_a, unit="W", enabled=False
)
#: Disharging power battery B
battery_power_discharge_b = Sensor(
    "6100_00499400_1", Identifier.battery_power_discharge_b, unit="W", enabled=False
)
#: Disharging power battery C
battery_power_discharge_c = Sensor(
    "6100_00499400_2", Identifier.battery_power_discharge_c, unit="W", enabled=False
)
#: Total discharge
battery_discharge_total = Sensor(
    "6400_00496800", Identifier.battery_discharge_total, unit="kWh", factor=1000
)
#: Discharge battery A
battery_discharge_a = Sensor(
    "6400_00499600_0",
    Identifier.battery_discharge_a,
    unit="kWh",
    factor=1000,
    enabled=False,
)
#: Discharge battery B
battery_discharge_b = Sensor(
    "6400_00499600_1",
    Identifier.battery_discharge_b,
    unit="kWh",
    factor=1000,
    enabled=False,
)
#: Discharge battery C
battery_discharge_c = Sensor(
    "6400_00499600_2",
    Identifier.battery_discharge_c,
    unit="kWh",
    factor=1000,
    enabled=False,
)

# Device Parameters
# Type Label - Type Label
#: Device serial number
serial_number = Sensor("6800_00A21E00", Identifier.serial_number)
#: Device name
device_name = Sensor("6800_10821E00", Identifier.device_name)
#: Device type
device_type = Sensor(
    "6800_08822000", Identifier.device_type, path=JMESPATHS_TAG, l10n_translate=True
)
#: Device manufactorer
device_manufacturer = Sensor(
    "6800_08822B00",
    Identifier.device_manufacturer,
    path=JMESPATHS_TAG,
    l10n_translate=True,
)
#: Device software version
device_sw_version = Sensor("6800_00823400", Identifier.device_sw_version)

# Device - Inverter
#: Power limit of the Inverter
inverter_power_limit = Sensor(
    "6800_00832A00", Identifier.inverter_power_limit, unit="W"
)


active_power_limitation = Sensor(
    "6802_00832B00", Identifier.active_power_limitation, unit="W"
)


# System communication - Meter on Speedwire
#: Serial number of energy meter
energy_meter = Sensor("6800_008AA300", Identifier.energy_meter)


sensor_map = {
    GENERIC_SENSORS: [
        battery_capacity_a,
        battery_capacity_b,
        battery_capacity_c,
        battery_capacity_total,
        battery_charge_a,
        battery_charge_b,
        battery_charge_c,
        battery_charge_total,
        battery_charging_voltage_a,
        battery_charging_voltage_b,
        battery_charging_voltage_c,
        battery_current_a,
        battery_current_b,
        battery_current_c,
        battery_discharge_a,
        battery_discharge_b,
        battery_discharge_c,
        battery_discharge_total,
        battery_power_charge_a,
        battery_power_charge_b,
        battery_power_charge_c,
        battery_power_charge_total,
        battery_power_discharge_a,
        battery_power_discharge_b,
        battery_power_discharge_c,
        battery_power_discharge_total,
        battery_soc_a,
        battery_soc_b,
        battery_soc_c,
        battery_soc_total,
        battery_status_operating_mode,
        battery_temp_a,
        battery_temp_b,
        battery_temp_c,
        battery_voltage_a,
        battery_voltage_b,
        battery_voltage_c,
        current_l1,
        current_l2,
        current_l3,
        current_total,
        daily_yield,
        frequency,
        grid_apparent_power,
        grid_apparent_power_l1,
        grid_apparent_power_l2,
        grid_apparent_power_l3,
        grid_connection_status,
        grid_power,
        grid_power_factor,
        grid_power_factor_excitation,
        grid_reactive_power,
        grid_reactive_power_l1,
        grid_reactive_power_l2,
        grid_reactive_power_l3,
        grid_relay_status,
        insulation_residual_current,
        inverter_condition,
        inverter_power_limit,
        active_power_limitation,
        inverter_system_init,
        operating_status_general,
        operating_status,
        power_l1,
        power_l2,
        power_l3,
        pv_current_a,
        pv_current_b,
        pv_current_c,
        pv_gen_meter,
        pv_isolation_resistance,
        pv_power,
        pv_power_a,
        pv_power_b,
        pv_power_c,
        pv_voltage_a,
        pv_voltage_b,
        pv_voltage_c,
        sps_current,
        sps_power,
        sps_voltage,
        status,
        total_yield,
        voltage_l1,
        voltage_l2,
        voltage_l3,
    ],
    OPTIMIZERS_VIA_INVERTER: [
        optimizer_power,
        optimizer_current,
        optimizer_voltage,
        optimizer_temp,
    ],
    ENERGY_METER_VIA_INVERTER: [
        metering_power_supplied,
        metering_power_absorbed,
        metering_frequency,
        metering_total_yield,
        metering_total_absorbed,
        metering_current_l1,
        metering_current_l2,
        metering_current_l3,
        metering_voltage_l1,
        metering_voltage_l2,
        metering_voltage_l3,
        metering_active_power_feed_l1,
        metering_active_power_feed_l2,
        metering_active_power_feed_l3,
        metering_active_power_draw_l1,
        metering_active_power_draw_l2,
        metering_active_power_draw_l3,
        metering_current_consumption,
        metering_total_consumption,
    ],
    DEVICE_INFO: [
        serial_number,
        device_name,
        device_type,
        device_manufacturer,
        device_sw_version,
    ],
}
