Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
3725cb6
Bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 (#178216)
dependabot[bot] Aug 5, 2026
e868636
Bump actions/attest from 4.2.0 to 4.2.1 (#178215)
dependabot[bot] Aug 5, 2026
94e3094
Fix Nintendo parental-controls PIN service authorization (#177297)
balloob Aug 5, 2026
2006bcf
Update frontend to 20260729.5 (#178221)
bramkragten Aug 5, 2026
58f01f8
Bump Google Health quality scale to platinum (#177989)
allenporter Aug 5, 2026
a1324fa
Add input_button support to button.pressed trigger (#178161)
abmantis Aug 5, 2026
a962bef
Add Reolink time synchronization button (#177352)
starkillerOG Aug 5, 2026
bd3dda9
Add Reolink anti-flicker entity (#177411)
starkillerOG Aug 5, 2026
eda8d3b
Bump ttls to 1.10.0 (#177418)
mstu01 Aug 5, 2026
796e41d
Do not probe Pi-hole v6 API version with a wrong password (#178143)
wHyEt Aug 5, 2026
8045232
Bump plugwise to v1.14.4 (#177957)
bouwew Aug 5, 2026
228f061
Add FireAvert (#178224)
joostlek Aug 5, 2026
b78da24
Add entity translations to Govee BLE (#177644)
piitaya Aug 5, 2026
6c55fcd
Adapt hortimax to set via_device_id in DeviceInfo (#178233)
emontnemery Aug 5, 2026
83ffb40
Fix via_device in tplink linking to itself (#178228)
emontnemery Aug 5, 2026
7ff7f0d
Fix via_device in fritz linking to itself (#178226)
emontnemery Aug 5, 2026
1941b6b
ProxmoxVE component change Hibernate button to Suspend and fix API ca…
crmason2 Aug 5, 2026
0dc4e83
Use base entity attribute enums in MQTT base blocked attributes (#178…
epenet Aug 5, 2026
2650b82
Adapt mqtt to set via_device_id in DeviceInfo (#178234)
emontnemery Aug 5, 2026
d9b87ef
Fixes #173399 Seerr webhook registration (#177201)
shtefko Aug 5, 2026
0416e9b
Raise ServiceValidationError for invalid vizio source and sound mode …
raman325 Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ jobs:
python -m build

- name: Upload package to PyPI
uses: pypa/gh-action-pypi-publish@ba38be9e461d3875417946c167d0b5f3d385a247 # v1.14.1
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
skip-existing: true

Expand Down Expand Up @@ -550,7 +550,7 @@ jobs:

- name: Generate artifact attestation
if: needs.init.outputs.channel != 'dev' && needs.init.outputs.publish == 'true'
uses: actions/attest@f7c74d28b9d84cb8768d0b8ca14a4bac6ef463e6 # v4.2.0
uses: actions/attest@508db95dd578ae2727ebd6217d5ba78e4fbda05d # v4.2.1
with:
subject-name: ${{ env.HASSFEST_IMAGE_NAME }}
subject-digest: ${{ steps.push.outputs.digest }}
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/brands/fireavert.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"domain": "fireavert",
"name": "FireAvert",
"iot_standards": ["zwave"]
}
6 changes: 5 additions & 1 deletion homeassistant/components/button/trigger.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Provides triggers for buttons."""

from homeassistant.components.input_button import DOMAIN as INPUT_BUTTON_DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers.automation import DomainSpec
from homeassistant.helpers.trigger import StatelessEntityTriggerBase, Trigger
Expand All @@ -10,7 +11,10 @@
class ButtonPressedTrigger(StatelessEntityTriggerBase):
"""Trigger for button entity presses."""

_domain_specs = {DOMAIN: DomainSpec()}
_domain_specs = {
DOMAIN: DomainSpec(),
INPUT_BUTTON_DOMAIN: DomainSpec(),
}


TRIGGERS: dict[str, type[Trigger]] = {
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/button/triggers.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
pressed:
target:
entity:
domain: button
- domain: button
- domain: input_button
4 changes: 4 additions & 0 deletions homeassistant/components/fritz/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,10 @@ async def async_scan_devices(self, now: datetime | None = None) -> None:
)
self.mesh_role = MeshRoles.NONE
for mac, info in hosts.items():
# The box lists its own LAN MAC in the Hosts table; skip it so it
# is not tracked as a child of itself, as the mesh path does.
if dr.format_mac(mac) == self.mac:
continue
if self.manage_device_info(info, mac, consider_home):
new_device = True
await self.async_send_signal_device_update(new_device)
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@
"integration_type": "system",
"preview_features": { "winter_mode": {} },
"quality_scale": "internal",
"requirements": ["home-assistant-frontend==20260729.4"]
"requirements": ["home-assistant-frontend==20260729.5"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/google_health/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
"documentation": "https://www.home-assistant.io/integrations/google_health",
"integration_type": "service",
"iot_class": "cloud_polling",
"quality_scale": "bronze",
"quality_scale": "platinum",
"requirements": ["google-health-api==0.8.0"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/google_health/quality_scale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ rules:
entity-translations: done
exception-translations: done
icon-translations: done
reconfiguration-flow: todo
reconfiguration-flow: done
repair-issues:
status: exempt
comment: This integration does not raise repair issues.
Expand Down
5 changes: 3 additions & 2 deletions homeassistant/components/govee_ble/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,10 @@ def sensor_update_to_bluetooth_data_update(
device_key_to_bluetooth_entity_key(device_key): sensor_values.native_value
for device_key, sensor_values in sensor_update.binary_entity_values.items()
},
# None overrides names restored from storage, {} would keep them
entity_names={
device_key_to_bluetooth_entity_key(device_key): sensor_values.name
for device_key, sensor_values in sensor_update.binary_entity_values.items()
device_key_to_bluetooth_entity_key(device_key): None
for device_key in sensor_update.binary_entity_values
},
)

Expand Down
40 changes: 35 additions & 5 deletions homeassistant/components/govee_ble/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,32 @@
),
}

PROBE_SENSOR_DESCRIPTIONS = {
f"{translation_key}_{probe_id}": SensorEntityDescription(
key=f"{translation_key}_{probe_id}",
translation_key=translation_key,
translation_placeholders={"probe_id": str(probe_id)},
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
state_class=SensorStateClass.MEASUREMENT,
)
for probe_id in range(1, 7)
for translation_key in (
"temperature_probe",
"temperature_alarm_probe",
"low_temperature_alarm_probe",
)
} | {
"humidity_probe_1": SensorEntityDescription(
key="humidity_probe_1",
translation_key="humidity_probe",
translation_placeholders={"probe_id": "1"},
device_class=SensorDeviceClass.HUMIDITY,
native_unit_of_measurement=UnitOfRatio.PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
)
}


def sensor_update_to_bluetooth_data_update(
sensor_update: SensorUpdate,
Expand All @@ -90,19 +116,23 @@ def sensor_update_to_bluetooth_data_update(
for device_id, device_info in sensor_update.devices.items()
},
entity_descriptions={
device_key_to_bluetooth_entity_key(device_key): SENSOR_DESCRIPTIONS[
(description.device_class, description.native_unit_of_measurement)
]
device_key_to_bluetooth_entity_key(device_key): (
PROBE_SENSOR_DESCRIPTIONS.get(device_key.key)
or SENSOR_DESCRIPTIONS[
(description.device_class, description.native_unit_of_measurement)
]
)
for device_key, description in sensor_update.entity_descriptions.items()
if description.device_class and description.native_unit_of_measurement
},
entity_data={
device_key_to_bluetooth_entity_key(device_key): sensor_values.native_value
for device_key, sensor_values in sensor_update.entity_values.items()
},
# None overrides names restored from storage, {} would keep them
entity_names={
device_key_to_bluetooth_entity_key(device_key): sensor_values.name
for device_key, sensor_values in sensor_update.entity_values.items()
device_key_to_bluetooth_entity_key(device_key): None
for device_key in sensor_update.entity_values
},
)

Expand Down
14 changes: 14 additions & 0 deletions homeassistant/components/govee_ble/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,20 @@
}
}
}
},
"sensor": {
"humidity_probe": {
"name": "Humidity probe {probe_id}"
},
"low_temperature_alarm_probe": {
"name": "Low temperature alarm probe {probe_id}"
},
"temperature_alarm_probe": {
"name": "Temperature alarm probe {probe_id}"
},
"temperature_probe": {
"name": "Temperature probe {probe_id}"
}
}
}
}
9 changes: 7 additions & 2 deletions homeassistant/components/hortimax/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from aiohortos import Readout

from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity

Expand All @@ -13,7 +14,7 @@ class HortimaxEntity(CoordinatorEntity[HortimaxCoordinator]):
"""An entity backed by one readout of a HortOS source.

Sources (a weather station, a ventilation group, ...) each become their own
device, linked to their controller through ``via_device``.
device, linked to their controller through ``via_device_id``.
"""

_attr_has_entity_name = True
Expand All @@ -38,7 +39,11 @@ def __init__(
),
model=source.type,
manufacturer=MANUFACTURER,
via_device=(DOMAIN, device_id),
via_device_id=dr.async_get_device_id_by_identifier(
coordinator.hass,
(DOMAIN, device_id),
config_entry_id=coordinator.config_entry.entry_id,
),
)

@property
Expand Down
Loading
Loading