Repository: XKNX/xknx
Pull request #1401 (2024-02-05 09:27:17)

`None` invalid address parameter; Broadcast address invalid for RemoteValue and Device
<!--
  You are awesome! Thanks for contributing to our project!
  Please, DO NOT DELETE ANY TEXT from this template!.
-->
## Description
<!--
Please include a summary of the change and which issue is fixed.
Please also include relevant motivation and context.
List any dependencies that are required for this change.
-->
- `None` in a RemoteValue or Device group address list is now ignored instead of parsed as broadcast address.
- Broadcast address ("0/0/0") is now invalid for RemoteValue and Device group addresses and raises `CouldNotParseAddress`.
- `None` is not a valid address parameter for GroupAddress and IndividualAddress anymore. It raises `CouldNotParseAddress`.
- Added message to `CouldNotParseAddress` for more information about why it was raised.

Fixes # (issue)

## Type of change
<!--
Please tick the applicable options.
NOTE: Ticking multiple options most likely indicates
that your change is to big and it is suggested to split it into several smaller PRs.
-->

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [x] Code quality improvements to existing code or addition of tests

## Checklist

- [ ] The documentation has been adjusted accordingly
- [x] Tests have been added that prove the fix is effective or that the feature works
- [x] The changes are documented in the changelog (docs/changelog.md)


Patch:
diff --git a/docs/changelog.md b/docs/changelog.md
index f6b82de6..46538590 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -8,7 +8,13 @@ nav_order: 2
 
 # Unreleased changes
 
-### Connection
+### Bugfixes
+
+- `None` is not a valid address parameter for GroupAddress and IndividualAddress anymore. It raises `CouldNotParseAddress`.
+- `None` in a RemoteValue or Device group address list is now ignored instead of parsed as broadcast address.
+- Broadcast address ("0/0/0") is now invalid for RemoteValue and Device group addresses and raises `CouldNotParseAddress`.
+
+### Management
 
 - Add new management routines for device management: `nm_invididual_address_write`,  `nm_individual_address_read`, `nm_individual_address_serial_number_read` and `nm_individual_address_serial_number_write`.
 - Add handling mechanism for broadcast telegrams in the management class.
diff --git a/requirements/production.txt b/requirements/production.txt
index e6ef5ea0..af8e76cd 100644
--- a/requirements/production.txt
+++ b/requirements/production.txt
@@ -1,3 +1,3 @@
 async-timeout==4.0.2;python_version<"3.11"
-cryptography==42.0.1
+cryptography==42.0.2
 ifaddr==0.2.0
