Skip to main content

Pure Python asyncio connector to Art-Net DMX Universes

Project description

GitHub Actions Workflow Status PyPI version

aioartnet is a pure python asyncio connector for the royalty-free Art-Net protocol, which is a transport to transmit and recieve the DMX-512 lighting control protocol over Ethernet (UDP). The protocol is the modern standard for interconnecting complex lighting fixtures directly, and for branching out individual universes for a specific local area to control classic DMX-512 XLR-cable interlinked fixtures. Both open and propriety lighting control systems can emit Art-Net directly.

This library aims to be simple and robust, and can both input data into Art-Net, as well as output it from "artnet" to your user code. It builds a dynamic model of the network's Art-Net nodes, their ports and the universe(s) of DMX-512 that are being controlled. Fully type hinted to comply with PEP-561. No non-core dependancies, with a test suite that runs on Python 3.9 to 3.11.

It can also be used passively to build the network model without joining as an Art-Net Node.

We also have a propriety iOS/Xcode component available for commercial licensing that uses the same event driven API as this code, built on top of Apple's Networking framework NWProtocolUDP. This will be a significantly better starting point for new designs than libartnet for most projects.

Install & Demo

Use pip to install the package from pypi:

$ pip install aioartnet
$ python -m aioartnet.main
INFO:aioartnet:preferred interfaces: [(1, 'wlp4s0'), (10, 'br-ee82b9af434e'), (10, 'docker0'), (10, 'lo')]
INFO:aioartnet:using interface wlp4s0 with ip 192.168.1.205 broadcast ip 192.168.1.255
INFO:aioartnet:configured own port Port<Input,DMX,0:0:1>
INFO:aioartnet:configured own port Port<Output,DMX,0:0:5>
status:
  ArtNetNode<aioartnet,192.168.1.205:6454>                     [Port<Input,DMX,0:0:1>, Port<Output,DMX,0:0:5>]
  ArtNetNode<ODE Mk3,192.168.1.238:6454>                       [Port<Output,DMX,0:0:0>, Port<Output,DMX,0:0:1>]
  ArtNetNode<DMX Monitor,192.168.1.222:6454>                   []
 0:0:1 pubs:[ArtNetNode<aioartnet,192.168.1.205:6454>] subs:[ArtNetNode<ODE Mk3,192.168.1.238:6454>]
 0:0:5 pubs:[] subs:[ArtNetNode<aioartnet,192.168.1.205:6454>]
 0:0:0 pubs:[] subs:[ArtNetNode<ODE Mk3,192.168.1.238:6454>]

Getting Started

  1. Import the library and create an ArtNetClient
    from aioartnet import ArtNetClient
    client = ArtNetClient()
  1. Configure the desired input/output ports on the client using set_port_config(), each call returns ArtNetUniverse objects. Use these to optionally set the initial published value of universes set as ArtNet inputs:
    u1 = client.set_port_config("0:0:1", isinput=True)
    u5 = client.set_port_config("0:0:5", isoutput=True)
    u1.last_data[:] = list(range(128))*4
  1. Await the co-routine client.connect() from an asyncio asynchronous context, e.g:
    async def main() -> None:
        client = ArtNetClient()
        u1 = client.set_port_config("0:0:1", isinput=True)
        u5 = client.set_port_config("0:0:5", isoutput=True)
        u1.last_data[:] = list(range(128))*4
        await client.connect()

    if __name__ == "__main__":
        logging.basicConfig(level=logging.INFO)
        asyncio.run(main())
        asyncio.get_event_loop().run_forever()
  1. Once the client is connected, you can add/configure further ports, read the universes of DMX data and change published values.

  2. The return value from client.connect() is an ayncio.DatagramTransport. If you call close() on this transport, the periodic task is also cancelled.

Networking

There are three ways to configure the networking:

Automatically

Creating an ArtNetClient with no arguments will perform discovery during connect() by iterating the interfaces available, checking if they have an IPV4 address (ie. AF_INET family) and prefering certain properties. Specifically we prefer 2.x.x.x subnets with the 255.0.0.0 subnet mask, then configured Ethernet (interface name enp*), then configured WiFi interfaces (wlp*), followed by any other remaining AF_INET interfaces. The priority ordering is set by aioartnet.PREFERED_INTERFACES_ORDER which can be monkey-patched if required.

Manually by specifying an interface

Passing an interface name to the constructor ArtNetClient(interface="en0"), or setting client.interface="en0" before calling connect() will force use of a specific interface, skipping the interface selection logic. The interface is then queried to determine the ip, broadcast and listening address to use using ioctl calls.

Manually by specifying unicast and broadcast IPs

If the two required IP addresses (ours, broadcast) are set manually on the client no discovery is performed. This will be the most portable method as we effectively supply the arguments directly to asyncio.

client = ArtNetClient()
client.unicast_ip = '192.168.1.15'
client.broadcast_ip = '192.168.1.255'
await client.connect()

Features

Message Recieve Transmit
Node and universe discovery :heavy_check_mark: :heavy_check_mark:
15-bit port addresses :heavy_check_mark: :heavy_check_mark:
>4 ports (bindIndex) on same IP :heavy_check_mark: :heavy_check_mark:
merge-mode (LTP/HTP) in reciever - -
RDM commands to enumerate fixtures - -
Timecode - -
Multi-universe sync message - -
local node reconfigure by API :heavy_check_mark: :heavy_check_mark:
remote reconfigure (by ArtAddress etc) - -
Fixture firmware upgrade messages Not planned Not planned

Implemented Messages

Message Recieve Transmit
ArtPoll :heavy_check_mark: :heavy_check_mark:
ArtPollReply :heavy_check_mark: :heavy_check_mark:
ArtDMX :heavy_check_mark: :heavy_check_mark:
ArtIpProg / ArtIpProgReply - -
ArtAddress - -
ArtDataRequest / ArtDataReply - -
ArtDiagData - -
ArtTimeCode - -
ArtCommand - -
ArtTrigger - -
ArtSync - -
RDM ArtTodRequest / ArtTodData / ArtTodControl / ArtRdm / ArtRdmSub - -

Art-Net

This application aims to be fully compatible with Art-Net devices. We have tested it with:

Art-Net logo Art-Net™ Designed by and Copyright Artistic Licence Engineering Ltd.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioartnet-0.1.2.tar.gz (23.0 kB view details)

Uploaded Source

Built Distribution

aioartnet-0.1.2-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

Details for the file aioartnet-0.1.2.tar.gz.

File metadata

  • Download URL: aioartnet-0.1.2.tar.gz
  • Upload date:
  • Size: 23.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for aioartnet-0.1.2.tar.gz
Algorithm Hash digest
SHA256 ca1c4ea76199f61caaed45fbf34a88151d4e4496c31657d0a32ff431fc63a3f7
MD5 91a27db46906e20bb30483001900f173
BLAKE2b-256 a52c70029fadfe4b45a0ad443b1d40879a7dd524e342acded306462d26271c01

See more details on using hashes here.

File details

Details for the file aioartnet-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: aioartnet-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for aioartnet-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3e3e2854319010636e7a3f222f18aa6aa75c6f2d127c646360d420cc5514e3d7
MD5 d21796459a4e377b65829ae39411f1af
BLAKE2b-256 9ac8084c72a14b1168604bc2dc8b9c6fb371ae7f3c1420256c938d3be7e5bf10

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page