Skip to content

HIDResource

HIDResource

HID keyboard and mouse control for PiKVM.

Source code in src/aiopikvm/resources/hid.py
class HIDResource(BaseResource):
    """HID keyboard and mouse control for PiKVM."""

    async def get_state(self) -> HIDState:
        """Get the current HID state.

        Returns:
            Current HID subsystem state.
        """
        result = await self._get("/api/hid")
        return HIDState.model_validate(result)

    async def set_params(
        self,
        *,
        keyboard_output: str | None = None,
        mouse_output: str | None = None,
    ) -> None:
        """Set HID output parameters.

        Args:
            keyboard_output: Keyboard output type.
            mouse_output: Mouse output type.
        """
        params: dict[str, str] = {}
        if keyboard_output is not None:
            params["keyboard_output"] = keyboard_output
        if mouse_output is not None:
            params["mouse_output"] = mouse_output
        await self._post("/api/hid/set_params", params=params)

    async def set_connected(self, connected: bool) -> None:
        """Set the HID connection state.

        Args:
            connected: Whether HID should be connected.
        """
        await self._post("/api/hid/set_connected", params={"connected": int(connected)})

    async def reset(self) -> None:
        """Reset the HID subsystem."""
        await self._post("/api/hid/reset")

    async def get_keymaps(self) -> dict[str, Any]:
        """Get available keyboard keymaps.

        Returns:
            Dictionary of available keymaps.
        """
        result: dict[str, Any] = await self._get("/api/hid/keymaps")
        return result

    async def type_text(self, text: str, *, limit: int = 0) -> None:
        """Type text via HID keyboard.

        Args:
            text: Text string to type.
            limit: Maximum characters per request (``0`` = unlimited).
        """
        params: dict[str, int] = {}
        if limit > 0:
            params["limit"] = limit
        await self._post(
            "/api/hid/print",
            content=text.encode(),
            headers={"Content-Type": "text/plain"},
            params=params if params else None,
        )

    async def send_key(self, key: str, *, state: bool | None = None) -> None:
        """Send a single key event.

        Args:
            key: Key name.
            state: Key state (``True`` = press, ``False`` = release,
                ``None`` = press and release).
        """
        params: dict[str, Any] = {"key": key}
        if state is not None:
            params["state"] = int(state)
        await self._post("/api/hid/events/send_key", params=params)

    async def send_shortcut(self, *keys: str, wait: int = 0) -> None:
        """Send a keyboard shortcut.

        Args:
            *keys: Key names to press simultaneously.
            wait: Delay between key events in milliseconds.
        """
        params: dict[str, Any] = {}
        if wait > 0:
            params["wait"] = wait
        await self._post(
            "/api/hid/events/send_shortcut",
            params={**params, "key": list(keys)},
        )

    async def send_mouse_button(
        self, button: str, *, state: bool | None = None
    ) -> None:
        """Send a mouse button event.

        Args:
            button: Button name (e.g. ``"left"``, ``"right"``).
            state: Button state (``True`` = press, ``False`` = release,
                ``None`` = click).
        """
        params: dict[str, Any] = {"button": button}
        if state is not None:
            params["state"] = int(state)
        await self._post("/api/hid/events/send_mouse_button", params=params)

    async def send_mouse_move(self, to_x: int, to_y: int) -> None:
        """Move the mouse to absolute coordinates.

        Args:
            to_x: Target X coordinate.
            to_y: Target Y coordinate.
        """
        await self._post(
            "/api/hid/events/send_mouse_move",
            params={"to_x": to_x, "to_y": to_y},
        )

    async def send_mouse_relative(self, delta_x: int, delta_y: int) -> None:
        """Move the mouse by relative offset.

        Args:
            delta_x: Horizontal offset.
            delta_y: Vertical offset.
        """
        await self._post(
            "/api/hid/events/send_mouse_relative",
            params={"delta_x": delta_x, "delta_y": delta_y},
        )

    async def send_mouse_wheel(self, delta_x: int, delta_y: int) -> None:
        """Send a mouse wheel event.

        Args:
            delta_x: Horizontal scroll delta.
            delta_y: Vertical scroll delta.
        """
        await self._post(
            "/api/hid/events/send_mouse_wheel",
            params={"delta_x": delta_x, "delta_y": delta_y},
        )

get_state() async

Get the current HID state.

Returns:

Type Description
HIDState

Current HID subsystem state.

Source code in src/aiopikvm/resources/hid.py
async def get_state(self) -> HIDState:
    """Get the current HID state.

    Returns:
        Current HID subsystem state.
    """
    result = await self._get("/api/hid")
    return HIDState.model_validate(result)

set_params(*, keyboard_output=None, mouse_output=None) async

Set HID output parameters.

Parameters:

Name Type Description Default
keyboard_output str | None

Keyboard output type.

None
mouse_output str | None

Mouse output type.

None
Source code in src/aiopikvm/resources/hid.py
async def set_params(
    self,
    *,
    keyboard_output: str | None = None,
    mouse_output: str | None = None,
) -> None:
    """Set HID output parameters.

    Args:
        keyboard_output: Keyboard output type.
        mouse_output: Mouse output type.
    """
    params: dict[str, str] = {}
    if keyboard_output is not None:
        params["keyboard_output"] = keyboard_output
    if mouse_output is not None:
        params["mouse_output"] = mouse_output
    await self._post("/api/hid/set_params", params=params)

set_connected(connected) async

Set the HID connection state.

Parameters:

Name Type Description Default
connected bool

