From 218002cb0da2fb0a0d64b07d2b20981de31249a8 Mon Sep 17 00:00:00 2001 From: Daniel DeGroff Date: Sat, 4 Apr 2026 13:19:56 -0600 Subject: [PATCH 1/2] Add syslog identification on connect Send SEND_TO_SYSLOG command during Device.connect() to register pykaleidescape in the Kaleidescape system log, enabling support troubleshooting per the Control Protocol Reference Manual (p. 59). Closes https://github.com/SteveEasley/pykaleidescape/issues/1 Co-Authored-By: Claude Opus 4.6 (1M context) --- kaleidescape/const.py | 1 + kaleidescape/device.py | 10 ++++++++++ kaleidescape/message.py | 6 ++++++ tests/emulator.py | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/kaleidescape/const.py b/kaleidescape/const.py index 76966ca..8aea190 100755 --- a/kaleidescape/const.py +++ b/kaleidescape/const.py @@ -251,6 +251,7 @@ CINEMASCAPE_MASK = "CINEMASCAPE_MASK" SEND_EVENT = "SEND_EVENT" +SEND_TO_SYSLOG = "SEND_TO_SYSLOG" USER_DEFINED_EVENT = "USER_DEFINED_EVENT" USER_DEFINED_EVENT_SELECT_KALEIDESCAPE_INPUT = "SELECT_KALEIDESCAPE_INPUT" diff --git a/kaleidescape/device.py b/kaleidescape/device.py index 860b239..34e4425 100644 --- a/kaleidescape/device.py +++ b/kaleidescape/device.py @@ -4,6 +4,7 @@ import asyncio from dataclasses import dataclass +from importlib.metadata import version as pkg_version from typing import TYPE_CHECKING, TypeVar, cast from . import const @@ -98,6 +99,15 @@ async def connect(self) -> None: # Server only devices don't support this call self._update_friendly_name(await self._get_friendly_name()) + await self._send_syslog_identification() + + async def _send_syslog_identification(self) -> None: + """Send module identification to syslog for Kaleidescape support.""" + ver = pkg_version("pykaleidescape") + await self._send( + messages.SendToSyslog, 0, ["INFORMATION", f"pykaleidescape version {ver}"] + ) + async def disconnect(self) -> None: """Disconnect from hardware.""" await self._connection.disconnect() diff --git a/kaleidescape/message.py b/kaleidescape/message.py index 701532e..bab35f1 100755 --- a/kaleidescape/message.py +++ b/kaleidescape/message.py @@ -1296,6 +1296,12 @@ class SendEvent(Request): name = const.SEND_EVENT +class SendToSyslog(Request): + """Class for SEND_TO_SYSLOG messages.""" + + name = const.SEND_TO_SYSLOG + + @register class UserDefinedEvent(Response): """Class for USER_DEFINED_EVENT messages.""" diff --git a/tests/emulator.py b/tests/emulator.py index 85a70a4..d03fbe3 100644 --- a/tests/emulator.py +++ b/tests/emulator.py @@ -295,6 +295,11 @@ def __init__(self, host: str, port: int = const.DEFAULT_PROTOCOL_PORT): messages.SendEvent.name, (SUCCESS,), ) + self.register_mock_command( + ("01",), + messages.SendToSyslog.name, + (SUCCESS,), + ) self.register_mock_command( ("01", "#00000000123A"), "PLAY", # Fake command for simulating slow work From 5d04d090ed1c831693a06b0acc83ca36228884b4 Mon Sep 17 00:00:00 2001 From: Daniel DeGroff Date: Sat, 4 Apr 2026 13:23:20 -0600 Subject: [PATCH 2/2] Add test for syslog identification on connect Verify that Device.connect() sends the SEND_TO_SYSLOG command with the correct module name and version string. Co-Authored-By: Claude Opus 4.6 (1M context) --- tests/emulator.py | 2 ++ tests/test_d_device.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/tests/emulator.py b/tests/emulator.py index d03fbe3..5a200fe 100644 --- a/tests/emulator.py +++ b/tests/emulator.py @@ -123,6 +123,7 @@ def __init__(self, host: str, port: int = const.DEFAULT_PROTOCOL_PORT): self._clients: list[Client] = [] self._server: asyncio.base_events.Server | None = None self._mock_commands: dict[str, dict] = {} + self.received_requests: list[Request] = [] self.register_mock_command( ("01", "#00000000123A"), @@ -379,6 +380,7 @@ async def _connection_handler(self, reader: asyncio.StreamReader, writer: asynci _LOGGER.debug("< %s", result) request = Request(result) + self.received_requests.append(request) if request.device_id in self._mock_commands: if request.name in self._mock_commands[request.device_id]: diff --git a/tests/test_d_device.py b/tests/test_d_device.py index 0c1a58c..21e2580 100644 --- a/tests/test_d_device.py +++ b/tests/test_d_device.py @@ -4,6 +4,7 @@ import pytest +import kaleidescape from kaleidescape import const from kaleidescape import message as messages from kaleidescape.connection import Connection @@ -63,6 +64,22 @@ async def test_disconnect_during_reconnect(emulator: Emulator): assert not device.is_connected +@pytest.mark.asyncio +async def test_connect_sends_syslog_identification(emulator: Emulator): + """Test that connect sends SEND_TO_SYSLOG for module identification.""" + device = Device("127.0.0.1", port=10001) + await device.connect() + + syslog_requests = [ + r for r in emulator.received_requests if r.name == "SEND_TO_SYSLOG" + ] + assert len(syslog_requests) == 1 + assert syslog_requests[0].fields[0] == "INFORMATION" + assert syslog_requests[0].fields[1] == f"pykaleidescape version {kaleidescape.__version__}" + + await device.disconnect() + + @pytest.mark.asyncio async def test_get_available_devices(emulator: Emulator): """Test get available devices."""