diff --git a/homeassistant/components/recorder/models.py b/homeassistant/components/recorder/models.py
index 55d6f73108c99a1c6345cd0045dae2a9af7b2e50..579f47ed4a7d16e0b5af4a49cacb642a43b0ad5b 100644
--- a/homeassistant/components/recorder/models.py
+++ b/homeassistant/components/recorder/models.py
@@ -77,7 +77,7 @@ DOUBLE_TYPE = (
 )
 
 
-class Events(Base):  # type: ignore
+class Events(Base):  # type: ignore[misc,valid-type]
     """Event history data."""
 
     __table_args__ = (
@@ -141,7 +141,7 @@ class Events(Base):  # type: ignore
             return None
 
 
-class States(Base):  # type: ignore
+class States(Base):  # type: ignore[misc,valid-type]
     """State change history."""
 
     __table_args__ = (
@@ -276,13 +276,13 @@ class StatisticsBase:
     @classmethod
     def from_stats(cls, metadata_id: int, stats: StatisticData):
         """Create object from a statistics."""
-        return cls(  # type: ignore
+        return cls(  # type: ignore[call-arg,misc]
             metadata_id=metadata_id,
             **stats,
         )
 
 
-class Statistics(Base, StatisticsBase):  # type: ignore
+class Statistics(Base, StatisticsBase):  # type: ignore[misc,valid-type]
     """Long term statistics."""
 
     duration = timedelta(hours=1)
@@ -294,7 +294,7 @@ class Statistics(Base, StatisticsBase):  # type: ignore
     __tablename__ = TABLE_STATISTICS
 
 
-class StatisticsShortTerm(Base, StatisticsBase):  # type: ignore
+class StatisticsShortTerm(Base, StatisticsBase):  # type: ignore[misc,valid-type]
     """Short term statistics."""
 
     duration = timedelta(minutes=5)
@@ -322,7 +322,7 @@ class StatisticMetaData(TypedDict):
     unit_of_measurement: str | None
 
 
-class StatisticsMeta(Base):  # type: ignore
+class StatisticsMeta(Base):  # type: ignore[misc,valid-type]
     """Statistics meta data."""
 
     __table_args__ = (
@@ -343,7 +343,7 @@ class StatisticsMeta(Base):  # type: ignore
         return StatisticsMeta(**meta)
 
 
-class RecorderRuns(Base):  # type: ignore
+class RecorderRuns(Base):  # type: ignore[misc,valid-type]
     """Representation of recorder run."""
 
     __table_args__ = (Index("ix_recorder_runs_start_end", "start", "end"),)
@@ -393,7 +393,7 @@ class RecorderRuns(Base):  # type: ignore
         return self
 
 
-class SchemaChanges(Base):  # type: ignore
+class SchemaChanges(Base):  # type: ignore[misc,valid-type]
     """Representation of schema version changes."""
 
     __tablename__ = TABLE_SCHEMA_CHANGES
@@ -411,7 +411,7 @@ class SchemaChanges(Base):  # type: ignore
         )
 
 
-class StatisticsRuns(Base):  # type: ignore
+class StatisticsRuns(Base):  # type: ignore[misc,valid-type]
     """Representation of statistics run."""
 
     __tablename__ = TABLE_STATISTICS_RUNS
@@ -491,7 +491,7 @@ class LazyState(State):
         self._last_updated = None
         self._context = None
 
-    @property  # type: ignore
+    @property  # type: ignore[override]
     def attributes(self):
         """State attributes."""
         if not self._attributes:
@@ -508,7 +508,7 @@ class LazyState(State):
         """Set attributes."""
         self._attributes = value
 
-    @property  # type: ignore
+    @property  # type: ignore[override]
     def context(self):
         """State context."""
         if not self._context:
@@ -520,7 +520,7 @@ class LazyState(State):
         """Set context."""
         self._context = value
 
-    @property  # type: ignore
+    @property  # type: ignore[override]
     def last_changed(self):
         """Last changed datetime."""
         if not self._last_changed:
@@ -532,7 +532,7 @@ class LazyState(State):
         """Set last changed datetime."""
         self._last_changed = value
 
-    @property  # type: ignore
+    @property  # type: ignore[override]
     def last_updated(self):
         """Last updated datetime."""
         if not self._last_updated:
diff --git a/homeassistant/components/recorder/purge.py b/homeassistant/components/recorder/purge.py
index e44ae9aafff3ead310788f5fd540e853a2efb581..dd80fb15479d52142b4954fc67962561733b04e7 100644
--- a/homeassistant/components/recorder/purge.py
+++ b/homeassistant/components/recorder/purge.py
@@ -34,7 +34,7 @@ def purge_old_data(
         purge_before.isoformat(sep=" ", timespec="seconds"),
     )
 
-    with session_scope(session=instance.get_session()) as session:  # type: ignore
+    with session_scope(session=instance.get_session()) as session:  # type: ignore[misc]
         # Purge a max of MAX_ROWS_TO_PURGE, based on the oldest states or events record
         event_ids = _select_event_ids_to_purge(session, purge_before)
         state_ids = _select_state_ids_to_purge(session, purge_before, event_ids)
@@ -267,7 +267,7 @@ def _purge_filtered_states(
         "Selected %s state_ids to remove that should be filtered", len(state_ids)
     )
     _purge_state_ids(instance, session, set(state_ids))
-    _purge_event_ids(session, event_ids)  # type: ignore  # type of event_ids already narrowed to 'list[int]'
+    _purge_event_ids(session, event_ids)  # type: ignore[arg-type]  # type of event_ids already narrowed to 'list[int]'
 
 
 def _purge_filtered_events(
@@ -295,7 +295,7 @@ def _purge_filtered_events(
 @retryable_database_job("purge")
 def purge_entity_data(instance: Recorder, entity_filter: Callable[[str], bool]) -> bool:
     """Purge states and events of specified entities."""
-    with session_scope(session=instance.get_session()) as session:  # type: ignore
+    with session_scope(session=instance.get_session()) as session:  # type: ignore[misc]
         selected_entity_ids: list[str] = [
             entity_id
             for (entity_id,) in session.query(distinct(States.entity_id)).all()
diff --git a/homeassistant/components/recorder/statistics.py b/homeassistant/components/recorder/statistics.py
index 6c305242f5fd0dade6294578803abab7d8453f19..4154ae830555f775d5a7357c3cc73414b480b0f4 100644
--- a/homeassistant/components/recorder/statistics.py
+++ b/homeassistant/components/recorder/statistics.py
@@ -488,7 +488,7 @@ def compile_hourly_statistics(
         )
 
         if stats:
-            for metadata_id, group in groupby(stats, lambda stat: stat["metadata_id"]):  # type: ignore
+            for metadata_id, group in groupby(stats, lambda stat: stat["metadata_id"]):  # type: ignore[no-any-return]
                 (
                     metadata_id,
                     last_reset,
@@ -527,7 +527,7 @@ def compile_statistics(instance: Recorder, start: datetime) -> bool:
     end = start + timedelta(minutes=5)
 
     # Return if we already have 5-minute statistics for the requested period
-    with session_scope(session=instance.get_session()) as session:  # type: ignore
+    with session_scope(session=instance.get_session()) as session:  # type: ignore[misc]
         if session.query(StatisticsRuns).filter_by(start=start).first():
             _LOGGER.debug("Statistics already compiled for %s-%s", start, end)
             return True
@@ -546,7 +546,7 @@ def compile_statistics(instance: Recorder, start: datetime) -> bool:
 
     # Insert collected statistics in the database
     with session_scope(
-        session=instance.get_session(),  # type: ignore
+        session=instance.get_session(),  # type: ignore[misc]
         exception_filter=_filter_unique_constraint_integrity_error(instance),
     ) as session:
         for stats in platform_stats:
@@ -700,7 +700,7 @@ def _configured_unit(unit: str, units: UnitSystem) -> str:
 
 def clear_statistics(instance: Recorder, statistic_ids: list[str]) -> None:
     """Clear statistics for a list of statistic_ids."""
-    with session_scope(session=instance.get_session()) as session:  # type: ignore
+    with session_scope(session=instance.get_session()) as session:  # type: ignore[misc]
         session.query(StatisticsMeta).filter(
             StatisticsMeta.statistic_id.in_(statistic_ids)
         ).delete(synchronize_session=False)
@@ -710,7 +710,7 @@ def update_statistics_metadata(
     instance: Recorder, statistic_id: str, unit_of_measurement: str | None
 ) -> None:
     """Update statistics metadata for a statistic_id."""
-    with session_scope(session=instance.get_session()) as session:  # type: ignore
+    with session_scope(session=instance.get_session()) as session:  # type: ignore[misc]
         session.query(StatisticsMeta).filter(
             StatisticsMeta.statistic_id == statistic_id
         ).update({StatisticsMeta.unit_of_measurement: unit_of_measurement})
@@ -1093,7 +1093,7 @@ def _sorted_statistics_to_dict(
 
     def no_conversion(val: Any, _: Any) -> float | None:
         """Return x."""
-        return val  # type: ignore
+        return val  # type: ignore[no-any-return]
 
     # Set all statistic IDs to empty lists in result set to maintain the order
     if statistic_ids is not None:
@@ -1101,7 +1101,7 @@ def _sorted_statistics_to_dict(
             result[stat_id] = []
 
     # Identify metadata IDs for which no data was available at the requested start time
-    for meta_id, group in groupby(stats, lambda stat: stat.metadata_id):  # type: ignore
+    for meta_id, group in groupby(stats, lambda stat: stat.metadata_id):  # type: ignore[no-any-return]
         first_start_time = process_timestamp(next(group).start)
         if start_time and first_start_time > start_time:
             need_stat_at_start_time.add(meta_id)
@@ -1115,12 +1115,12 @@ def _sorted_statistics_to_dict(
                 stats_at_start_time[stat.metadata_id] = (stat,)
 
     # Append all statistic entries, and optionally do unit conversion
-    for meta_id, group in groupby(stats, lambda stat: stat.metadata_id):  # type: ignore
+    for meta_id, group in groupby(stats, lambda stat: stat.metadata_id):  # type: ignore[no-any-return]
         unit = metadata[meta_id]["unit_of_measurement"]
         statistic_id = metadata[meta_id]["statistic_id"]
         convert: Callable[[Any, Any], float | None]
         if convert_units:
-            convert = UNIT_CONVERSIONS.get(unit, lambda x, units: x)  # type: ignore
+            convert = UNIT_CONVERSIONS.get(unit, lambda x, units: x)  # type: ignore[arg-type,no-any-return]
         else:
             convert = no_conversion
         ent_results = result[meta_id]
@@ -1249,7 +1249,7 @@ def add_external_statistics(
     """Process an add_statistics job."""
 
     with session_scope(
-        session=instance.get_session(),  # type: ignore
+        session=instance.get_session(),  # type: ignore[misc]
         exception_filter=_filter_unique_constraint_integrity_error(instance),
     ) as session:
         metadata_id = _update_or_add_metadata(instance.hass, session, metadata)