Whether HID should be connected.

required
Source code in src/aiopikvm/resources/hid.py
async def set_connected(self, connected: bool) -> None:
    """Set the HID connection state.

    Args:
        connected: Whether HID should be connected.
    """
    await self._post("/api/hid/set_connected", params={"connected": int(connected)})

reset() async

Reset the HID subsystem.

Source code in src/aiopikvm/resources/hid.py
async def reset(self) -> None:
    """Reset the HID subsystem."""
    await self._post("/api/hid/reset")

get_keymaps() async

Get available keyboard keymaps.

Returns:

Type Description
dict[str, Any]

Dictionary of available keymaps.

Source code in src/aiopikvm/resources/hid.py
async def get_keymaps(self) -> dict[str, Any]:
    """Get available keyboard keymaps.

    Returns:
        Dictionary of available keymaps.
    """
    result: dict[str, Any] = await self._get("/api/hid/keymaps")
    return result

type_text(text, *, limit=0) async

Type text via HID keyboard.

Parameters:

Name Type Description Default
text str

Text string to type.

required
limit int

Maximum characters per request (0 = unlimited).

0
Source code in src/aiopikvm/resources/hid.py
async def type_text(self, text: str, *, limit: int = 0) -> None:
    """Type text via HID keyboard.

    Args:
        text: Text string to type.
        limit: Maximum characters per request (``0`` = unlimited).
    """
    params: dict[str, int] = {}
    if limit > 0:
        params["limit"] = limit
    await self._post(
        "/api/hid/print",
        content=text.encode(),
        headers={"Content-Type": "text/plain"},
        params=params if params else None,
    )

send_key(key, *, state=None) async

Send a single key event.

Parameters:

Name Type Description Default
key str

Key name.

required
state bool | None

Key state (True = press, False = release, None = press and release).

None
Source code in src/aiopikvm/resources/hid.py
async def send_key(self, key: str, *, state: bool | None = None) -> None:
    """Send a single key event.

    Args:
        key: Key name.
        state: Key state (``True`` = press, ``False`` = release,
            ``None`` = press and release).
    """
    params: dict[str, Any] = {"key": key}
    if state is not None:
        params["state"] = int(state)
    await self._post("/api/hid/events/send_key", params=params)

send_shortcut(*keys, wait=0) async

Send a keyboard shortcut.

Parameters:

Name Type Description Default
*keys str

Key names to press simultaneously.

()
wait int

Delay between key events in milliseconds.

0
Source code in src/aiopikvm/resources/hid.py
async def send_shortcut(self, *keys: str, wait: int = 0) -> None:
    """Send a keyboard shortcut.

    Args:
        *keys: Key names to press simultaneously.
        wait: Delay between key events in milliseconds.
    """
    params: dict[str, Any] = {}
    if wait > 0:
        params["wait"] = wait
    await self._post(
        "/api/hid/events/send_shortcut",
        params={**params, "key": list(keys)},
    )

send_mouse_button(button, *, state=None) async

Send a mouse button event.

Parameters:

Name Type Description Default
button str

Button name (e.g. "left", "right").

required
state bool | None

Button state (True = press, False = release, None = click).

None
Source code in src/aiopikvm/resources/hid.py
async def send_mouse_button(
    self, button: str, *, state: bool | None = None
) -> None:
    """Send a mouse button event.

    Args:
        button: Button name (e.g. ``"left"``, ``"right"``).
        state: Button state (``True`` = press, ``False`` = release,
            ``None`` = click).
    """
    params: dict[str, Any] = {"button": button}
    if state is not None:
        params["state"] = int(state)
    await self._post("/api/hid/events/send_mouse_button", params=params)

send_mouse_move(to_x, to_y) async

Move the mouse to absolute coordinates.

Parameters:

Name Type Description Default
to_x int

Target X coordinate.

required
to_y int

Target Y coordinate.

required
Source code in src/aiopikvm/resources/hid.py
async def send_mouse_move(self, to_x: int, to_y: int) -> None:
    """Move the mouse to absolute coordinates.

    Args:
        to_x: Target X coordinate.
        to_y: Target Y coordinate.
    """
    await self._post(
        "/api/hid/events/send_mouse_move",
        params={"to_x": to_x, "to_y": to_y},
    )

send_mouse_relative(delta_x, delta_y) async

Move the mouse by relative offset.

Parameters:

Name Type Description Default
delta_x int

Horizontal offset.

required
delta_y int

Vertical offset.

required
Source code in src/aiopikvm/resources/hid.py
async def send_mouse_relative(self, delta_x: int, delta_y: int) -> None:
    """Move the mouse by relative offset.

    Args:
        delta_x: Horizontal offset.
        delta_y: Vertical offset.
    """
    await self._post(
        "/api/hid/events/send_mouse_relative",
        params={"delta_x": delta_x, "delta_y": delta_y},
    )

send_mouse_wheel(delta_x, delta_y) async

Send a mouse wheel event.

Parameters:

Name Type Description Default
delta_x int

Horizontal scroll delta.

required
delta_y int

Vertical scroll delta.

required
Source code in src/aiopikvm/resources/hid.py
async def send_mouse_wheel(self, delta_x: int, delta_y: int) -> None:
    """Send a mouse wheel event.

    Args:
        delta_x: Horizontal scroll delta.
        delta_y: Vertical scroll delta.
    """
    await self._post(
        "/api/hid/events/send_mouse_wheel",
        params={"delta_x": delta_x, "delta_y": delta_y},
    )