Skip to content

Configuration File Structure

The configuration file uses a notation called JSON. This is an international standard notation. It doesn’t matter what JSON stands for, but notice that it is not JASON.

The configuration files have the extension .MOAS. They are text files. They can be edited using Notepad or any other text editor. If you use a word processor you must save the result as a text file. There are also online web based JSON editors available for free.

The character encoding for the files is UTF-8. This will not matter to you unless you want to put non-English characters in the names. The MOAS II server will handle just about any character, as will the Android client and the MOAS Windows client. The Windows OASP client does not handle non-English characters properly.

The syntax is described on www.json.org. JSON was designed by computer programmers and most of the information on the Internet is written for computer programmers. This description is written for non-programmers.

In JSON everything has a name and a value (with one exception). Names are written in quotes. Case matters – “Thing” , “THING” , and “thing” are three names. In the configuration file all names start with a capital letter. If a name is more than one word all of the words start with capitals and the spaces are left out. For example a first name might be named “FirstName”. “ID”, which stands for identifier, is an exception – it is all capitals.

Names are separated from values with a colon. “FirstName” : “Paul” is proper JSON.

There are several types of values:

A string is always in quotes. A string can contain any UTF-8 characters. “20 Beam” , “Stack”, and “42” are all strings.

A number is one or more decimal (base 10) digits, optionally with a minus sign in front. A decimal point and more digits are also allowed but currently no numbers in the configuration file use decimal points. Numbers are never in quotes.

The maximum value for a number is 2,147,483,647 and the minimum value is - 2,147,483,648. Commas, the plus sign, and leading zeros are not allowed. 1, -30 , and 65536 are valid numbers. 01 , +30 , and 65,536 are not. “2” is not a number, it is a string.

A Boolean is a fancy name for a value that is true or false. The words true and false, all lowercase are Boolean JSON values. Boolean values are never in quotes.

JSON allows the word null as a value. It is not used in the configuration file.

A value can be a group of names and values surrounded by curly braces.

For example, "Person" : { "FirstName" : "Paul", "LastName" : "Young" }

An empty group is allowed. "Nothing" : {}

A value can be a list of values surrounded by square brackets.

For example, "Relays" : [ 1, 2, 3, 20 ]

A list with one value is not the same as that value. In other words, [ 1 ] is not the same as 1. If a list has only one value it must still be written as a list. An empty list is a valid value. "Fast" : [] is acceptable.

Since a group is a value a list can contain groups. This allows for nesting:

"Antennas" : [
{ "ID" : 1, "Name" : "80 Dipole", "Relays" : [1] },
{ "ID" : 2, "Name" : "40 Dipole", "Relays" : [2] }
]

In the above example the value of Antennas is two groups, one describing an 80 meter dipole and one describing a 40 meter dipole. The configuration file looks like this but with more information and more nesting.

JSON allows values in lists to be of different type, such as [ 1, "Fred", false ] but in the configuration file all of the values of a list are of the same type.

The comma is used to separate name/value pairs in groups and values in lists. The comma must not be used after the last value. For example, these are all bad:

"Relays" : [ 0, 1, ]
"People" : [
{ "FirstName" : "Paul", "LastName" : "Young" }
{ "FirstName" : "Charlotte" "LastName" : "Richardson" }
]

The first example has an extra comma after the 1. The second example is missing two commas, one after the first closing curly brace and the second after Charlotte.

Misplacing commas is very easy to do, especially when cut and paste editing a configuration file.

JSON allows spaces, tabs, and new lines anywhere except in names and values.

"Relays":[0,1]

Is the same as this:

"Relays" : [
0,
1
]

Spacing and lines can make the configuration file easier to read. There are many styles of indenting JSON.

It was mentioned above that there is one exception to the rule that everything has a name and a value. The entire configuration file is a value with no name. It is a group, so the configuration file must begin with an open curly brace and end with a close curly brace.

It can be difficult to spot errors in JSON text and the configuration file reader is not very good at explaining what is wrong. A much better file reader is online at www.jsonlint.org. You can copy and paste the entire configuration file into the website and it will usually point to where the problems are.

The information in the configuration file is divided into nine major lists and a few miscellaneous names and values.

The templates list describes physical antennas. It is a list of groups. Each group describes one physical antenna. It contains information such as the manufacturer and model, type, and gain and beamwidth. This information is provided to clients, which could use it to provide better graphics and icons for the antennas. There is also a future plan which may use the gain and beamwidth in the server.

At this point no client uses this information so it will not harm anything if some or all is not provided.

If there are several identical antennas, such as in a stack of yagis, only one template is needed to describe all of them. Each template group name must unique because the antennas refer to the templates by the name.

NameRequired/OptionalTypeMeaning
NameMandatoryStringAntenna name
ManufacturerOptionalStringAntenna Manufacturer
ModelOptionalStringAntenna Model
TypeOptionalStringAntenna type: dipole, vertica l, yagi, etc.
InfoOptionalListFrequency-specific information

The Info list contains the following:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency limit
UpperFrequencyOptionalNumberUpper frequency limit
ElementsOptionalNumberNumber of elements
3dBWidthOptionalNumber3 dB beamwidth
LobesOptionalNumberNumber of main lobes

