diff --git a/homeassistant/components/ohme/__init__.py b/homeassistant/components/ohme/__init__.py
index 4dc75cb574c0e85204393c4ed1b1d1b94c3a3305..9051683551318ff2ced5c8254d5f8d3135a92232 100644
--- a/homeassistant/components/ohme/__init__.py
+++ b/homeassistant/components/ohme/__init__.py
@@ -8,9 +8,14 @@ from homeassistant.config_entries import ConfigEntry
 from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
 from homeassistant.core import HomeAssistant
 from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
+from homeassistant.helpers import config_validation as cv
+from homeassistant.helpers.typing import ConfigType
 
 from .const import DOMAIN, PLATFORMS
 from .coordinator import OhmeAdvancedSettingsCoordinator, OhmeChargeSessionCoordinator
+from .services import async_setup_services
+
+CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
 
 type OhmeConfigEntry = ConfigEntry[OhmeRuntimeData]
 
@@ -23,6 +28,13 @@ class OhmeRuntimeData:
     advanced_settings_coordinator: OhmeAdvancedSettingsCoordinator
 
 
+async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
+    """Set up Ohme integration."""
+    async_setup_services(hass)
+
+    return True
+
+
 async def async_setup_entry(hass: HomeAssistant, entry: OhmeConfigEntry) -> bool:
     """Set up Ohme from a config entry."""
 
diff --git a/homeassistant/components/ohme/icons.json b/homeassistant/components/ohme/icons.json
index d5bf3fa11879af633035b558773b837de51017fa..b53c9149e1891e341bad413e181aaa305d88d819 100644
--- a/homeassistant/components/ohme/icons.json
+++ b/homeassistant/components/ohme/icons.json
@@ -19,5 +19,10 @@
         "default": "mdi:gauge"
       }
     }
+  },
+  "services": {
+    "list_charge_slots": {
+      "service": "mdi:clock-start"
+    }
   }
 }
diff --git a/homeassistant/components/ohme/quality_scale.yaml b/homeassistant/components/ohme/quality_scale.yaml
index 7fc2f55e2f9bc2d10d81e6ea3ce6b5f369ba6038..497d5ad32e5c524cb0cd8248ae6101e4b351d5e9 100644
--- a/homeassistant/components/ohme/quality_scale.yaml
+++ b/homeassistant/components/ohme/quality_scale.yaml
@@ -1,19 +1,13 @@
 rules:
   # Bronze
-  action-setup:
-    status: exempt
-    comment: |
-      This integration has no custom actions.
+  action-setup: done
   appropriate-polling: done
   brands: done
   common-modules: done
   config-flow-test-coverage: done
   config-flow: done
   dependency-transparency: done
-  docs-actions:
-    status: exempt
-    comment: |
-      This integration has no custom actions.
+  docs-actions: done
   docs-high-level-description: done
   docs-installation-instructions: done
   docs-removal-instructions: done
diff --git a/homeassistant/components/ohme/services.py b/homeassistant/components/ohme/services.py
new file mode 100644
index 0000000000000000000000000000000000000000..7d06b909d88fa6491f231ba265f9b6cae391bd25
--- /dev/null
+++ b/homeassistant/components/ohme/services.py
@@ -0,0 +1,75 @@
+"""Ohme services."""
+
+from typing import Final
+
+from ohme import OhmeApiClient
+import voluptuous as vol
+
+from homeassistant.config_entries import ConfigEntry, ConfigEntryState
+from homeassistant.core import (
+    HomeAssistant,
+    ServiceCall,
+    ServiceResponse,
+    SupportsResponse,
+)
+from homeassistant.exceptions import ServiceValidationError
+from homeassistant.helpers import selector
+
+from .const import DOMAIN
+
+SERVICE_LIST_CHARGE_SLOTS = "list_charge_slots"
+ATTR_CONFIG_ENTRY: Final = "config_entry"
+SERVICE_SCHEMA: Final = vol.Schema(
+    {
+        vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector(
+            {
+                "integration": DOMAIN,
+            }
+        ),
+    }
+)
+
+
+def __get_client(call: ServiceCall) -> OhmeApiClient:
+    """Get the client from the config entry."""
+    entry_id: str = call.data[ATTR_CONFIG_ENTRY]
+    entry: ConfigEntry | None = call.hass.config_entries.async_get_entry(entry_id)
+
+    if not entry:
+        raise ServiceValidationError(
+            translation_domain=DOMAIN,
+            translation_key="invalid_config_entry",
+            translation_placeholders={
+                "config_entry": entry_id,
+            },
+        )
+    if entry.state != ConfigEntryState.LOADED:
+        raise ServiceValidationError(
+            translation_domain=DOMAIN,
+            translation_key="unloaded_config_entry",
+            translation_placeholders={
+                "config_entry": entry.title,
+            },
+        )
+
+    return entry.runtime_data.charge_session_coordinator.client
+
+
+def async_setup_services(hass: HomeAssistant) -> None:
+    """Register services."""
+
+    async def list_charge_slots(
+        service_call: ServiceCall,
+    ) -> ServiceResponse:
+        """List of charge slots."""
+        client = __get_client(service_call)
+
+        return {"slots": client.slots}
+
+    hass.services.async_register(
+        DOMAIN,
+        SERVICE_LIST_CHARGE_SLOTS,
+        list_charge_slots,
+        schema=SERVICE_SCHEMA,
+        supports_response=SupportsResponse.ONLY,
+    )
diff --git a/homeassistant/components/ohme/services.yaml b/homeassistant/components/ohme/services.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c5c8ee18138a871b599ae6434f8eddbfeb3aeb07
--- /dev/null
+++ b/homeassistant/components/ohme/services.yaml
@@ -0,0 +1,7 @@
+list_charge_slots:
+  fields:
+    config_entry:
+      required: true
+      selector:
+        config_entry:
+          integration: ohme
diff --git a/homeassistant/components/ohme/strings.json b/homeassistant/components/ohme/strings.json
index 125babc19013a633ddcf20485396a368dea88fe5..a3543645d5f6a216b7dcbec82f9751d574add622 100644
--- a/homeassistant/components/ohme/strings.json
+++ b/homeassistant/components/ohme/strings.json
@@ -32,6 +32,18 @@
       "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
     }
   },
