跳转到主要内容

通过以太网控制Onkyo接收器。

项目描述

这是一个用于通过网络控制和交互Onkyo接收器的Python库。它也是一个无需了解编程即可使用的现成命令行脚本。

最后,此存储库包含一个包含Onkyo协议定义的所有命令的YAML文件,该文件通过解析官方文档自动生成。即使您不使用Python,在实现自己的接口时,您也可能发现此文件很有用。更多信息请参见下面的说明。

安装

最新发布版本

$ easy_install onkyo-eiscp

使用方法

该包安装了一个名为 onkyo 的脚本,可以从命令行使用

$ onkyo system-power=off

这将关闭您的接收器。您可能会注意到,您没有提供任何有关接收器在网络中的位置的信息。实际上,该脚本应该能够自行找到您的Onkyo设备。

要查看脚本能够找到哪些接收器,您可以使用

$ onkyo --discover

如果您网络中有多个接收器,则默认情况下,它将简单地连接到找到的第一个设备(每次可能不同)。

您可以通过名称筛选来选择特定的一个

$ onkyo --discover
TX-NR709 192.168.178.200:60128 0009B0D34163
TX-NR609 192.168.178.169:60128 0009B0D24B75

$ onkyo -n 709 system-power=on

这将仅打开TX-NR709设备。

或使用唯一标识符

$ onkyo -i 0009B0D24B75 system-power=on

这将打开TX-NR609设备。

此外,还有一个 --all 标志,可以一次向所有设备发送命令。

当然,您也可以手动指定要连接的设备。

$ onkyo --host 172.20.0.144 volume=55
$ onkyo --host 172.20.0.144 --port 42424 volume=55

要了解哪些命令可用,请使用 --help-commands 选项。

命令

一个命令由三个部分组成:区域、命令和参数。以下是一些示例

system-power=on
zone2.power=on
main.balance=3

如您所见,基本格式为

zone.command=argument

如果您没有指定区域,则默认为主区域。

该语法有一些变体,例如以下都是等价的

power on
power:on
main.power on
main power on

换句话说,可以使用空格代替 .= 分隔符,冒号 : 可以作为 = 的替代。然而,最好使用上述建议的语法。

这些命令的名称由本项目定义,并重写为Onkyo使用的实际低级eISCP命令。如果您知道它们,也可以直接发送此类低级命令。

$ onkyo SLI26     # Selects the "Tuner" source.

关于电源开启的说明

为了使设备处于待机状态时也能正常使用电源开启命令,请确保您已经开启了名为 Setup -> Hardware -> Network -> Network Control 的选项。

如果没有这个选项,您只能在设备已经开启的情况下连接到接收器。

Python模块

在简单情况下,这可能看起来像这样

import eiscp

# Create a receiver object, connecting to the host
receiver = eiscp.eISCP('192.168.1.125')

# Turn the receiver on, select PC input
receiver.command('power on')
receiver.command('source pc')

receiver.disconnect()

不要忘记调用 disconnect() 来关闭套接字。您还可以使用 with 语句

with eiscp.eISCP('192.168.1.125') as receiver:
    receiver.command('source all-ch-stereo')

命令语言在上文已解释。您也可以更明确地使用结构

receiver.command('power', 'on', zone='main')

如果您更喜欢直接发送低级ISCP命令,可以使用 raw 方法

receiver.raw('MVLUP')

函数 command_to_iscp 将允许您将高级命令转换为低级ISCP消息,以便与 eISCP.raw 一起使用。

接收消息

Onkyo接收器也会向您发送消息。具体来说,它会针对您发送的每个命令返回响应,要么是将您发送的命令重复发送回您,要么是在您发送查询消息的情况下,向您报告查询的答案。当接收器状态改变时,它还会向您发送未经请求的状态更新。

从API的角度看,eISCP.raweISCP.command 返回从Onkyo设备接收到的响应。它们是阻塞的。

要接收其他消息,有 eISCP.get,它将返回一条消息或 None。您可以指定自定义的超时值。

Onkyo协议的一个问题是,没有万无一失的方法来区分响应和未经请求的状态更新。通常情况下,这不会成为问题,尽管在理论上,在发送 SLI05 后返回的响应可能是来自另一个控制器的 SLI06 更新。

因此,最好以不同的方式处理协议。与其使用尝试将交换序列化为请求-响应方案的 eISCP.raweISCP.command,不如使用不等待响应就发送消息的 eISCP.send。然后您可以使用 get 以相同的方式处理所有传入的消息,无论它们为什么被发送。这很有效,因为命令或查询的响应与状态更新没有区别。

异步API

还有一个实验性的 eiscp.Receiver,它具有与 eiscp.eISCP 相同的API,但使用后台线程进行网络通信。这允许您通过回调处理传入的消息。

def message_received(message):
    print message

receiver = Receiver('...')
receiver.on_message = message_received

请注意,on_message 处理器在后台线程中执行,因此您可能需要使用队列。

为了保持一致性,eISCP.raweISCP.command 仍然被设计为人工阻塞,而 eISCP.send 是非阻塞的。

设备发现

它可以找到您本地网络上的接收器

for receiver in eiscp.eISCP.discover(timeout=5):
    receiver.command('power off')

这将关闭您网络上的所有Onkyo接收器。

发现设备有一个 info 属性,可以提供一些数据

{'iscp_port': '60128', 'identifier': '0009B04448E0',
 'area_code': 'XX', 'model_name': 'TX-NR709', 'device_category': '1'}

局限性

  • 一些命令需要更复杂的参数结构,如可变长度的字符串,这些目前还不受支持(当然,您当然可以在原始模式下发送它们)。

YAML 文件

此存储库包含一个YAML文件,其中包含由Onkyo协议定义的所有命令,该文件通过解析官方Excel文档自动生成,然后进一步手动调整。

想法是拥有一个计算机可读的Onkyo协议定义,其中Onkyo的内部低级命令被映射为人类可理解的标识符,并包括描述。

解析Onkyo Excel文档可以使您取得惊人的进展,但也有局限性。YAML文件需要手动编辑和修正解析器失败的地方,包括大量的外观修正。其中一些已经完成,但仍有很大的空间来改进协议的YAML描述。

选择此过程和具体的YAML格式是为了允许将来将Onkyo主文档的更改与手动调整无缝合并。

总之,如果您正在实现自己的Onkyo接口,即使它不是用Python编写的,我也鼓励您考虑将此YAML文件作为您提供给用户的命令接口的基础。您将获得可用的命令、值甚至支持的设备的完整列表。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

onkyo-eiscp-1.2.7.tar.gz (48.3 kB 查看哈希值)

上传时间

由以下支持