INDI 18 June 2007
Page 3 of 15
Each Property has a name for identification purposes and a label for presentation purposes. Each element of the Property
vector also has a name, making it in effect an associative array, and a presentation label. Changes to a Property effect all
vector elements atomically.
All Property types except Lights have a permission attribute (lights are conceptually always read-only). Text and Number
may be Read-Only, Write-Only or Read-Write; Switches may be Read-Only or Read-Write. Permission terminology is with
respect to the Client but this does not bestow any true ability. Permission serves only as a hint to a Client as to whether a
Device is potentially willing to allow a Property to be changed. If a Device reports a Property to be Read-Only it still must not
trust the Client to comply but enforce the policy in case of rogue Clients that try to set a new value anyway. The permission
hints allow Clients to treat Property values in sensible ways. For example a GUI Client may display the Property in a way
that conveys whether it can be changed. For writable Properties, GUIs are encouraged to provide two fields: one that is
passive and displays the last value received, and one that is interactive in which the user may type or otherwise modify a
value without it being subject to spontaneous changes.
Each Property as a whole is always in one of four states: Idle, OK, Busy and Alert. If a GUI displays this in different colors,
the colors suggested are gray, green, yellow and red, respectively. A Device is strongly encouraged to send an accompanying
message whenever it informs a Client of a change of state. When a Client sends a command to change a Property, the Client
shall henceforth consider the Property state to be Busy. When the Device accomplishes the associated action it sends a
message that indicates the Property state has changed to, say, OK.
Each Property has a timeout value that specifies the worst-case time it might take to change the value to something else.
The Device may report changes to the timeout value depending on current device status. Timeout values give Clients a simple
ability to detect dysfunctional Devices or broken communication and also gives them a way to predict the duration of an
action for scheduling purposes as discussed later.
Properties may be assembled into groups to suggest how Clients might organize them, for presentation purposes for
example, but groups serve no functional purpose.
INDI Protocol
Each command between Client and Device specifies a Device name and Property name. The Device name serves as a
logical grouping of several Properties. Property names must be unique per Device, and a Server must report unique Device
names to any one Client.
The INDI protocol does not have the notion of query and response. A sender does not save context when it sends a command
and wait for a specific response. A command may be sent for which a complementary command back is likely but all INDI
participants must always be prepared to receive any command at any time. There is no notion of meta-errors such as illegally
formatted commands, inappropriate commands or problems with the underlying communication mechanism. The proper
response to all unusual or unexpected input is expressly to ignore any such problems (although some form of logging outside
the scope of INDI might be judicious). With these rules the INDI protocol is small and simple; defines-away the possibility of
deadlocks at the protocol level; automatically accommodates broadcasting; permits flexible and transparent routing; and
eliminates the need for complex sequencing and synchronization.
When a Client first starts up it knows nothing about the Devices and Properties it will control. It begins by connecting to a
Device or indiserver and sending the getProperties command. This includes the protocol version and may include the name
of a specific Device and Property if it is known by some other means. If no device is specified, then all devices are reported; if
no name is specified, then all properties for the given device are reported. The Device then sends back one deftype element
for each matching Property it offers for control, limited to the Properties of the specified Device if included. The deftype
element shall always include all members of the vector for each Property.
Note again that by sending a request for Property definitions the Client is not then waiting specifically for these definitions in
reply. Nor is the Device obligated to supply these definitions in any order or particular time frame. The Client may learn of
some Properties soon and perhaps others much later. The Client may also see messages for Properties about which it is as yet