This describes a Cushcraft 15-4CD 4 element yagi

"Templates" : [
{
"Name" : "Cushcraft 15CD-4",
"Manufacturer" : "Cushcraft",
"Model" : "15-4CD",
"Type" : "yagi",
"Info" : [
{
"LowerFrequency" : 21000,
"UpperFrequency" : 21450,
"Elements" : 4,
"3dBWidth" : 56,
"Lobes" : 1
}
]
}
]

This describes a homebrew 4-square

"Templates" : [
{
"Name" : "80 M 4-square",
"Type" : "vertical",
"Info" : [
{
"LowerFrequency" : 3500,
"UpperFrequency" : 4000,
"Elements" : 4,
"3dBWidth" : 99,
"Lobes" : 1
}
]
}
]

This describes a DX Engineering (Bencher) Skyhawk tribander.

"Templates" : [
{
"Name" : "Bencher Skyhawk",
"Manufacturer" : "DX Engineering",
"Model" : "Skyhawk",
"Type" : "yagi",
"Info" : [
{
"LowerFrequency" : 14000,
"UpperFrequency" : 14350,
"Elements" : 3,
"3dBWidth" : 72,
"Lobes" : 1
},
{
"LowerFrequency" : 21000,
"UpperFrequency" : 21450,
"Elements" : 3,
"3dBWidth" : 72,
"Lobes" : 1
},
{
"LowerFrequency" : 28000,
"UpperFrequency" : 29700,
"Elements" : 4,
"3dBWidth" : 61,
"Lobes" : 1
}
]
}
]

The antennas list describes antennas which can be selected.

The radio RX antenna is designed to handle switching of receive antennas that are connected to the radio’s RX antenna. The information is passed to the client which, if it is a logging program which controls the radio, could activate or deactivate the radio’s RX Antenna connector. There is no client yet which implements this.

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this antenna
DisplayNameOptionalStringAntenna name (ignored b y the server)
TemplateOptionalStringAntenna template
ShortNameOptionalStringName of antenna
LongNameOptionalStringDescriptive name of antenn a
EnabledOptionalBooleanTrue if antenna can be sel ected
RXOnlyOptionalBooleanTrue if antenna is receive- only
TXOnlyOptionalBooleanTrue if antenna is transmit -only
NoSelectOptionalBooleanTrue if antenna should no t be considered as the best choice when changing bands
InhibitOptionalBooleanTrue if transmit should be inhibited when this antenna is selected as the transmit antenna
SharedTXOptionalBooleanTrue if this antenna can be shared for transmit between cooperating radios
InUseOptionalNumber ListIf antenna is part of a system, the IDs of the antennas used
RotatorOptionalNumberRotator number
OffsetOptionalNumberAntenna offset from rotator position in degrees or the direction if the antenna does not have a rotator
AlternateOptionalNumber ListAntenna numbers of a ntennas which are an alternate path for connecting to this antenna
ConflictsOptionalNumber ListAntennas which canno t be used when this antenna is in use
ControlOptionalListRelays used to control this antenna
ScenariosOptionalNumber ListScenarios where this antenna is active
OverridesOptionalNumber ListAntennas which allow this antenna to be selected even if there is a conflict.
NoHistoryOptionalBooleanTrue if this antenna is not remembered when selecting.

The antenna numbers specified in the In use list are the antenna IDs of the additive antennas which make up the antenna, if any. It is not necessary to list an antenna as using itself. And the Rotator of antennas which use others is ignored.

The Control list contains the following:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency for these relays
UpperFrequencyOptionalNumberUpper frequency for these relays
StationsOptionalListPer-station and radio inform ation

The Stations list contains the following:

NameRequired/OptionalTypeMeaning
StationOptionalNumberStation number
RadioOptionalNumberRadio number RadioRXAntenna Optional Boolean True if antenna is connected to radio RX antenna
RelaysOptionalNumber ListRelays to select
RXRelaysOptionalNumber ListRelays to select when receiving on this antenna (if different than TX)
PersistentRelaysOptionalNumber ListRelays to sel ect when the other (TX or RX) antenna is part of a different group

This is a 40 meter beam connected to port 3 on a 2x6 switch in an SO2R station. It is mounted on rotator 1. Relay 2 selects it for radio 1 and relay 8 selects it for radio 2.

"Antennas" : [
{
"ID" : 4,
"Template" : "40 Beam",
"ShortName" : "Beam",
"LongName" : "40 Meter Beam",
"InUse" : [4],
"Rotator" : 1,
"Offset" : 0,
"Conflicts" : [4],
"Fast" : [4],
"Control" : [
{
"LowerFrequency" : 7000,
"UpperFrequency" : 7300,
"Stations" : [
{
"Station" : 1,
"Radio" : 1,
"Relays" : [2]
},
{
"Station" : 1,
"Radio" : 2,
"Relays" : [8]
}
]
}
]
}
]

This is a more complicated example.

Two stations are connected to a 2x10 switch. Station 1 is relays 0-9 and station 2 is 10-19.