diff --git a/xknx/devices/binary_sensor.py b/xknx/devices/binary_sensor.py
index d662ab33..5691be23 100644
--- a/xknx/devices/binary_sensor.py
+++ b/xknx/devices/binary_sensor.py
@@ -33,7 +33,7 @@ class BinarySensor(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_state: GroupAddressesType | None = None,
+        group_address_state: GroupAddressesType = None,
         invert: bool = False,
         sync_state: bool | int | float | str = True,
         ignore_internal_state: bool = False,
diff --git a/xknx/devices/climate.py b/xknx/devices/climate.py
index 2200a7d5..88135368 100644
--- a/xknx/devices/climate.py
+++ b/xknx/devices/climate.py
@@ -43,20 +43,20 @@ class Climate(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_temperature: GroupAddressesType | None = None,
-        group_address_target_temperature: GroupAddressesType | None = None,
-        group_address_target_temperature_state: GroupAddressesType | None = None,
-        group_address_setpoint_shift: GroupAddressesType | None = None,
-        group_address_setpoint_shift_state: GroupAddressesType | None = None,
+        group_address_temperature: GroupAddressesType = None,
+        group_address_target_temperature: GroupAddressesType = None,
+        group_address_target_temperature_state: GroupAddressesType = None,
+        group_address_setpoint_shift: GroupAddressesType = None,
+        group_address_setpoint_shift_state: GroupAddressesType = None,
         setpoint_shift_mode: SetpointShiftMode | None = None,
         setpoint_shift_max: float = DEFAULT_SETPOINT_SHIFT_MAX,
         setpoint_shift_min: float = DEFAULT_SETPOINT_SHIFT_MIN,
         temperature_step: float = DEFAULT_TEMPERATURE_STEP,
-        group_address_on_off: GroupAddressesType | None = None,
-        group_address_on_off_state: GroupAddressesType | None = None,
+        group_address_on_off: GroupAddressesType = None,
+        group_address_on_off_state: GroupAddressesType = None,
         on_off_invert: bool = False,
-        group_address_active_state: GroupAddressesType | None = None,
-        group_address_command_value_state: GroupAddressesType | None = None,
+        group_address_active_state: GroupAddressesType = None,
+        group_address_command_value_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         min_temp: float | None = None,
         max_temp: float | None = None,
diff --git a/xknx/devices/climate_mode.py b/xknx/devices/climate_mode.py
index 7326e4a4..681df9ee 100644
--- a/xknx/devices/climate_mode.py
+++ b/xknx/devices/climate_mode.py
@@ -35,18 +35,18 @@ class ClimateMode(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_operation_mode: GroupAddressesType | None = None,
-        group_address_operation_mode_state: GroupAddressesType | None = None,
-        group_address_operation_mode_protection: GroupAddressesType | None = None,
-        group_address_operation_mode_night: GroupAddressesType | None = None,
-        group_address_operation_mode_comfort: GroupAddressesType | None = None,
-        group_address_operation_mode_standby: GroupAddressesType | None = None,
-        group_address_controller_status: GroupAddressesType | None = None,
-        group_address_controller_status_state: GroupAddressesType | None = None,
-        group_address_controller_mode: GroupAddressesType | None = None,
-        group_address_controller_mode_state: GroupAddressesType | None = None,
-        group_address_heat_cool: GroupAddressesType | None = None,
-        group_address_heat_cool_state: GroupAddressesType | None = None,
+        group_address_operation_mode: GroupAddressesType = None,
+        group_address_operation_mode_state: GroupAddressesType = None,
+        group_address_operation_mode_protection: GroupAddressesType = None,
+        group_address_operation_mode_night: GroupAddressesType = None,
+        group_address_operation_mode_comfort: GroupAddressesType = None,
+        group_address_operation_mode_standby: GroupAddressesType = None,
+        group_address_controller_status: GroupAddressesType = None,
+        group_address_controller_status_state: GroupAddressesType = None,
+        group_address_controller_mode: GroupAddressesType = None,
+        group_address_controller_mode_state: GroupAddressesType = None,
+        group_address_heat_cool: GroupAddressesType = None,
+        group_address_heat_cool_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         operation_modes: list[str | HVACOperationMode] | None = None,
         controller_modes: list[str | HVACControllerMode] | None = None,
diff --git a/xknx/devices/cover.py b/xknx/devices/cover.py
index 50f92d12..2fddab29 100644
--- a/xknx/devices/cover.py
+++ b/xknx/devices/cover.py
@@ -45,14 +45,14 @@ class Cover(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_long: GroupAddressesType | None = None,
-        group_address_short: GroupAddressesType | None = None,
-        group_address_stop: GroupAddressesType | None = None,
-        group_address_position: GroupAddressesType | None = None,
-        group_address_position_state: GroupAddressesType | None = None,
-        group_address_angle: GroupAddressesType | None = None,
-        group_address_angle_state: GroupAddressesType | None = None,
-        group_address_locked_state: GroupAddressesType | None = None,
+        group_address_long: GroupAddressesType = None,
+        group_address_short: GroupAddressesType = None,
+        group_address_stop: GroupAddressesType = None,
+        group_address_position: GroupAddressesType = None,
+        group_address_position_state: GroupAddressesType = None,
+        group_address_angle: GroupAddressesType = None,
+        group_address_angle_state: GroupAddressesType = None,
+        group_address_locked_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         travel_time_down: float = DEFAULT_TRAVEL_TIME,
         travel_time_up: float = DEFAULT_TRAVEL_TIME,
diff --git a/xknx/devices/datetime.py b/xknx/devices/datetime.py
index af996e8c..650c1c77 100644
--- a/xknx/devices/datetime.py
+++ b/xknx/devices/datetime.py
@@ -34,8 +34,8 @@ class DateTime(Device):
         name: str,
         broadcast_type: str = "TIME",
         localtime: bool = True,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         respond_to_read: bool = False,
         sync_state: bool | int | float | str = True,
         device_updated_cb: DeviceCallbackType[DateTime] | None = None,
diff --git a/xknx/devices/expose_sensor.py b/xknx/devices/expose_sensor.py
index 1cd6e085..8f5fe988 100644
--- a/xknx/devices/expose_sensor.py
+++ b/xknx/devices/expose_sensor.py
@@ -38,7 +38,7 @@ class ExposeSensor(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
         respond_to_read: bool = True,
         value_type: int | str | None = None,
         cooldown: float = 0,
diff --git a/xknx/devices/fan.py b/xknx/devices/fan.py
index 5e3d82a7..e78fa8fb 100644
--- a/xknx/devices/fan.py
+++ b/xknx/devices/fan.py
@@ -46,12 +46,12 @@ class Fan(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_speed: GroupAddressesType | None = None,
-        group_address_speed_state: GroupAddressesType | None = None,
-        group_address_oscillation: GroupAddressesType | None = None,
-        group_address_oscillation_state: GroupAddressesType | None = None,
-        group_address_switch: GroupAddressesType | None = None,
-        group_address_switch_state: GroupAddressesType | None = None,
+        group_address_speed: GroupAddressesType = None,
+        group_address_speed_state: GroupAddressesType = None,
+        group_address_oscillation: GroupAddressesType = None,
+        group_address_oscillation_state: GroupAddressesType = None,
+        group_address_switch: GroupAddressesType = None,
+        group_address_switch_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_updated_cb: DeviceCallbackType[Fan] | None = None,
         max_step: int | None = None,
diff --git a/xknx/devices/light.py b/xknx/devices/light.py
index 701e9d41..c1eaa6c7 100644
--- a/xknx/devices/light.py
+++ b/xknx/devices/light.py
@@ -55,10 +55,10 @@ class _SwitchAndBrightness:
         xknx: XKNX,
         name: str,
         feature_name: str,
-        group_address_switch: GroupAddressesType | None = None,
-        group_address_switch_state: GroupAddressesType | None = None,
-        group_address_brightness: GroupAddressesType | None = None,
-        group_address_brightness_state: GroupAddressesType | None = None,
+        group_address_switch: GroupAddressesType = None,
+        group_address_switch_state: GroupAddressesType = None,
+        group_address_brightness: GroupAddressesType = None,
+        group_address_brightness_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         after_update_cb: AsyncCallback | None = None,
     ):
@@ -124,40 +124,40 @@ class Light(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_switch: GroupAddressesType | None = None,
-        group_address_switch_state: GroupAddressesType | None = None,
-        group_address_brightness: GroupAddressesType | None = None,
-        group_address_brightness_state: GroupAddressesType | None = None,
-        group_address_color: GroupAddressesType | None = None,
-        group_address_color_state: GroupAddressesType | None = None,
-        group_address_rgbw: GroupAddressesType | None = None,
-        group_address_rgbw_state: GroupAddressesType | None = None,
-        group_address_hue: GroupAddressesType | None = None,
-        group_address_hue_state: GroupAddressesType | None = None,
-        group_address_saturation: GroupAddressesType | None = None,
-        group_address_saturation_state: GroupAddressesType | None = None,
-        group_address_xyy_color: GroupAddressesType | None = None,
-        group_address_xyy_color_state: GroupAddressesType | None = None,
-        group_address_tunable_white: GroupAddressesType | None = None,
-        group_address_tunable_white_state: GroupAddressesType | None = None,
-        group_address_color_temperature: GroupAddressesType | None = None,
-        group_address_color_temperature_state: GroupAddressesType | None = None,
-        group_address_switch_red: GroupAddressesType | None = None,
-        group_address_switch_red_state: GroupAddressesType | None = None,
-        group_address_brightness_red: GroupAddressesType | None = None,
-        group_address_brightness_red_state: GroupAddressesType | None = None,
-        group_address_switch_green: GroupAddressesType | None = None,
-        group_address_switch_green_state: GroupAddressesType | None = None,
-        group_address_brightness_green: GroupAddressesType | None = None,
-        group_address_brightness_green_state: GroupAddressesType | None = None,
-        group_address_switch_blue: GroupAddressesType | None = None,
-        group_address_switch_blue_state: GroupAddressesType | None = None,
-        group_address_brightness_blue: GroupAddressesType | None = None,
-        group_address_brightness_blue_state: GroupAddressesType | None = None,
-        group_address_switch_white: GroupAddressesType | None = None,
-        group_address_switch_white_state: GroupAddressesType | None = None,
-        group_address_brightness_white: GroupAddressesType | None = None,
-        group_address_brightness_white_state: GroupAddressesType | None = None,
+        group_address_switch: GroupAddressesType = None,
+        group_address_switch_state: GroupAddressesType = None,
+        group_address_brightness: GroupAddressesType = None,
+        group_address_brightness_state: GroupAddressesType = None,
+        group_address_color: GroupAddressesType = None,
+        group_address_color_state: GroupAddressesType = None,
+        group_address_rgbw: GroupAddressesType = None,
+        group_address_rgbw_state: GroupAddressesType = None,
+        group_address_hue: GroupAddressesType = None,
+        group_address_hue_state: GroupAddressesType = None,
+        group_address_saturation: GroupAddressesType = None,
+        group_address_saturation_state: GroupAddressesType = None,
+        group_address_xyy_color: GroupAddressesType = None,
+        group_address_xyy_color_state: GroupAddressesType = None,
+        group_address_tunable_white: GroupAddressesType = None,
+        group_address_tunable_white_state: GroupAddressesType = None,
+        group_address_color_temperature: GroupAddressesType = None,
+        group_address_color_temperature_state: GroupAddressesType = None,
+        group_address_switch_red: GroupAddressesType = None,
+        group_address_switch_red_state: GroupAddressesType = None,
+        group_address_brightness_red: GroupAddressesType = None,
+        group_address_brightness_red_state: GroupAddressesType = None,
+        group_address_switch_green: GroupAddressesType = None,
+        group_address_switch_green_state: GroupAddressesType = None,
+        group_address_brightness_green: GroupAddressesType = None,
+        group_address_brightness_green_state: GroupAddressesType = None,
+        group_address_switch_blue: GroupAddressesType = None,
+        group_address_switch_blue_state: GroupAddressesType = None,
+        group_address_brightness_blue: GroupAddressesType = None,
+        group_address_brightness_blue_state: GroupAddressesType = None,
+        group_address_switch_white: GroupAddressesType = None,
+        group_address_switch_white_state: GroupAddressesType = None,
+        group_address_brightness_white: GroupAddressesType = None,
+        group_address_brightness_white_state: GroupAddressesType = None,
         color_temperature_type: ColorTemperatureType = ColorTemperatureType.UINT_2_BYTE,
         sync_state: bool | int | float | str = True,
         min_kelvin: int | None = None,
diff --git a/xknx/devices/notification.py b/xknx/devices/notification.py
index 3704ed43..cc52f19b 100644
--- a/xknx/devices/notification.py
+++ b/xknx/devices/notification.py
@@ -20,8 +20,8 @@ class Notification(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         respond_to_read: bool = False,
         sync_state: bool | int | float | str = True,
         value_type: int | str | None = None,
diff --git a/xknx/devices/numeric_value.py b/xknx/devices/numeric_value.py
index e2fa230f..47897523 100644
--- a/xknx/devices/numeric_value.py
+++ b/xknx/devices/numeric_value.py
@@ -28,8 +28,8 @@ class NumericValue(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         respond_to_read: bool = False,
         sync_state: bool | int | float | str = True,
         value_type: int | str | None = None,
diff --git a/xknx/devices/raw_value.py b/xknx/devices/raw_value.py
index e30d2b16..a697ef8c 100644
--- a/xknx/devices/raw_value.py
+++ b/xknx/devices/raw_value.py
@@ -29,8 +29,8 @@ class RawValue(Device):
         xknx: XKNX,
         name: str,
         payload_length: int,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         respond_to_read: bool = False,
         sync_state: bool | int | float | str = True,
         always_callback: bool = False,
diff --git a/xknx/devices/scene.py b/xknx/devices/scene.py
index f311a9a7..b253db78 100644
--- a/xknx/devices/scene.py
+++ b/xknx/devices/scene.py
@@ -22,7 +22,7 @@ class Scene(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
         scene_number: int = 1,
         device_updated_cb: DeviceCallbackType[Scene] | None = None,
     ):
diff --git a/xknx/devices/sensor.py b/xknx/devices/sensor.py
index 0b4e3822..6b91f4b1 100644
--- a/xknx/devices/sensor.py
+++ b/xknx/devices/sensor.py
@@ -32,7 +32,7 @@ class Sensor(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_state: GroupAddressesType | None = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         always_callback: bool = False,
         value_type: int | str | None = None,
diff --git a/xknx/devices/switch.py b/xknx/devices/switch.py
index 75369993..9f83bc3a 100644
--- a/xknx/devices/switch.py
+++ b/xknx/devices/switch.py
@@ -33,8 +33,8 @@ class Switch(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         respond_to_read: bool = False,
         sync_state: bool | int | float | str = True,
         invert: bool = False,
diff --git a/xknx/devices/weather.py b/xknx/devices/weather.py
index 6907a9c1..f491cbf6 100644
--- a/xknx/devices/weather.py
+++ b/xknx/devices/weather.py
@@ -85,19 +85,19 @@ class Weather(Device):
         self,
         xknx: XKNX,
         name: str,
-        group_address_temperature: GroupAddressesType | None = None,
-        group_address_brightness_south: GroupAddressesType | None = None,
-        group_address_brightness_north: GroupAddressesType | None = None,
-        group_address_brightness_west: GroupAddressesType | None = None,
-        group_address_brightness_east: GroupAddressesType | None = None,
-        group_address_wind_speed: GroupAddressesType | None = None,
-        group_address_wind_bearing: GroupAddressesType | None = None,
-        group_address_rain_alarm: GroupAddressesType | None = None,
-        group_address_frost_alarm: GroupAddressesType | None = None,
-        group_address_wind_alarm: GroupAddressesType | None = None,
-        group_address_day_night: GroupAddressesType | None = None,
-        group_address_air_pressure: GroupAddressesType | None = None,
-        group_address_humidity: GroupAddressesType | None = None,
+        group_address_temperature: GroupAddressesType = None,
+        group_address_brightness_south: GroupAddressesType = None,
+        group_address_brightness_north: GroupAddressesType = None,
+        group_address_brightness_west: GroupAddressesType = None,
+        group_address_brightness_east: GroupAddressesType = None,
+        group_address_wind_speed: GroupAddressesType = None,
+        group_address_wind_bearing: GroupAddressesType = None,
+        group_address_rain_alarm: GroupAddressesType = None,
+        group_address_frost_alarm: GroupAddressesType = None,
+        group_address_wind_alarm: GroupAddressesType = None,
+        group_address_day_night: GroupAddressesType = None,
+        group_address_air_pressure: GroupAddressesType = None,
+        group_address_humidity: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_updated_cb: DeviceCallbackType[Weather] | None = None,
     ) -> None:
diff --git a/xknx/exceptions/exception.py b/xknx/exceptions/exception.py
index 092369f3..3126709b 100644
--- a/xknx/exceptions/exception.py
+++ b/xknx/exceptions/exception.py
@@ -143,16 +143,16 @@ class ConversionError(XKNXException):
 class CouldNotParseAddress(XKNXException):
     """Exception class for wrong address format."""
 
-    def __init__(
-        self, address: object | str | tuple[Any, ...] | int | None = None
-    ) -> None:
+    def __init__(self, address: Any = None, message: str = "") -> None:
         """Initialize CouldNotParseAddress class."""
         super().__init__()
         self.address = address
+        self.message = message
 
     def __str__(self) -> str:
         """Return object as readable string."""
-        return f'<CouldNotParseAddress address="{self.address}" />'
+        _msg = f'message="{self.message}" ' if self.message else ""
+        return f'<CouldNotParseAddress address="{self.address}" {_msg}/>'
 
 
 class DeviceIllegalValue(XKNXException):
diff --git a/xknx/knxip/dib.py b/xknx/knxip/dib.py
index e6ed0437..4a82e09a 100644
--- a/xknx/knxip/dib.py
+++ b/xknx/knxip/dib.py
@@ -127,7 +127,7 @@ class DIBDeviceInformation(DIB):
         """Initialize DIBDeviceInformation class."""
         self.knx_medium: KNXMedium = KNXMedium.TP1
         self.programming_mode: bool = False
-        self.individual_address: IndividualAddress = IndividualAddress(None)
+        self.individual_address: IndividualAddress = IndividualAddress(0)
         self.installation_number: int = 0
         self.project_number: int = 0
         self.serial_number: str = ""
diff --git a/xknx/remote_value/remote_value.py b/xknx/remote_value/remote_value.py
index ae254d69..16cee0b1 100644
--- a/xknx/remote_value/remote_value.py
+++ b/xknx/remote_value/remote_value.py
@@ -30,7 +30,9 @@ if TYPE_CHECKING:
 logger = logging.getLogger("xknx.log")
 
 AsyncCallbackType = Callable[[], Awaitable[None]]
-GroupAddressesType = Union["DeviceAddressableType", list["DeviceAddressableType"]]
+GroupAddressesType = Union[
+    "DeviceAddressableType", list[Union["DeviceAddressableType", None]], None
+]
 ValueT = TypeVar("ValueT")
 
 
@@ -40,8 +42,8 @@ class RemoteValue(ABC, Generic[ValueT]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: None | bool | int | float | str = None,
         device_name: str | None = None,
         feature_name: str | None = None,
@@ -52,16 +54,23 @@ class RemoteValue(ABC, Generic[ValueT]):
         self.passive_group_addresses: list[DeviceGroupAddress] = []
 
         def unpack_group_addresses(
-            addresses: GroupAddressesType | None,
+            addresses: GroupAddressesType,
         ) -> DeviceGroupAddress | None:
             """Parse group addresses and assign passive addresses when given."""
-            if not addresses:  # None or empty list
+            if addresses is None:
                 return None
             if not isinstance(addresses, list):
                 return parse_device_group_address(addresses)
-            active, *passive = map(parse_device_group_address, addresses)
+            if not addresses:  # empty list
+                return None
+            active = addresses[0]
+            passive = [
+                parse_device_group_address(addr)
+                for addr in addresses[1:]
+                if addr is not None
+            ]
             self.passive_group_addresses.extend(passive)
-            return active
+            return parse_device_group_address(active) if active is not None else None
 
         self.group_address = unpack_group_addresses(group_address)
         self.group_address_state = unpack_group_addresses(group_address_state)
diff --git a/xknx/remote_value/remote_value_climate_mode.py b/xknx/remote_value/remote_value_climate_mode.py
index 5f688bbe..f2344cb3 100644
--- a/xknx/remote_value/remote_value_climate_mode.py
+++ b/xknx/remote_value/remote_value_climate_mode.py
@@ -47,8 +47,8 @@ class RemoteValueOperationMode(RemoteValueClimateModeBase[HVACOperationMode]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Climate mode",
@@ -95,8 +95,8 @@ class RemoteValueControllerMode(RemoteValueClimateModeBase[HVACControllerMode]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Controller Mode",
@@ -132,8 +132,8 @@ class RemoteValueBinaryOperationMode(RemoteValueClimateModeBase[HVACOperationMod
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Climate mode binary",
@@ -207,8 +207,8 @@ class RemoteValueBinaryHeatCool(RemoteValueClimateModeBase[HVACControllerMode]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Controller mode Heat/Cool",
diff --git a/xknx/remote_value/remote_value_color_rgb.py b/xknx/remote_value/remote_value_color_rgb.py
index a1aa9970..b726bc44 100644
--- a/xknx/remote_value/remote_value_color_rgb.py
+++ b/xknx/remote_value/remote_value_color_rgb.py
@@ -23,8 +23,8 @@ class RemoteValueColorRGB(RemoteValue[tuple[int, int, int]]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Color RGB",
diff --git a/xknx/remote_value/remote_value_color_rgbw.py b/xknx/remote_value/remote_value_color_rgbw.py
index 56eb5d56..86bb6cc3 100644
--- a/xknx/remote_value/remote_value_color_rgbw.py
+++ b/xknx/remote_value/remote_value_color_rgbw.py
@@ -23,8 +23,8 @@ class RemoteValueColorRGBW(RemoteValue[tuple[int, int, int, int]]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Color RGBW",
diff --git a/xknx/remote_value/remote_value_color_xyy.py b/xknx/remote_value/remote_value_color_xyy.py
index 5084ad93..ac86245c 100644
--- a/xknx/remote_value/remote_value_color_xyy.py
+++ b/xknx/remote_value/remote_value_color_xyy.py
@@ -22,8 +22,8 @@ class RemoteValueColorXYY(RemoteValue[XYYColor]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Color xyY",
diff --git a/xknx/remote_value/remote_value_control.py b/xknx/remote_value/remote_value_control.py
index b494ceac..dcc04801 100644
--- a/xknx/remote_value/remote_value_control.py
+++ b/xknx/remote_value/remote_value_control.py
@@ -23,8 +23,8 @@ class RemoteValueControl(RemoteValue[Any]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         value_type: str | None = None,
         device_name: str | None = None,
diff --git a/xknx/remote_value/remote_value_datetime.py b/xknx/remote_value/remote_value_datetime.py
index 0ac007d4..a4cf8588 100644
--- a/xknx/remote_value/remote_value_datetime.py
+++ b/xknx/remote_value/remote_value_datetime.py
@@ -32,8 +32,8 @@ class RemoteValueDateTime(RemoteValue[time.struct_time]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         value_type: str = "time",
         device_name: str | None = None,
diff --git a/xknx/remote_value/remote_value_raw.py b/xknx/remote_value/remote_value_raw.py
index 620453a9..f0067d82 100644
--- a/xknx/remote_value/remote_value_raw.py
+++ b/xknx/remote_value/remote_value_raw.py
@@ -24,8 +24,8 @@ class RemoteValueRaw(RemoteValue[int]):
         self,
         xknx: XKNX,
         payload_length: int,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Raw",
diff --git a/xknx/remote_value/remote_value_scaling.py b/xknx/remote_value/remote_value_scaling.py
index a8239524..1481208b 100644
--- a/xknx/remote_value/remote_value_scaling.py
+++ b/xknx/remote_value/remote_value_scaling.py
@@ -22,8 +22,8 @@ class RemoteValueScaling(RemoteValue[int]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "Value",
diff --git a/xknx/remote_value/remote_value_sensor.py b/xknx/remote_value/remote_value_sensor.py
index 8f5e4fe7..29bf2515 100644
--- a/xknx/remote_value/remote_value_sensor.py
+++ b/xknx/remote_value/remote_value_sensor.py
@@ -29,8 +29,8 @@ class _RemoteValueGeneric(RemoteValue[ValueT]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         value_type: int | str | None = None,
         device_name: str | None = None,
diff --git a/xknx/remote_value/remote_value_setpoint_shift.py b/xknx/remote_value/remote_value_setpoint_shift.py
index e9977bd3..a9d8ccfd 100644
--- a/xknx/remote_value/remote_value_setpoint_shift.py
+++ b/xknx/remote_value/remote_value_setpoint_shift.py
@@ -30,8 +30,8 @@ class RemoteValueSetpointShift(RemoteValue[float]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         after_update_cb: AsyncCallbackType | None = None,
diff --git a/xknx/remote_value/remote_value_step.py b/xknx/remote_value/remote_value_step.py
index 667efac7..ea273d72 100644
--- a/xknx/remote_value/remote_value_step.py
+++ b/xknx/remote_value/remote_value_step.py
@@ -29,8 +29,8 @@ class RemoteValueStep(RemoteValue["RemoteValueStep.Direction"]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         device_name: str | None = None,
         feature_name: str = "Step",
         after_update_cb: AsyncCallbackType | None = None,
diff --git a/xknx/remote_value/remote_value_switch.py b/xknx/remote_value/remote_value_switch.py
index 14b4c301..503308ef 100644
--- a/xknx/remote_value/remote_value_switch.py
+++ b/xknx/remote_value/remote_value_switch.py
@@ -22,8 +22,8 @@ class RemoteValueSwitch(RemoteValue[bool]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         sync_state: bool | int | float | str = True,
         device_name: str | None = None,
         feature_name: str = "State",
diff --git a/xknx/remote_value/remote_value_updown.py b/xknx/remote_value/remote_value_updown.py
index 3994ee3c..1c25648f 100644
--- a/xknx/remote_value/remote_value_updown.py
+++ b/xknx/remote_value/remote_value_updown.py
@@ -29,8 +29,8 @@ class RemoteValueUpDown(RemoteValue["RemoteValueUpDown.Direction"]):
     def __init__(
         self,
         xknx: XKNX,
-        group_address: GroupAddressesType | None = None,
-        group_address_state: GroupAddressesType | None = None,
+        group_address: GroupAddressesType = None,
+        group_address_state: GroupAddressesType = None,
         device_name: str | None = None,
         feature_name: str = "Up/Down",
         after_update_cb: AsyncCallbackType | None = None,
diff --git a/xknx/telegram/address.py b/xknx/telegram/address.py
index d2210623..3a0e6ef0 100644
--- a/xknx/telegram/address.py
+++ b/xknx/telegram/address.py
@@ -18,12 +18,12 @@ from __future__ import annotations
 from abc import ABC, abstractmethod
 from enum import Enum
 from re import compile as re_compile
-from typing import ClassVar, Optional, TypeVar, Union
+from typing import ClassVar, TypeVar, Union
 
 from xknx.exceptions import CouldNotParseAddress
 
-GroupAddressableType = Optional[Union["GroupAddress", str, int]]
-IndividualAddressableType = Optional[Union["IndividualAddress", str, int]]
+GroupAddressableType = Union["GroupAddress", str, int]
+IndividualAddressableType = Union["IndividualAddress", str, int]
 InternalGroupAddressableType = Union["InternalGroupAddress", str]
 DeviceAddressableType = Union[GroupAddressableType, InternalGroupAddressableType]
 DeviceGroupAddress = Union["GroupAddress", "InternalGroupAddress"]
@@ -35,15 +35,17 @@ def parse_device_group_address(
     address: DeviceAddressableType,
 ) -> DeviceGroupAddress:
     """Parse an Addressable type to GroupAddress or InternalGroupAddress."""
-    if isinstance(address, (GroupAddress, InternalGroupAddress)):
-        return address
     try:
-        return GroupAddress(address)
+        group_address = GroupAddress(address)  # type: ignore[arg-type]  # InternalGroupAddress will raise
     except CouldNotParseAddress as ex:
-        if isinstance(address, str):
+        if isinstance(address, (str, InternalGroupAddress)):
             return InternalGroupAddress(address)
         raise ex
 
+    if group_address.raw == 0:
+        raise CouldNotParseAddress(address, "Broadcast address invalid for devices")
+    return group_address
+
 
 class BaseAddress(ABC):
     """Base class for all knx address types."""
@@ -104,13 +106,11 @@ class IndividualAddress(BaseAddress):
                 self.raw = int(address)
             else:
                 self.raw = self.__string_to_int(address)
-        elif address is None:
-            self.raw = 0
         else:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid type")
 
         if not 0 <= self.raw <= 65535:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Address out of range")
 
     def __string_to_int(self, address: str) -> int:
         """
@@ -124,12 +124,16 @@ class IndividualAddress(BaseAddress):
         """
         match = self.ADDRESS_RE.match(address)
         if not match:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid format")
         area = int(match.group("area"))
         main = int(match.group("main"))
         line = int(match.group("line"))
-        if area > self.MAX_AREA or main > self.MAX_MAIN or line > self.MAX_LINE:
-            raise CouldNotParseAddress(address)
+        if area > self.MAX_AREA:
+            raise CouldNotParseAddress(address, message="Area part out of range")
+        if main > self.MAX_MAIN:
+            raise CouldNotParseAddress(address, message="Line part out of range")
+        if line > self.MAX_LINE:
+            raise CouldNotParseAddress(address, message="Device part out of range")
         return (area << 12) + (main << 8) + line
 
     @property
@@ -208,13 +212,11 @@ class GroupAddress(BaseAddress):
                 self.raw = int(address)
             else:
                 self.raw = self.__string_to_int(address)
-        elif address is None:
-            self.raw = 0
         else:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid type")
 
         if not 0 <= self.raw <= 65535:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Address out of range")
 
     def __string_to_int(self, address: str) -> int:
         """
@@ -228,21 +230,21 @@ class GroupAddress(BaseAddress):
         """
         match = self.ADDRESS_RE.match(address)
         if not match:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid format")
         main = int(match.group("main"))
         middle = (
             int(match.group("middle")) if match.group("middle") is not None else None
         )
         sub = int(match.group("sub"))
         if main > self.MAX_MAIN:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Main group out of range")
         if middle is not None:
             if middle > self.MAX_MIDDLE:
-                raise CouldNotParseAddress(address)
+                raise CouldNotParseAddress(address, message="Middle group out of range")
             if sub > self.MAX_SUB_LONG:
-                raise CouldNotParseAddress(address)
+                raise CouldNotParseAddress(address, message="Sub group out of range")
         elif sub > self.MAX_SUB_SHORT:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Sub group out of range")
         return (
             (main << 11) + (middle << 8) + sub
             if middle is not None
@@ -318,17 +320,17 @@ class InternalGroupAddress:
             self.address = address.address
             return
         if not isinstance(address, str):
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid type")
 
         prefix_length = 1
         if len(address) < 2 or address[0].lower() != "i":
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="Invalid prefix")
         if address[1] in "-_":
             prefix_length = 2
 
         self.address = address[prefix_length:].strip()
         if not self.address:
-            raise CouldNotParseAddress(address)
+            raise CouldNotParseAddress(address, message="No chars after prefix")
 
     def __str__(self) -> str:
         """Return object as readable string (e.g. 'i-123')."""
diff --git a/xknx/telegram/address_filter.py b/xknx/telegram/address_filter.py
index 4f35b267..46109036 100644
--- a/xknx/telegram/address_filter.py
+++ b/xknx/telegram/address_filter.py
@@ -55,9 +55,9 @@ class AddressFilter:
         if len(self.level_filters) > 3:
             raise ConversionError("Too many parts within pattern.", pattern=pattern)
 
-    def match(self, address: str | GroupAddress | InternalGroupAddress) -> bool:
+    def match(self, address: str | int | GroupAddress | InternalGroupAddress) -> bool:
         """Test if provided address matches Addressfilter."""
-        if isinstance(address, str):
+        if isinstance(address, (str, int)):
             address = parse_device_group_address(address)
 
         if isinstance(address, GroupAddress) and self.level_filters:


Test patch:
diff --git a/test/core_tests/value_reader_test.py b/test/core_tests/value_reader_test.py
index f6dfc138..77705cf4 100644
--- a/test/core_tests/value_reader_test.py
+++ b/test/core_tests/value_reader_test.py
@@ -17,7 +17,7 @@ class TestValueReader:
     async def test_value_reader_read_success(self):
         """Test value reader: successful read."""
         xknx = XKNX()
-        test_group_address = GroupAddress("0/0/0")
+        test_group_address = GroupAddress("0/0/1")
         response_telegram = Telegram(
             destination_address=test_group_address,
             direction=TelegramDirection.INCOMING,
@@ -43,7 +43,7 @@ class TestValueReader:
     async def test_value_reader_read_timeout(self, logger_warning_mock):
         """Test value reader: read timeout."""
         xknx = XKNX()
-        value_reader = ValueReader(xknx, GroupAddress("0/0/0"))
+        value_reader = ValueReader(xknx, GroupAddress("0/0/1"))
         value_reader.response_received_event.wait = MagicMock(
             side_effect=asyncio.TimeoutError()
         )
@@ -56,7 +56,7 @@ class TestValueReader:
         logger_warning_mock.assert_called_once_with(
             "Error: KNX bus did not respond in time (%s secs) to GroupValueRead request for: %s",
             2.0,
-            GroupAddress("0/0/0"),
+            GroupAddress("0/0/1"),
         )
         # Callback was removed again
         assert not xknx.telegram_queue.telegram_received_cbs
@@ -68,7 +68,7 @@ class TestValueReader:
     async def test_value_reader_read_cancelled(self):
         """Test value reader: read cancelled."""
         xknx = XKNX()
-        value_reader = ValueReader(xknx, GroupAddress("0/0/0"))
+        value_reader = ValueReader(xknx, GroupAddress("0/0/1"))
         value_reader.response_received_event.wait = MagicMock(
             side_effect=asyncio.CancelledError()
         )
@@ -85,19 +85,19 @@ class TestValueReader:
     async def test_value_reader_send_group_read(self):
         """Test value reader: send_group_read."""
         xknx = XKNX()
-        value_reader = ValueReader(xknx, GroupAddress("0/0/0"))
+        value_reader = ValueReader(xknx, GroupAddress("0/0/1"))
 
         await value_reader.send_group_read()
         assert xknx.telegrams.qsize() == 1
         telegram = xknx.telegrams.get_nowait()
         assert telegram == Telegram(
-            destination_address=GroupAddress("0/0/0"), payload=GroupValueRead()
+            destination_address=GroupAddress("0/0/1"), payload=GroupValueRead()
         )
 
     async def test_value_reader_telegram_received(self):
         """Test value reader: telegram_received."""
         xknx = XKNX()
-        test_group_address = GroupAddress("0/0/0")
+        test_group_address = GroupAddress("0/0/1")
         expected_telegram_1 = Telegram(
             destination_address=test_group_address,
             direction=TelegramDirection.INCOMING,
@@ -109,7 +109,7 @@ class TestValueReader:
             payload=GroupValueWrite(DPTBinary(1)),
         )
         telegram_wrong_address = Telegram(
-            destination_address=GroupAddress("0/0/1"),
+            destination_address=GroupAddress("0/0/2"),
             direction=TelegramDirection.INCOMING,
             payload=GroupValueResponse(DPTBinary(1)),
         )
diff --git a/test/remote_value_tests/remote_value_test.py b/test/remote_value_tests/remote_value_test.py
index eab88959..a9dfc126 100644
--- a/test/remote_value_tests/remote_value_test.py
+++ b/test/remote_value_tests/remote_value_test.py
@@ -201,10 +201,35 @@ class TestRemoteValue:
         assert remote_value_3.has_group_address(GroupAddress("2/3/4"))
         assert remote_value_3.has_group_address(GroupAddress("2/2/2"))
         assert remote_value_3.has_group_address(GroupAddress("2/2/20"))
-        assert not remote_value_3.has_group_address(GroupAddress("0/0/0"))
+        assert not remote_value_3.has_group_address(GroupAddress("0/0/1"))
         # test empty list
         remote_value_4 = RemoteValue(xknx, group_address=[])
         assert remote_value_4.group_address is None
+        # test None in list
+        remote_value_5 = RemoteValue(
+            xknx,
+            group_address=["1/2/3", "1/1/1", "1/1/10"],
+            group_address_state=[None, "2/2/2", "2/2/20"],
+        )
+        assert remote_value_5.group_address == GroupAddress("1/2/3")
+        assert remote_value_5.group_address_state is None
+        assert remote_value_5.passive_group_addresses == [
+            GroupAddress("1/1/1"),
+            GroupAddress("1/1/10"),
+            GroupAddress("2/2/2"),
+            GroupAddress("2/2/20"),
+        ]
+        remote_value_6 = RemoteValue(
+            xknx,
+            group_address=None,
+            group_address_state=["1/1/1", None, "2/2/2", "2/2/20"],
+        )
+        assert remote_value_6.group_address is None
+        assert remote_value_6.group_address_state == GroupAddress("1/1/1")
+        assert remote_value_6.passive_group_addresses == [
+            GroupAddress("2/2/2"),
+            GroupAddress("2/2/20"),
+        ]
 
     async def test_process_passive_address(self):
         """Test if passive group addresses are processed."""
diff --git a/test/telegram_tests/address_test.py b/test/telegram_tests/address_test.py
index 0c7b7088..44c74e77 100644
--- a/test/telegram_tests/address_test.py
+++ b/test/telegram_tests/address_test.py
@@ -10,14 +10,14 @@ from xknx.telegram.address import (
     parse_device_group_address,
 )
 
-group_addresses_valid = {
-    "0/0": 0,
+_broadcast_group_addresses = ["0/0/0", "0/0", "0", 0]
+
+device_group_addresses_valid = {
     "0/1": 1,
     "0/11": 11,
     "0/111": 111,
     "0/1111": 1111,
     "0/2047": 2047,
-    "0/0/0": 0,
     "0/0/1": 1,
     "0/0/11": 11,
     "0/0/111": 111,
@@ -31,12 +31,14 @@ group_addresses_valid = {
     "1/7/255": 4095,
     "31/7/255": 65535,
     "1": 1,
-    0: 0,
     65535: 65535,
     GroupAddress("1/1/111"): 2415,
-    None: 0,
 }
 
+group_addresses_valid = {
+    bc_addr: 0 for bc_addr in _broadcast_group_addresses
+} | device_group_addresses_valid
+
 group_addresses_invalid = [
     "0/2049",
     "0/8/0",
@@ -52,6 +54,12 @@ group_addresses_invalid = [
     (0xAB, 0xCD),
     -1,
     [],
+    None,
+]
+
+device_group_addresses_invalid = [
+    *group_addresses_invalid,
+    *_broadcast_group_addresses,
 ]
 
 individual_addresses_valid = {
@@ -84,6 +92,7 @@ individual_addresses_invalid = [
     (0xAB, 0xCD),
     -1,
     [],
+    None,
 ]
 
 internal_group_addresses_valid = {
@@ -111,6 +120,7 @@ internal_group_addresses_invalid = [
     "i  ",
     "i- ",
     "a",
+    None,
 ]
 
 
@@ -141,10 +151,6 @@ class TestIndividualAddress:
         ia = IndividualAddress.from_knx(bytes((0x12, 0x34)))
         assert ia.raw == 0x1234
 
-    def test_with_none(self):
-        """Test initialization with None object."""
-        assert IndividualAddress(None).raw == 0
-
     def test_is_line(self):
         """Test if `IndividualAddress.is_line` works like excepted."""
         assert IndividualAddress("1.0.0").is_line
@@ -347,13 +353,13 @@ class TestInternalGroupAddress:
 class TestParseDestinationAddress:
     """Test class for parsing destination addresses."""
 
-    @pytest.mark.parametrize("address_test", group_addresses_valid)
-    def test_parse_group_address(self, address_test):
+    @pytest.mark.parametrize("address_test", device_group_addresses_valid)
+    def test_parse_device_group_address(self, address_test):
         """Test if the function returns GroupAddress objects."""
         assert isinstance(parse_device_group_address(address_test), GroupAddress)
 
     @pytest.mark.parametrize("address_test", internal_group_addresses_valid)
-    def test_parse_internal_group_address(self, address_test):
+    def test_parse_device_internal_group_address(self, address_test):
         """Test if the function returns InternalGroupAddress objects."""
         assert isinstance(
             parse_device_group_address(address_test), InternalGroupAddress
@@ -363,10 +369,10 @@ class TestParseDestinationAddress:
         "address_test",
         [
             *internal_group_addresses_invalid,
-            *group_addresses_invalid,
+            *device_group_addresses_invalid,
         ],
     )
-    def test_parse_invalid(self, address_test):
+    def test_parse_device_invalid(self, address_test):
         """Test if the function raises CouldNotParseAddress on invalid values."""
         with pytest.raises(CouldNotParseAddress):
             parse_device_group_address(address_test)