Add entity translations for huisbaasje (#94116)
This commit is contained in:
parent
aec946e93a
commit
83c478105b
3 changed files with 107 additions and 68 deletions
|
@ -58,7 +58,7 @@ class HuisbaasjeSensorEntityDescription(SensorEntityDescription):
|
|||
|
||||
SENSORS_INFO = [
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Power",
|
||||
translation_key="current_power",
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
native_unit_of_measurement=UnitOfPower.WATT,
|
||||
|
@ -67,7 +67,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Power In Peak",
|
||||
translation_key="current_power_peak",
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
native_unit_of_measurement=UnitOfPower.WATT,
|
||||
|
@ -76,7 +76,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Power In Off Peak",
|
||||
translation_key="current_power_off_peak",
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
native_unit_of_measurement=UnitOfPower.WATT,
|
||||
|
@ -85,7 +85,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Power Out Peak",
|
||||
translation_key="current_power_out_peak",
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
native_unit_of_measurement=UnitOfPower.WATT,
|
||||
|
@ -94,7 +94,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Power Out Off Peak",
|
||||
translation_key="current_power_out_off_peak",
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
device_class=SensorDeviceClass.POWER,
|
||||
native_unit_of_measurement=UnitOfPower.WATT,
|
||||
|
@ -103,7 +103,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy Consumption Peak Today",
|
||||
translation_key="energy_consumption_peak_today",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
key=SOURCE_TYPE_ELECTRICITY_IN,
|
||||
|
@ -113,7 +113,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy Consumption Off Peak Today",
|
||||
translation_key="energy_consumption_off_peak_today",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
key=SOURCE_TYPE_ELECTRICITY_IN_LOW,
|
||||
|
@ -123,7 +123,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy Production Peak Today",
|
||||
translation_key="energy_production_peak_today",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
key=SOURCE_TYPE_ELECTRICITY_OUT,
|
||||
|
@ -133,7 +133,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy Production Off Peak Today",
|
||||
translation_key="energy_production_off_peak_today",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
key=SOURCE_TYPE_ELECTRICITY_OUT_LOW,
|
||||
|
@ -143,7 +143,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy Today",
|
||||
translation_key="energy_today",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
|
@ -153,7 +153,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy This Week",
|
||||
translation_key="energy_week",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
|
@ -163,7 +163,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy This Month",
|
||||
translation_key="energy_month",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
|
@ -173,7 +173,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Energy This Year",
|
||||
translation_key="energy_year",
|
||||
device_class=SensorDeviceClass.ENERGY,
|
||||
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
|
@ -183,7 +183,7 @@ SENSORS_INFO = [
|
|||
icon="mdi:lightning-bolt",
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Current Gas",
|
||||
translation_key="current_gas",
|
||||
native_unit_of_measurement=UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
|
||||
sensor_type=SENSOR_TYPE_RATE,
|
||||
state_class=SensorStateClass.MEASUREMENT,
|
||||
|
@ -192,7 +192,7 @@ SENSORS_INFO = [
|
|||
precision=1,
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Gas Today",
|
||||
translation_key="gas_today",
|
||||
device_class=SensorDeviceClass.GAS,
|
||||
native_unit_of_measurement=UnitOfVolume.CUBIC_METERS,
|
||||
key=SOURCE_TYPE_GAS,
|
||||
|
@ -202,7 +202,7 @@ SENSORS_INFO = [
|
|||
precision=1,
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Gas This Week",
|
||||
translation_key="gas_week",
|
||||
device_class=SensorDeviceClass.GAS,
|
||||
native_unit_of_measurement=UnitOfVolume.CUBIC_METERS,
|
||||
key=SOURCE_TYPE_GAS,
|
||||
|
@ -212,7 +212,7 @@ SENSORS_INFO = [
|
|||
precision=1,
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Gas This Month",
|
||||
translation_key="gas_month",
|
||||
device_class=SensorDeviceClass.GAS,
|
||||
native_unit_of_measurement=UnitOfVolume.CUBIC_METERS,
|
||||
key=SOURCE_TYPE_GAS,
|
||||
|
@ -222,7 +222,7 @@ SENSORS_INFO = [
|
|||
precision=1,
|
||||
),
|
||||
HuisbaasjeSensorEntityDescription(
|
||||
name="Huisbaasje Gas This Year",
|
||||
translation_key="gas_year",
|
||||
device_class=SensorDeviceClass.GAS,
|
||||
native_unit_of_measurement=UnitOfVolume.CUBIC_METERS,
|
||||
key=SOURCE_TYPE_GAS,
|
||||
|
@ -257,6 +257,7 @@ class HuisbaasjeSensor(
|
|||
"""Defines a Huisbaasje sensor."""
|
||||
|
||||
entity_description: HuisbaasjeSensorEntityDescription
|
||||
_attr_has_entity_name = True
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
|
|
@ -16,5 +16,63 @@
|
|||
"abort": {
|
||||
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"sensor": {
|
||||
"current_power": {
|
||||
"name": "Current power"
|
||||
},
|
||||
"current_power_peak": {
|
||||
"name": "Current power in peak"
|
||||
},
|
||||
"current_power_off_peak": {
|
||||
"name": "Current power in off peak"
|
||||
},
|
||||
"current_power_out_peak": {
|
||||
"name": "Current power out peak"
|
||||
},
|
||||
"current_power_out_off_peak": {
|
||||
"name": "Current power out off peak"
|
||||
},
|
||||
"energy_consumption_peak_today": {
|
||||
"name": "Energy consumption peak today"
|
||||
},
|
||||
"energy_consumption_off_peak_today": {
|
||||
"name": "Energy consumption off peak today"
|
||||
},
|
||||
"energy_production_peak_today": {
|
||||
"name": "Energy production peak today"
|
||||
},
|
||||
"energy_production_off_peak_today": {
|
||||
"name": "Energy production off peak today"
|
||||
},
|
||||
"energy_today": {
|
||||
"name": "Energy today"
|
||||
},
|
||||
"energy_week": {
|
||||
"name": "Energy this week"
|
||||
},
|
||||
"energy_month": {
|
||||
"name": "Energy this month"
|
||||
},
|
||||
"energy_year": {
|
||||
"name": "Energy this year"
|
||||
},
|
||||
"current_gas": {
|
||||
"name": "Current gas"
|
||||
},
|
||||
"gas_today": {
|
||||
"name": "Gas today"
|
||||
},
|
||||
"gas_week": {
|
||||
"name": "Gas this week"
|
||||
},
|
||||
"gas_month": {
|
||||
"name": "Gas this month"
|
||||
},
|
||||
"gas_year": {
|
||||
"name": "Gas this year"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
await hass.async_block_till_done()
|
||||
|
||||
# Assert data is loaded
|
||||
current_power = hass.states.get("sensor.huisbaasje_current_power")
|
||||
current_power = hass.states.get("sensor.current_power")
|
||||
assert current_power.state == "1012.0"
|
||||
assert (
|
||||
current_power.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.POWER
|
||||
|
@ -68,7 +68,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
current_power.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPower.WATT
|
||||
)
|
||||
|
||||
current_power_in = hass.states.get("sensor.huisbaasje_current_power_in_peak")
|
||||
current_power_in = hass.states.get("sensor.current_power_in_peak")
|
||||
assert current_power_in.state == "1012.0"
|
||||
assert (
|
||||
current_power_in.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -84,9 +84,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfPower.WATT
|
||||
)
|
||||
|
||||
current_power_in_low = hass.states.get(
|
||||
"sensor.huisbaasje_current_power_in_off_peak"
|
||||
)
|
||||
current_power_in_low = hass.states.get("sensor.current_power_in_off_peak")
|
||||
assert current_power_in_low.state == "unknown"
|
||||
assert (
|
||||
current_power_in_low.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -102,7 +100,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfPower.WATT
|
||||
)
|
||||
|
||||
current_power_out = hass.states.get("sensor.huisbaasje_current_power_out_peak")
|
||||
current_power_out = hass.states.get("sensor.current_power_out_peak")
|
||||
assert current_power_out.state == "unknown"
|
||||
assert (
|
||||
current_power_out.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -118,9 +116,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfPower.WATT
|
||||
)
|
||||
|
||||
current_power_out_low = hass.states.get(
|
||||
"sensor.huisbaasje_current_power_out_off_peak"
|
||||
)
|
||||
current_power_out_low = hass.states.get("sensor.current_power_out_off_peak")
|
||||
assert current_power_out_low.state == "unknown"
|
||||
assert (
|
||||
current_power_out_low.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -137,7 +133,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
)
|
||||
|
||||
energy_consumption_peak_today = hass.states.get(
|
||||
"sensor.huisbaasje_energy_consumption_peak_today"
|
||||
"sensor.energy_consumption_peak_today"
|
||||
)
|
||||
assert energy_consumption_peak_today.state == "2.67"
|
||||
assert (
|
||||
|
@ -158,7 +154,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
)
|
||||
|
||||
energy_consumption_off_peak_today = hass.states.get(
|
||||
"sensor.huisbaasje_energy_consumption_off_peak_today"
|
||||
"sensor.energy_consumption_off_peak_today"
|
||||
)
|
||||
assert energy_consumption_off_peak_today.state == "0.627"
|
||||
assert (
|
||||
|
@ -179,7 +175,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
)
|
||||
|
||||
energy_production_peak_today = hass.states.get(
|
||||
"sensor.huisbaasje_energy_production_peak_today"
|
||||
"sensor.energy_production_peak_today"
|
||||
)
|
||||
assert energy_production_peak_today.state == "1.512"
|
||||
assert (
|
||||
|
@ -200,7 +196,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
)
|
||||
|
||||
energy_production_off_peak_today = hass.states.get(
|
||||
"sensor.huisbaasje_energy_production_off_peak_today"
|
||||
"sensor.energy_production_off_peak_today"
|
||||
)
|
||||
assert energy_production_off_peak_today.state == "1.093"
|
||||
assert (
|
||||
|
@ -220,7 +216,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfEnergy.KILO_WATT_HOUR
|
||||
)
|
||||
|
||||
energy_today = hass.states.get("sensor.huisbaasje_energy_today")
|
||||
energy_today = hass.states.get("sensor.energy_today")
|
||||
assert energy_today.state == "3.3"
|
||||
assert (
|
||||
energy_today.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.ENERGY
|
||||
|
@ -235,7 +231,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfEnergy.KILO_WATT_HOUR
|
||||
)
|
||||
|
||||
energy_this_week = hass.states.get("sensor.huisbaasje_energy_this_week")
|
||||
energy_this_week = hass.states.get("sensor.energy_this_week")
|
||||
assert energy_this_week.state == "17.5"
|
||||
assert (
|
||||
energy_this_week.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -251,7 +247,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfEnergy.KILO_WATT_HOUR
|
||||
)
|
||||
|
||||
energy_this_month = hass.states.get("sensor.huisbaasje_energy_this_month")
|
||||
energy_this_month = hass.states.get("sensor.energy_this_month")
|
||||
assert energy_this_month.state == "103.3"
|
||||
assert (
|
||||
energy_this_month.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -267,7 +263,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfEnergy.KILO_WATT_HOUR
|
||||
)
|
||||
|
||||
energy_this_year = hass.states.get("sensor.huisbaasje_energy_this_year")
|
||||
energy_this_year = hass.states.get("sensor.energy_this_year")
|
||||
assert energy_this_year.state == "673.0"
|
||||
assert (
|
||||
energy_this_year.attributes.get(ATTR_DEVICE_CLASS)
|
||||
|
@ -283,7 +279,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfEnergy.KILO_WATT_HOUR
|
||||
)
|
||||
|
||||
current_gas = hass.states.get("sensor.huisbaasje_current_gas")
|
||||
current_gas = hass.states.get("sensor.current_gas")
|
||||
assert current_gas.state == "0.0"
|
||||
assert current_gas.attributes.get(ATTR_DEVICE_CLASS) is None
|
||||
assert current_gas.attributes.get(ATTR_ICON) == "mdi:fire"
|
||||
|
@ -295,7 +291,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR
|
||||
)
|
||||
|
||||
gas_today = hass.states.get("sensor.huisbaasje_gas_today")
|
||||
gas_today = hass.states.get("sensor.gas_today")
|
||||
assert gas_today.state == "1.1"
|
||||
assert gas_today.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.GAS
|
||||
assert gas_today.attributes.get(ATTR_ICON) == "mdi:counter"
|
||||
|
@ -308,7 +304,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfVolume.CUBIC_METERS
|
||||
)
|
||||
|
||||
gas_this_week = hass.states.get("sensor.huisbaasje_gas_this_week")
|
||||
gas_this_week = hass.states.get("sensor.gas_this_week")
|
||||
assert gas_this_week.state == "5.6"
|
||||
assert gas_this_week.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.GAS
|
||||
assert gas_this_week.attributes.get(ATTR_ICON) == "mdi:counter"
|
||||
|
@ -321,7 +317,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfVolume.CUBIC_METERS
|
||||
)
|
||||
|
||||
gas_this_month = hass.states.get("sensor.huisbaasje_gas_this_month")
|
||||
gas_this_month = hass.states.get("sensor.gas_this_month")
|
||||
assert gas_this_month.state == "39.1"
|
||||
assert gas_this_month.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.GAS
|
||||
assert gas_this_month.attributes.get(ATTR_ICON) == "mdi:counter"
|
||||
|
@ -334,7 +330,7 @@ async def test_setup_entry(hass: HomeAssistant) -> None:
|
|||
== UnitOfVolume.CUBIC_METERS
|
||||
)
|
||||
|
||||
gas_this_year = hass.states.get("sensor.huisbaasje_gas_this_year")
|
||||
gas_this_year = hass.states.get("sensor.gas_this_year")
|
||||
assert gas_this_year.state == "116.7"
|
||||
assert gas_this_year.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.GAS
|
||||
assert gas_this_year.attributes.get(ATTR_ICON) == "mdi:counter"
|
||||
|
@ -381,42 +377,26 @@ async def test_setup_entry_absent_measurement(hass: HomeAssistant) -> None:
|
|||
await hass.async_block_till_done()
|
||||
|
||||
# Assert data is loaded
|
||||
assert hass.states.get("sensor.huisbaasje_current_power").state == "1012.0"
|
||||
assert hass.states.get("sensor.current_power").state == "1012.0"
|
||||
assert hass.states.get("sensor.current_power_in_peak").state == "unknown"
|
||||
assert hass.states.get("sensor.current_power_in_off_peak").state == "unknown"
|
||||
assert hass.states.get("sensor.current_power_out_peak").state == "unknown"
|
||||
assert hass.states.get("sensor.current_power_out_off_peak").state == "unknown"
|
||||
assert hass.states.get("sensor.current_gas").state == "unknown"
|
||||
assert hass.states.get("sensor.energy_today").state == "3.3"
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_current_power_in_peak").state
|
||||
== "unknown"
|
||||
hass.states.get("sensor.energy_consumption_peak_today").state == "unknown"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_current_power_in_off_peak").state
|
||||
hass.states.get("sensor.energy_consumption_off_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert hass.states.get("sensor.energy_production_peak_today").state == "unknown"
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_current_power_out_peak").state
|
||||
hass.states.get("sensor.energy_production_off_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_current_power_out_off_peak").state
|
||||
== "unknown"
|
||||
)
|
||||
assert hass.states.get("sensor.huisbaasje_current_gas").state == "unknown"
|
||||
assert hass.states.get("sensor.huisbaasje_energy_today").state == "3.3"
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_energy_consumption_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_energy_consumption_off_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_energy_production_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert (
|
||||
hass.states.get("sensor.huisbaasje_energy_production_off_peak_today").state
|
||||
== "unknown"
|
||||
)
|
||||
assert hass.states.get("sensor.huisbaasje_gas_today").state == "unknown"
|
||||
assert hass.states.get("sensor.gas_today").state == "unknown"
|
||||
|
||||
# Assert mocks are called
|
||||
assert len(mock_authenticate.mock_calls) == 1
|
||||
|
|
Loading…
Add table
Reference in a new issue