+  "services": {
+    "list_charge_slots": {
+      "name": "List charge slots",
+      "description": "Return a list of charge slots.",
+      "fields": {
+        "config_entry": {
+          "name": "Ohme account",
+          "description": "The Ohme config entry for which to return charge slots."
+        }
+      }
+    }
+  },
   "entity": {
     "button": {
       "approve": {
@@ -62,6 +74,12 @@
     },
     "api_failed": {
       "message": "Error communicating with Ohme API"
+    },
+    "invalid_config_entry": {
+      "message": "Invalid config entry provided. Got {config_entry}"
+    },
+    "unloaded_config_entry": {
+      "message": "Invalid config entry provided. {config_entry} is not loaded."
     }
   }
 }
diff --git a/tests/components/ohme/conftest.py b/tests/components/ohme/conftest.py
index 90395feeb6ba43d119f3dddd431db11a565fe9b4..e0e911e6b68117cf64326b0e4bed0cbbcc894efa 100644
--- a/tests/components/ohme/conftest.py
+++ b/tests/components/ohme/conftest.py
@@ -53,6 +53,7 @@ def mock_client():
         client.async_login.return_value = True
         client.status = ChargerStatus.CHARGING
         client.power = ChargerPower(0, 0, 0, 0)
+
         client.serial = "chargerid"
         client.ct_connected = True
         client.energy = 1000
diff --git a/tests/components/ohme/snapshots/test_services.ambr b/tests/components/ohme/snapshots/test_services.ambr
new file mode 100644
index 0000000000000000000000000000000000000000..91917ed69257d372822b6ae4a32ca9773f1f8473
--- /dev/null
+++ b/tests/components/ohme/snapshots/test_services.ambr
@@ -0,0 +1,12 @@
+# serializer version: 1
+# name: test_list_charge_slots
+  dict({
+    'slots': list([
+      dict({
+        'end': '2024-12-30T04:30:39+00:00',
+        'energy': 2.042,
+        'start': '2024-12-30T04:00:00+00:00',
+      }),
+    ]),
+  })
+# ---
diff --git a/tests/components/ohme/test_services.py b/tests/components/ohme/test_services.py
new file mode 100644
index 0000000000000000000000000000000000000000..76c7ce94b57833c595be5dc6ff70f59d46a1ddf3
--- /dev/null
+++ b/tests/components/ohme/test_services.py
@@ -0,0 +1,70 @@
+"""Tests for services."""
+
+from unittest.mock import MagicMock
+
+import pytest
+from syrupy.assertion import SnapshotAssertion
+
+from homeassistant.components.ohme.const import DOMAIN
+from homeassistant.components.ohme.services import (
+    ATTR_CONFIG_ENTRY,
+    SERVICE_LIST_CHARGE_SLOTS,
+)
+from homeassistant.core import HomeAssistant
+from homeassistant.exceptions import ServiceValidationError
+
+from . import setup_integration
+
+from tests.common import MockConfigEntry
+
+
+async def test_list_charge_slots(
+    hass: HomeAssistant,
+    mock_config_entry: MockConfigEntry,
+    mock_client: MagicMock,
+    snapshot: SnapshotAssertion,
+) -> None:
+    """Test list charge slots service."""
+
+    await setup_integration(hass, mock_config_entry)
+
+    mock_client.slots = [
+        {
+            "start": "2024-12-30T04:00:00+00:00",
+            "end": "2024-12-30T04:30:39+00:00",
+            "energy": 2.042,
+        }
+    ]
+
+    assert snapshot == await hass.services.async_call(
+        DOMAIN,
+        "list_charge_slots",
+        {
+            ATTR_CONFIG_ENTRY: mock_config_entry.entry_id,
+        },
+        blocking=True,
+        return_response=True,
+    )
+
+
+async def test_list_charge_slots_exception(
+    hass: HomeAssistant,
+    mock_config_entry: MockConfigEntry,
+    mock_client: MagicMock,
+    snapshot: SnapshotAssertion,
+) -> None:
+    """Test list charge slots service."""
+
+    await setup_integration(hass, mock_config_entry)
+
+    # Test error
+    with pytest.raises(
+        ServiceValidationError, match="Invalid config entry provided. Got invalid"
+    ):
+        await hass.services.async_call(
+            DOMAIN,
+            SERVICE_LIST_CHARGE_SLOTS,
+            {ATTR_CONFIG_ENTRY: "invalid"},
+            blocking=True,
+            return_response=True,
+        )