A stack of three tribanders is connected to a micro stack switch. The main feedline is on switch port 2 and the secondary feedline is on switch port 10.

The micro Stack Switch uses relays 20-26.

Each station has a switched bandpass filter. The filters use relays 40-45 and 50-55.

Antennas 0-6 represent the choices on the main feedline. Antennas 7-9 represent the choices on the secondary feedline.

"Antennas" : [
{
"ID": 0,
"Template": "Bencher Skyhawk"
"ShortName" : "Top",
"LongName" : "Bencher Skyhawk stack top",
"InUse" : [0],
"Rotator" : 1,
"Offset" : 0,
"Alternate" : [7],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [
{
"LowerFrequency" : 14000,
"UpperFrequency" : 14350,
"Stations" : [
{
"Station" : 1,
"Radio" : 1,
"Relays" : [1, 22, 25, 27, 43],
},
{
"Station" : 1,
"Radio" : 2,
"Relays" : [11, 22, 25, 27, 53],
}
]
},
{
"LowerFrequency" : 21000,
"UpperFrequency" : 21450,
"Stations" : [
{
"Station" : 1,
"Radio" : 1,
"Relays" : [1, 22, 25, 27, 44],
},
{
"Station" : 1,
"Radio" : 2,
"Relays" : [11, 22, 25, 27, 54],
}
]
},
{
"LowerFrequency" : 28000,
"UpperFrequency" : 29700,
"Stations" : [
{
"Station" : 1,
"Radio" : 1,
"Relays" : [1, 22, 25, 27, 45],
},
{
"Station" : 1,
"Radio" : 2,
"Relays" : [11, 22, 25, 27, 55],
}
]
}
]
},
{
"ID": 1,
"Template": "Bencher Skyhawk"
"ShortName" : "Mid",
"LongName" : "Bencher Skyhawk stack middle",
"InUse" : [1],
"Offset" : 45,
"Alternate" : [8],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 8],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 2,
"Template": "Bencher Skyhawk"
"ShortName" : "Bot",
"LongName" : "Bencher Skyhawk stack bottom",
"InUse" : [2],
"Offset" : 45,
"Alternate" : [9],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 3,
"Template": "Bencher Skyhawk"
"ShortName" : "Top Mid",
"LongName" : "Bencher Skyhawk stack top + middle",
"InUse" : [0, 1],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 8],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 4,
"Template": "Bencher Skyhawk"
"ShortName" : "Top Bot",
"LongName" : "Bencher Skyhawk stack top + bottom",
"InUse" : [0, 2],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 5,
"Template": "Bencher Skyhawk"
"ShortName" : "Mid Bot",
"LongName" : "Bencher Skyhawk stack middle + bottom",
"InUse" : [1, 2],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 6,
"Template": "Bencher Skyhawk"
"ShortName" : "Top Mid Bot",
"LongName" : "Bencher Skyhawk stack top + middle + bottom",
"InUse" : [0, 1, 2],
"Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 7,
"Conflicts" : [0, 3, 4, 6, 7, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 8,
"Conflicts" : [1, 3, 5, 6, 7, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
},
{
"ID": 9,
"Conflicts" : [2, 4, 5, 6, 7, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
"Control" : [ <omitted from example> ]
}
]

The systems list describes antenna systems. An antenna does not need to be part of a system. If it is not in a system, it is considered a single exclusive antenna. An antenna can be part of only one antenna system. An antenna system can be part of another antenna system. Each antenna system must have a unique ID number.

Whether an antenna behaves as an additive or exclusive antenna when selecting from a button client depends on whether its ID is in the additive or exclusive lists in the system.

The number of antennas in the system is used for display only. Use whatever number you think makes sense.

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this system
DisplayNameOptionalStringSystem name (ignored by the server)
AntennasOptionalNumberNumber of antennas in the system
AdditiveAntennasOptionalNumber ListAntennas which are treated as additive
ExclusiveAntennasOptionalNumber ListAntennas which are treated as exclusive
SharedAntennasOptionalNumber ListAntennas for shared use
AdditiveSystemsOptionalNumber ListSystems which are treated as additive
ExclusiveSystemsOptionalNumber ListSystems which are treated as exclusive
SharedSystemsOptionalNumber ListSystems which are treated as shared (Not implemented yet)
SharedOptionalBooleanInitial state of antenna sharing
"Systems" : [
{
"ID": 0,
"AdditiveAntennas" : [0, 1, 2],
"ExclusiveAntennas" : [3, 4, 5, 6]
"SharedAntennas" : [10, 11, 12]
"Shared" : False
}
]

The scenarios list describes scenarios. An antenna may be part of one or more scenarios, or it may not be part of any scenario. If it is not part of a scenario it is available regardless of what scenario is active.

Each scenario must have a unique ID number.

A scenario may be in conflict with other scenarios. In this case, if a scenario is active, all scenarios which are in conflict are not active.

A scenario may have conditions which describe when it will be activated. A scenario may be active when two or more radios are on the same band or are on different bands. If two scenarios are activated when radios are on the same band and they are in conflict the one selected will be determined by which radio changed bands last.

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this scenario HasPriority Optional Boolean True if this scenario should be preferred if multiple scenarios could be activated
ConflictsOptionalNumber ListScenarios which will be inactive when this scenario is active
ConditionsOptionalListConditions where this scen ario will be activated
LastChangedOptionalListStations which will cause this to be a preferred scenario for activation when they change bands

The Stations list contains the following:

NameRequired/OptionalTypeMeaning
SameBandOptionalListRadios which activate this s cenario when they are on the same band
DifferentBandOptionalListRadios which activate t his scenario when they are on different bands

SameBand, DifferentBand, and LastChanged Lists

Section titled “SameBand, DifferentBand, and LastChanged Lists”

The SameBand and DifferentBand lists contain the following:

NameRequired/OptionalTypeMeaning
StationOptionalNumberStation number
RadioOptionalNumberRadio number
"Scenarios": [
{
"ID": 1,
"Conflicts": [2, 3],
"Conditions": [
{
"DifferentBand": [
{
"Station" : 1,
"Radio" : 1,
},
{
"Station" : 1,
"Radio" : 2,
}
]
}
]
},
{
"ID": 2,
"Conflicts": [1, 3],
"Conditions": [
{
"SameBand": [
{
"Station" : 1,
"Radio" : 1,
},
{
"Station" : 1,
"Radio" : 2,
}
]
}
],
"LastChanged": [
{
"Station" : 1,
"Radio" : 2,
}
]
},
{
"ID": 3,
"Conflicts": [1, 2],
"Conditions": [
{
"SameBand": [
{
"Station" : 1,
"Radio" : 1,
},
{
"Station" : 1,
"Radio" : 2,
}
]
}
],
"LastChanged": [
{
"Station" : 1,
"Radio" : 1,
}
]
},
]

The functions list describes functions that can be made available as buttons. It is a list of groups. Each group describes one function with a set of parameters. Each function must have a unique ID number because the layout refers to functions using the ID number.

These are specific functions of the server – the server recognises them by their names. Additional functions may be added in future versions. Lists of numbers and strings tell the function what to do. It is possible to have more than one function which has the same name and uses the same server’s function but uses different numbers. For example, there could be a function which swaps the antennas of station 1 radio 1 and station 1 radio 2 and a different swap function which swaps the antennas of station 2 radio 1 and station 2 radio

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this system
DisplayNameOptionalStringFunction name (ignored by the server)
NameRequiredStringFunction name as known by the server
ShortNameOptionalStringName displayed for functi on Longname Optional String Fully descriptive name of function IntParams Optional Number List Function-specific parameters
StringParamsOptionalString ListFunction-specific parameters There may be several functions that use the same Name but have different parameters.

This function swaps the antennas of the two radios if both antennas are usable on the other radio’s frequency.

The function uses a list of four numbers. The first two are the station number and radio number for one radio. The second two are the station number and radio number for another radio.

This function sets the receive antenna for a radio to the transmit antenna.

It does not use the lists of numbers and names.

This function stores the current transmit and receive antennas for a radio in memory where the Recall function can find them.

It does not use the lists of numbers and names.

This function recalls the transmit and receive antennas stored by the Store function if they are usable on the radio’s frequency.

It does not use the lists of numbers and names.

This function changes an antenna system between shared and not shared. It is useful with antenna systems which may be shared or may have their individual antennas split among several radios. An example would be a stack of tribanders with a triplexer and switching that allows the tribanders to be connected to the triplexer or to individual radios.

This function uses a list of numbers. The first number is the ID of the antenna system which will be switched between shared and not shared. Any other numbers are IDs of non-shared antennas which will be assigned preferentially to the radios when the antenna system is changed from shared to not shared. The preferred antenna IDs are only necessary if it is desired to override the function’s default selections of antennas for the radios.

This function turns a relay on or off. The relay is not part of an antenna.

This function uses a list of numbers. The first number is the relay number to turn on or off. It may be the only number specified. If more numbers are specified the second number is the station number and the third the radio number that this applies to. The fourth and further numbers are antenna numbers. The function will only be available when the specified radio has selected one of the specified antennas. The function also uses a list of strings if a radio is specified. The strings can be “T”, “R”, or “S”. If “T” is specified the relay can be turned on if a specified antenna is selected for transmit. If “R” is specified the relay can be turned on if a specified antenna is selected for receive. If “S” is specified the relay will be turned on if it was turned off due to an antenna selection.

This function adds a radio to an inhibit buss or removes it from that buss.

The function uses a list of numbers. The first number is the station number. The second number is the radio number. The third number is the inhibit buss number.

This function turns a relay on when a station is transmitting. There can be constraints on when the function is available.

The function uses a list of numbers and possibly strings. The first number is the station number. The second number is the radio number. The last number is the relay number.

The string list may specify constraints.

It is possible to enable this function only when two radios would be able to swap antennas. This is useful in the case of driving transfer switching or shared amplifiers. To enable this, a list of strings must be passed with the function, one of which must be “Transfer”. In addition to this, the numbers list must contain two additional numbers before the relay number. The first number is the station number for another radio and the second number is the radio number. The function will only be available if the antennas of both radios can be swapped and if the two radios are interlocked so that when one is transmitting, the other is inhibited from transmitting.

This function sets two radios to be partners.

The function uses a list of four numbers. The first two numbers are the station and radio numbers for one radio. The third and fourth numbers are the station and radio numbers for another radio.

This function sets radios so that they will switch a radio to the alternate antenna when they transmit.

The function uses a list of at least four numbers. The first two numbers are the station and radio numbers for the radio which will be switched to the alternate antenna. Additional numbers are the station and radio numbers for stations which will switch the specified radio to the alternate antenna when they transmit.

This function enables and disables scenarios.

The function uses a list of at least one number. The numbers are scenario IDs.

If one number is specified the function will enable that scenario, disabling all which are in conflict. It cannot disable the scenario. Usually if you are using this function with one scenario you will have another button that will enable a scenario which is in conflict with this one and you will use the two buttons to select one of the two scenarios.

If two numbers are specified the function will toggle between the scenarios, enabling the one which is not enabled. It will show as selected when the first scenario is active and as available when it is not.

If three or more numbers are specified the function will select the scenarios in round-robin fashion.

Other events, such as a radio changing bands, can also change which scenarios are enabled.

The function will display the changed state if applicable.

This function enables and disables a radio.

The function uses a list of two numbers. They The function uses a list of four numbers. They are the station and radio numbers for one radio.

The function optionally uses a list of strings. One value is allowed. The value can be “Toggle”, “On”, or “Off”. If “Toggle” is specified or no value is specified pressing the button will alternate between enabled and disabled. If “ON” is specified the function will enable the radio and it cannot disable the radio. If “OFF” is specified the function will disable the radio and it cannot enable the radio.

If “On” or “Off” are used then two functions are necessary to enable and disable the radio.

This is one example of each of the functions.

"Functions" : [
{
"ID": 0,
"Name" : "AntennaSwap",
"ShortName" : "Swap",
"LongName" : "Swap antennas between radios 1 and 2",
"IntParams" : [1, 1, 1, 2],
"StringParams" : []
},
{
"ID": 1,
"Name" : "RXTX",
"ShortName" : "RX=TX",
"LongName" : "Set RX antenna to TX",
"IntParams" : [],
"StringParams" : []
},
{
"ID": 2,
"Name" : "Store",
"ShortName" : "Store",
"LongName" : "Store current TX and RX antennas",
"IntParams" : [],
"StringParams" : []
},
{
"ID": 3,
"Name" : "Recall",
"ShortName" : "Recall",
"LongName" : "Recall stored TX and RX antennas",
"IntParams" : [],
"StringParams" : []
},
{
"ID": 4,
"Name" : "Share",
"ShortName" : "Share",
"LongName" : "Share tribander stack between two stations",
"IntParams" : [0],
"StringParams" : []
},
{
"ID" : 5,
"Name" : "Relay",
"ShortName" : "Coffee",
"LongName" : "Turn coffee pot on or off",
"IntParams" : [30],
"StringParams" : []
},
{
"ID" : 6,
"Name" : "Relay",
"ShortName" : "Amp",
"LongName" : "Turn amplifier on or off",
"IntParams" : [31, 1, 1, 2, 3],
"StringParams" : ["T", "S"]
},
{
"ID" : 7,
"Name" : "Inhibit",
"ShortName" : "Inhibit 20",
"LongName" : "Inhibit Radio 1 on 20",
"IntParams" : [1, 1, 20],
"StringParams" : []
},
{
"ID" : 8,
"Name" : "Extra",
"ShortName" : "Xfer Relay",
"LongName" : "Transfer Relay Radio 1",
"IntParams" : [2, 1, 1, 1, 55],
"StringParams" : ["Transfer"]
},
{
"ID" : 9,
"Name" : "Partner",
"ShortName" : "Partner",
"LongName" : "Partner 1 and 2",
"IntParams" : [1, 1, 1, 2],
"StringParams" : []
},
{
"ID" : 10,
"Name" : "AltActive",
"ShortName" : "Alt Active",
"LongName" : "Set Alternate radios",
"IntParams" : [1, 1, 2, 1, 3, 1],
"StringParams" : []
},
{
"ID" : 11,
"Name" : "Scenario",
"ShortName" : "Scenario",
"LongName" : "Change Scenario",
"IntParams" : [1, 2],
"StringParams" : []
},
{
"ID" : 12,
"Name" : "Enable",
"ShortName" : "Enabled",
"LongName" : "Enable radio 1",
"IntParams" : [1, 1],
"StringParams" : []
}
]

The RelayGroups list describes relay groups. A relay group is a list of relays that can be turned on and off and the conditions where they may change.

It is a list of groups. Each group describes one set of relays. Each relay group must have a unique ID number because the layouts refer to the relay group using the ID number.

Relay groups have a long name and a short name. The short name is put on buttons. If the short name is too long it won’t fit. A length of a dozen or so characters is probably OK. It is difficult to give a general rule because some characters are much wider than others.

A relay group as three states, Unavailable, Available, and Selected. Availability is determined by various items in the list.

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this relay group
ShortNameOptionalStringName of relay group
LongNameOptionalStringDescriptive name of relay group
AlwaysSelectedOptionalBooleanTrue if relay group is always selected when available
MemoryOptionalBooleanTrue if last available/selected state is remembered and restored
UnavailableOptionalNumber ListRelays to select if the relay group is unavailable
GroupsOptionalListRelays and selection criteria

The Groups information is used to determine if the relay group is available or selected and to specify which relays are to be activated.

The Groups list contains the following:

NameRequired/OptionalTypeMeaning
StationOptionalNumberStation number
RadioOptionalNumberRadio number
ControlOptionalListRelays and selection criteria

The Control list contains the following:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLowest frequency where relay group is available
UpperFrequencyOptionalNumberHightest frequency where relay group is available
ScenariosOptionalNumber ListScenarios where relay group is available
TxAntennasOptionalNumber ListTransmit antennas where relay group is available
RxAntennasOptionalNumber ListReceive antennas where relay group is available
AvailableOptionalNumber ListRelays to select when relay group is available
SelectedOptionalNumber ListRelays to select when relay group is selected
TxSelectedOptionalNumber ListRelays to select during transmit when relay group is selected
RxSelectedOptionalNumber ListRelays to select during receive when relay group is selected

LowerFrequency, UpperFrequency, TxAntannas, RxAntennas, TXSelected, and RXSelected are not available unless the Groups List contains a Station and Radio.

The relays are only selected if this control meets the selection criteria (frequencies, scenarios etc). They will not be selected if another control meets selection criteria.

This example shows a relay group where relay 1 will be active if scenario 0 is active. It is not normally used with a layout.

"RelayGroups": [
{
"ID": 0,
"ShortName": "Scenario 1 relay",
"LongName": "Scenario 1 relay",
"AlwaysSelected": true,
"Groups": [
{
"Control": [
{
"Scenarios": [ 0 ],
"Selected": [ 1 ]
}
]
}
]
}
]

This example shows a relay group where different relays will be selected depending on the frequency of station 1 radio 1, and for ten meters, which antenna is selected.

"RelayGroups": [
{
"ID": 0,
"ShortName": "AMP 1",
"LongName": "High Band Amplifier",
"Memory": true,
"Unavailable": [ 50, 51 ],
"Groups": [
{
"Station": 1,
"Radio": 1,
"Control": [
{
"LowerFrequency": 14000,
"UpperFrequency": 14350,
"Available": [ 52 ],
"Selected": [ 53, 54 ],
"TxSelected": [ 55, ],
"RxSelected": [ 56, 57 ]
},
{
"LowerFrequency": 21000,
"UpperFrequency": 21450,
"Available": [ 42 ],
"Selected": [ 43, 44 ],
"TxSelected": [ 45 ],
"RxSelected": [ 46, 47 ]
},
{
"LowerFrequency": 28000,
"UpperFrequency": 29700,
"TxAntennas": [ 0, 7, 14, 21 ],
"Available": [ 60 ],
"Selected": [ 61 ],
"TxSelected": [ 62 ],
"RxSelected": [ 63 ]
}
]
}
]
}
]

The layout list describes button or knob layouts which can be used by a client. It is a list of groups. Each group describes one layout. Layouts do not have an ID.

Each button is identified by a row and a column. The top left button is row 0 column 0.

flowchart LR

    B1[Row 0<br>Column 0] ~~~ B2[Row 0<br>Column 1]
    B3[Row 1<br>Column 0] ~~~ B4[Row 1<br>Column 1]

A knob client has only one row. Turning the knob to the right selects the next layout item. Turning the knob to the left selects the previous layout item. Turning past the end of the list of items wraps back to the other end of the list.

If a station and radio number are not provided then the layout will be used by all stations and radios.

If a row and column is not used it does not need an entry. The client will not put a button in a place where no antenna or function is specified.

NameRequired/OptionalTypeMeaning
RowsOptionalNumberNumber of rows
ColumnsOptionalNumberNumber of columns
StationOptionalNumberStation number
RadioOptionalNumberRadio number
MatrixOptionalListButton information

The matrix list contains the following:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency limit
UpperFrequencyOptionalNumberUpper frequency limit
ButtonsOptionalListButton position and function If the frequencies are not specified the entry applies to all frequencies. This might be used, for example, to set up function buttons which are always displayed.

The buttons list contains the following:

NameRequired/OptionalTypeMeaning
RowRequiredNumberButton row
ColumnRequiredNumberButton column
TypeRequiredStringMust be Antenna or Function
IDRequiredNumberIdentifier of antenna or function

This layout shows an 80 meter 4-square.

"Layout" : [
{
"Rows" : 4,
"Columns" : 3,
"Station" : 1,
"Matrix" : [
{
"LowerFrequency" : 3500,
"UpperFrequency" : 4000,
"Buttons" : [
{
"Row" : 0,
"Column" : 0,
"Type" : "Antenna",
"ID" : 3
},
{
"Row" : 0,
"Column" : 1,
"Type" : "Antenna",
"ID" : 2
},
{
"Row" : 1,
"Column" : 0,
"Type" : "Antenna",
"ID" : 0
},
{
"Row" : 1,
"Column" : 1,
"Type" : "Antenna",
"ID" : 1
}
]
}
]
}
]

This example shows a layout with two antennas for 20-10 meters and two functions which will appear no matter what frequency the radio is using.

"Layout" : [
{
"Rows" : 5,
"Columns" : 2,
"Station" : 1,
"Radio" : 1,
"Matrix" : [
{
"LowerFrequency" : 14000,
"UpperFrequency" : 29700,
"Buttons" : [
{
"Row" : 0,
"Column" : 0,
"Type" : "Antenna",
"ID" : 6
},
{
"Row" : 0,
"Column" : 1,
"Type" : "Antenna",
"ID" : 0
},
]
},
{
"Buttons" : [
{
"Row" : 1,
"Column" : 2,
"Type" : "Function",
"ID" : 3
},
"Buttons" : [
{
"Row" : 1,
"Column" : 3,
"Type" : "Function",
"ID" : 4
},
]
}
]
}
]

The relative antennas list describes which antennas to use with a relative client. It is a list of groups. Each group describes relative antennas for one or more stations. Relative antennas do not have an ID.

These describe which antennas to use as relative antennas for logging programs.

If the station and radio are not supplied the antennas apply to all stations and radios.

Frequency ranges should not overlap.

NameRequired/OptionalTypeMeaning
StationOptionalNumberStation number
RadioOptionalNumberRadio number
AntennasRequiredListRelative antennas

The Antennas list contains the following:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency limit
UpperFrequencyOptionalNumberUpper frequency limit
IDsRequiredNumber ListIDs of antennas, in relati ve order
RXIDsOptionalNumber ListIDs of receive antennas If the RXIDs are supplied the list must be the same length as the IDs. The specified antennas will be used for receive. If RXIDs are not supplied the transmit antennas will be used for receive.

This example would select the all three antennas for 20-10 meters under control of a logging program which acts as a client. They could be the most combinations of a stack of three tribanders – all, top, and bottom two.

"RelativeAntennas" : [
{
"Station" : 1,
"Radio" : 1,
"Antennas" : [
{
"LowerFrequency" : 14000,
"UpperFrequency" : 29700,
"IDs" : [6, 1, 5]
}
]
}
]

The rotators list describes antenna rotators. Each rotator must have a unique ID number.

There are three kinds of rotators. One is a physical device. Another other is electrical, where it involves the switching of an antenna system. The third is a simulated rotator, used for testing only.

The server will deal with several types of rotator control. The type is a string which is known to the server.

The choices are:

  • Serial - A serial rotator is a physical rotator which is connected to a serial or USB port.

  • Electrical - An electrical rotator is a virtual rotator for a system which can be electrically switched to different directions, such as a four square.

  • Test - A test rotator is a simulated rotator used for testing. The rotator turns at ten degrees per second.

If the rotator is electrical then all of the antennas which use it must be part of an antenna system and all antennas within the system must specify the same rotator. When the rotator direction is changed the server will select the antenna with the offset closest to the requested direction.

If the rotator is serial then it may be connected to any computer available on the network. That computer must run the MOAS Rotator program. See appendix 1.1.1.1.1.1.B for more information about the MOAS Rotator.

NameRequired/OptionalTypeMeaning
IDRequiredNumberUnique number for this rotator
ShortNameOptionalStringName of rotator
LongNameOptionalStringDescriptive name of rotato r
InvisibleOptionalBooleanTrue if rotator should n ot be shown to clients
CCWLimitOptionalNumberCounterclockwise limit in degrees
RotationOptionalNumberNumber of degrees the rotator can travel
ControlOptionalStringType of rotator control
AddressOptionalStringNetwork address of the computer where the rotator is connected
CommPortOptionalStringName of communications por t where the rotator is connected
ModelOptionalStringRotator model
PollOptionalNumberHow often to check direction i n milliseconds

Address, CommPort, Model, and Poll are only used if the Control is “Serial”.

Rotator 0 turns a triband beam. Rotator 1 is a 9-circle receiving antenna. And rotator 2 turns a side mount which is limited in travel from 0 to 300 degrees.

"Rotators" : [
{
"ID": 0,
"ShortName" : "Tribander",
"LongName" : "Triband Beam on tower",
"CCWLimit" : 180,
"Rotation" : 360,
"HasStop" : true,
"Control" : "Serial",
"Address" : "127.0.0.1",
"CommPort" : "COM14",
"Model" : "RotorEZ",
"Poll" : 2000
},
{
"ID": 1,
"ShortName" : "9-Circle",
"LongName" : "9-Circle receive array",
"CCWLimit" : 0,
"Rotation" : 360,
"Control" : "Electrical"
},
{
"ID" : 2,
"ShortName" : "10 side",
"LongName" : "10 meter side-mount",
"CCWLimit" : 0,
"Rotation" : 300,
"Control" : "Test"
}
]

The radios list describes the radios. Each radio must have a unique station and radio number.

NameRequired/OptionalTypeMeaning
StationRequiredNumberStation number
RadioRequiredNumberRadio number
SubReceiverOptionalNumberRadio number of sub receiver
PersistSubReceiverOptionalBooleanTrue if the sub receiver relays should remain set during transmit
UseMainFreqOptionalBooleanTrue if the subreceive r antenna selection should be based on the main radio frequency
AltReceiverOptionalNumberRadio number of alterna te receiver
InterruptOptionalBooleanTrue if interrupt mode, False if wait mode
InterruptModeDelayOptionalNumberInterrupt mode d elay
AlwaysOptionalListInhibit this station when one of these stations transmits
SameBandOptionalListInhibit this station when on e of these stations transmit within the frequency range of the receive antenna
PartnerOptionalListThese stations are partners f or shared transmit. Only one partner is allowed.
InhibitBussOptionalListInhibit buss numbers. Al l radios with the same bus number will inhibit each other.
AlternateOptionalListAlternate antennas to use f or receive if another station is within the frequency range of the receive antenna
AltActiveOptionalListStations which will cause this radio to use an alternate antenna when they transmit.
OutOfBandOptionalBooleanTrue if inhibit this station if there is no transmit antenna available which includes the transmit frequency
InhibitOnlyOnTransmitOptionalBooleanTrue if the inhibit output should be active only if the radio is transmitting
SwitchesRequiredListSwitches and switch ports
RelaysOptionalListFrequencies and relays

This describes the Switches list:

NameRequired/OptionalTypeMeaning
SwitchOptionalNumberSwitch number
PortRequiredNumberPort number (1-6) on switch Each radio has an amplifier keying line and possibly an inhibit line which are connected to one or more MOAS II switches. If there is more than one MOAS II switch the Switch number indicates which switch. It is not needed if there is only one switch. The Port number indicates which of the six amplifier keying and inhibit lines on the switch are connected to this radio.

This describes the Alternate list:

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency
UpperFrequencyOptionalNumberUpper frequency
ThisAntennasOptionalNumber ListAntennas this station might use for receive
OtherAntennasOptionalNumber ListAntennas other s tations might use for transmit
AntennaOptionalNumberAlternate antenna to use

This describes the Always and SameBand lists:

NameRequired/OptionalTypeMeaning
StationRequiredNumberStation number
RadioRequiredNumberRadio number

This describes the relays which will be set on transmit, reset on transmit, or set on transmit and reset at end of transmit.

NameRequired/OptionalTypeMeaning
LowerFrequencyOptionalNumberLower frequency
UpperFrequencyOptionalNumberUpper frequency
ExtraOptionalNumber ListRelays to be set during transmit
SetOptionalNumber ListRelays to be set when a st ation starts transmitting
ResetOptionalNumber ListRelays to be reset when a station starts transmitting

These are two radios connected in an SO2R configuration:

"Radios" : [
{
"Station" : 1,
"Radio" : 1,
"Interrupt" : false,
"Always" : [
{
"Station" : 1,
"Radio" : 2
}
],
"OutOfBand" : true,
"Switches" : [
{
"Port" : 1
}
]
},
{
"Station" : 1,
"Radio" : 2,
"Interrupt" : false,
"Always" : [
{
"Station" : 1,
"Radio" : 1
}
],
"OutOfBand" : true,
"Switches" : [
{
"Port" : 2
}
]
}
]

The switches list describes the MOAS II switches. It is a list of groups. Each group describes one switch. Each switch must have a unique ID number. Switch ID numbers must be in the range 1-99.

The number of the switch is used in determining which relay numbers it controls. Switch 1 controls relays 0-63. Switch 2 controls relays 100-163, etc.

NameRequired/OptionalTypeMeaning
IDRequiredNumberSwitch number
TypeOptionalStringType of switch
TransportOptionalStringCommunications transport
PortOptionalStringSerial communications port information
AddressOptionalStringIP Address in dot form
PortOptionalNumberTCP/IP port
EchoOptionalNumberNumber switch will send
InhibitTimeOptionalNumberSlow transition millise conds
InterruptModeDelayOptionalNumberInterrupt mode d elay
IndicateTROptionalBooleanSwitch will send transmit and receive notifications to the MOAS server. The type, if provided, must be “MOAS II”. The transport, if provided must be “Serial” or “TCP”. Serial is the default. If Serial is used then Port is required. If TCP is used then Address and TCPPort are required. Port is the OS-specific information needed to communicate with the switch. Echo is the number the switch will send when queried. If it is not set the switch query will be ignored.
"Switches" : [
{
"ID" : 1,
"Port" : "COM8"
}
]

The miscellaneous information is not a list. It is items within the main group.

The TCP port is the port clients use to talk to the server. There is no reason to set it unless the default conflicts with another program. The default port number is 12059.

NameRequired/OptionalTypeMeaning
TCPPortOptionalNumberTCP/IP port
UDPPortOptionalNumberUDP port for N1MM Logger
ProtectSameBandOptionalBooleanTrue if second station on a band should have no antenna
StartMOASRotatorOptionalBooleanTrue if the MOAS rotator program should be started if there are any rotators which need it.