Data Exchange with the EdgeTX Model Setup

An EdgeTX model has several data components that can be exchanged with Lua scripts. This section gives an overview.

In general terms, there are two different types of data that can be exchanged with EdgeTX:

  • Values, which generally fall on a scale between -1024 and 1024, also sometimes reported as -100% to 100%, e.g. for mixer values and channel outputs.

  • Switches, which are either true or false.

A specific data source type, e.g. Global Variables, can be indexed directly with an index that starts with 0 for the first one. This can be a little confusing, as e.g. GV1 for FM0 is read with model.getGlobalVariable(0, 0), because GV1 is the first global variable, and FM0 is the first flight mode. But as long as you remember that all direct indices start with 0 for the first one, you should be fine!

Global Variables is a value data source that can return a value between -1024 and 1024. Examples of value sources are:

  • Global Variables

  • Sticks, sliders and knobs

  • Trim values

  • Input lines

  • Channel outputs

  • Trainer channel inputs

  • Telemetry sensors

There is a way to access a value of any such type with a meta-index. You use the function getFieldInfo(name) where name can be any of the valid source names listed here. It returns a table with a description of the value source, including the field id, which is the meta-index.

You can use id with the function getValue(id) to read the current value. You can also use name directly, but this is less efficient, as EdgeTX does a linear search for the name every time it is called. Therefore, the procedure of first extracting the meta-index from getFieldInfo(name).id, and then using that, is recommended.

For switches, getLogicalSwitchValue(index) uses a direct index to read this specific type of switch sources, again using the index 0 for LS1 etc. But there are also several types of switch sources, such as:

  • Logical switches

  • Switch positions, testing if a physical switch is in a particular position, e.g. SA↑.

  • Trim buttons

  • Transmitter and telemetry activity

You can find the meta-index of a particular switch source with getSwitchIndex(name), where name is exactly the name that you see in the radio menus where you can select a switch source.

You can read the current value of a switch source with getSwitchValue(index) as a true/false value.

It can be very confusing that some source can be read both as a value and as a switch. As an example, elevator trim can be read as the current value of the trim:

local id = getFieldInfo("trim-ele")
local eleTrim = getValue(id)

Or it can be read as the current value of the trim button position:

local idUp = getSwitchIndex(CHAR_TRIM .. "Eu")
local idDown = getSwitchIndex(CHAR_TRIM .. "Ed")
local eleUp = getSwitchValue(idUp)
local eleDown = getSwitchValue(idDown)

These are really two different things, as the elevator trim is an internal value stored by the radio, which is changed with the trim button, and the button is a physical button.

But it can also be a more direct comparison, e.g. the 3-position switch B, which can be read as a value source with:

local idB = getFieldInfo("sb")
local swBvalue = getValue(idB) -- a value of -1024, 0 or 1024

Or the current position of switch B can be read with:

local idBup = getSwitchIndex("SB" .. CHAR_UP)
local idBdown = getSwitchIndex("SB" .. CHAR_DOWN)
local swBup = getSwitchValue(idBup)
local swBdown = getSwitchValue(idBdown)

Hopefully, these examples illustrated the differences between values and switches, and showed how these can be retrieved in a Lua script.

You can also send data the other way: from Lua to the EdgeTX model setup.

To send a value, use a global variable: model.setGlobalVariable(index, fm, value). If you use the default GV setting, where all other flight modes use the value of FM0, then you can use 0 for fm.

To send a switch, setup a STICKY type logical switch, and then use setStickySwitch(index, true/false). Notice that a blank sticky switch STICKY(---, ---) is ON when the model is first loaded. If you want a sticky switch to be OFF by default then use the value of the switch itself as V1, i.e. L01 = STICKY(L01, ---) will be off by default.

The following table gives an overview of the Lua API functions that can be used to exchange data with the EdgeTX model setup.

Function
Description

getFieldInfo(name)

Gets the meta-index of a value source with name.

getValue(index)

Gets the current value of a source, where index is from the above.

getFlightMode()

Returns the current flight mode number and name. Do not confuse with model.getFlightMode, which is a completely different function!

model.getGlobalVariable( index, fm)

Read the value of a global variable between -1024 and 1024. You can use the above to get the current flioght mode for fm, or you can setup the GV to always use the value from FM0.

model.setGlobalVariable( index, fm, value)

Sets the value of a global variable.

setTelemetryValue(id, subID, instance, value, ...)

This function can send data from Lua to a telemetry sensor. If it is running, then the sensor will show up with Discover Sensors. This can be used to log values generated by Lua.

getLogicalSwitchValue( index)

Get the value of a logical switch.

setStickySwitch(id, value)

Set the value of a STICKY type logical switch.

getSwitchIndex(name)

Get the meta-index of a switch source with name.

getSwitchName(index)

Get the name of a switch source.

getSwitchValue(index)

Get the value of a switch source.

getPhysicalSwitches()

Get a list of physical switches on the radio. Can be used to make a selection list.

getShmVar(index)

Get the value of a shared memory variable. These are little "mail boxes" provided as a way to send data between Lua widgets and other Lua scripts like Mixer and Function scripts.

setShmVar(index, value)

Set the value of a shared memory variable.

model.setTimer(timer, value)

Set the timer to value.

model.getTimer(timer)

Read the timer.

Last updated