# API Reference - QUERY
All QUERY are listed below. Additionally, numbers, strings, null and arrays (pass-through) are valid as a query.
# text
text along with params can be used to build up any string. {N} is used as a replacement token in the string. N starts at 0 and increments, and it matches the elements in params.
Examples:
{"text":"object_name_{0}", "params":[ 99 ]}
{"text":"object_name_{0}", "params":[ {"var":["L:TEST","number"]} ]}
The result is a string which may be sent to another API, with a value like object_name_99.
Format specifiers:
{0}
{0:TIME}
{0:DMS}
{0:LOCATION}
# var
var is the primary way to read an L:Var or A:var from the simulator. A list of variables is Available here (opens new window)
All L:Vars will use the unit number.
Examples:
{"var": ["L:MY_SIM_VAR_HERE", "number"]}
{"var": ["A:PLANE ALTITUDE", "feet"]}
# object/var
Read a property on a mission object.
| Property | Function |
|---|---|
| $INDEX | Correlate a mission object name to L:MISSION OBJECT ... vars |
| VAR 1 | Generic data slot 1 |
| VAR 2 | Generic data slot 2 |
| VAR 3 | Generic data slot 3 |
| MODE | Object mode |
| HEIGHT | Radio Altitude in feet (readonly) |
| ALT | Altitude in feet |
| AALT | Actual altitude in feet (readonly) |
| AHDG | Actual heading in feet (readonly) |
| CREATED | 1: created, 0: not created, -1: failed creation (readonly) |
| COUPLED | Special obejct mode. See table below |
| VELOCITY X | Body Velocity X (meters per second) |
| VELOCITY Y | Body Velocity Y (meters per second) |
| VELOCITY Z | Body Velocity Z (meters per second) |
| WP INDEX | Waypoint navigation 0: inactive, >0: represents active waypoint index. |
| distance | calculate distance to object |
| distance:ft | calculate distance to object (unit converter) |
Generic data slots have a meaning only to the specific object (such as setting an animation state, a common use for VAR 1).
These values are applicable to the MODE var:
| Object Mode | Function |
|---|---|
| 0 | Default mode. You may set VELOCITY Z |
| 1 | Repositioning mode. You may set LAT, LON and HDG |
| 2 | 3-axis velocity |
| 3 | Default MSFS physics |
| 4 | Same as 1 but pitch inverted 180 degrees |
| 5 | Stop when radio height is under 10ft |
| 6 | Flight object repositioning. Set ALT and HDG |
These values are applicable to the COUPLED var:
| Object Mode | Function |
|---|---|
| 0 | Default mode. |
| 1 | Coupled to hoist station |
| 2 | Coupled to sling station |
| 3 | Available to be coupled to sling station |
| 4 | Firefighting target VAR 1: quantity of fire |
| 5 | Firefighting water source VAR 1: radius in meters, VAR 2: height in feet |
distance:ft (unit converter) is also supported
Examples:
{"object": "my_object", "var": "VELOCITY Z"}
{"object": "my_object", "var": "$INDEX"}
{"object": "my_object", "var": "distance"}
# location/var
You can get 3 things from a LOCATIONREF: distance in nautical miles, latitude and longitude.
distance:ft (unit converter) is also supported
Examples:
{"location": LOCATIONREF, "var":"distance"}
{"location": LOCATIONREF, "var":"lat"}
{"location": LOCATIONREF, "var":"lon"}
# bearing
bearing calculates the true heading between two LOCATIONREF.
Examples:
{"bearing": {"to":LOCATIONREF, "from":LOCATIONREF}}
# has_location
has_location will return 1 or 0 based on whether the location name exists already.
Examples:
{"has_location": QUERY}
{"has_location": "my_location_name"}
# resolve_location
resolve_location will return [lat, lon] from a LOCATIONREF.
Examples:
{"resolve_location": QUERY}
{"resolve_location": "my_location_name"}
# has_object
has_object will return 1 or 0 based on whether the object name exists already.
Examples:
{"has_object": QUERY}
{"has_object": "my_object_name"}
# has_user_action
has_user_action returns 1 or 0 depending on whether the user_action is currently active.
Examples:
{"has_user_action": QUERY}
{"has_user_action": "my_user_action_name"}
# has_mission
has_mission will return 1 or 0 based on whether the mission id exists in the index.
Examples:
{"has_mission": QUERY}
{"has_mission": "my_mission_id_"}
# has_macro
has_macro returns a boolean value indication whether the macro name exists or not.
Examples:
{"has_macro": QUERY}
{"has_macro": "my_macro"}
# no_resolve
no_resolve will just return the un-interpreted data.
Examples:
{"no_resolve": {"arbitrary_data_here":"my_data"}}
# resolve_icon
resolve_icon will look up an entry in the icons table.
Examples:
{"resolve_icon": "my_icon_name"}
# static
static enables getting keys under the data section of the mission (static data).
Examples:
"data": {
"my_static_key": 99
}
{"static": "my_static_key"}
# has_static
has_static returns a boolean value indicating if the key exists on the mission data section.
Examples:
{"has_static":"my_static_key"}
# has_global
has_mission will return 1 or 0 based on whether the global name is defined.
Examples:
{"has_global": QUERY}
{"has_global": "my_global_name"}
# global
global enables query of a global variable by name.
Examples:
{"global": QUERY}
{"global": "my_global_name"}
# has_route
has_route will return a boolean value indicating if the specified route exists.
Examples:
{"has_route": QUERY}
{"has_route": "my_route_name"}
# route
route will return the route information for a given route name.
Examples:
{"route": QUERY}
{"route": "my_route_name"}
# create_array
create_array makes a new array of the specified size. Arrays grow automatically so 0 is fine.
Examples:
{"create_array": QUERY}
{"create_array": 10}
# create_struct
create_struct will create a complex object and each key will be evaluated as a QUERY
Examples:
{"create_struct": {
"key1":QUERY,
"key2":QUERY
}}
# struct
struct is used to access a complex object.
path: access a property.has_path: 1 or 0 based on whether the property exists.function: call a functionindex:access an array element
Examples:
{"struct": ...., "path": "length"}
{"struct": {"js:get":"JSON"}, "function": "stringify", "params": [ {"local": "my_local"}, null, 2]}
{"struct": ...., "index": 0}
# js:get
js:get retrieves an object from the window. Examples are Math or JSON.
Examples:
{"js:get": "Math"}
# js:create_async_function
js:create_async_function creates a JS async function which calls a COMMANDLIST with $args defined as a param.
Examples:
{"js:create_async_function": [
{"set_message":{"text":"js called:{0}", "params": [
{"struct": {"param": "$args"}, "index": 0}
]}}
]}
# js:function
js:function creates a JS function which calls a QUERY with $args defined as a param. Since it is a QUERY, you may return a value synchronously as well.
Examples:
{"js:create_callback": [
{"set_message":{"text":"js called:{0}", "params": [
{"struct": {"param": "$args"}, "index": 0}
]}}
]}
# js:new
js:new calls the constructor on an object, providing params if defined.
Examples:
{"js:new": "my_window_object", "params":[QUERY, QUERY, QUERY]}
# json:stringify
json:stringify will transform an object into a JSON string.
Examples:
{"json:stringify": {"param":"$RET"}}
# json:parse
json:parse will transform JSON string into an object.
Examples:
{"json:parse": {"param":"$RET"}}
# json:copy
json:copy will create a deep copy of the object. Changes to the new object will not impact the input object.
Examples:
{"json:copy": {"param":"$RET"}}
# object:keys
object:keys will return an array containing the key names in the target object.
Examples:
{"object:keys": {"param":"$RET"}}
# string:split
string:split will create an array from the parts of string, specified by the delimiter.
index: Optional. This will return only one index in the array, instead of all parts of the array. This is handy if you only want one part of the split string anyway.
Examples:
{"string:split": {"struct": {"js:new": "Date"}, "function": "toISOString"}, "delimiter":"T", "index": 1}
# string:join
string:join will create a string by appending each item in the input array, along with a delimiter.
Examples:
{"string:join": ["one","two","three"], "delimiter":"_"}
# create_number
create_number will use the js Number() to convert a string to a number value.
Examples:
{"create_number":QUERY}
{"create_number":"99.5"}
# has_local
has_local will return 1 or 0 based on whether the key exists in the locals.
Examples:
{"has_local": "my_local_name"}
# local
local will retreive a local variable by name.
Examples:
{"local": "my_local_name"}
{"local": "my_local_name", "path": "key"}
# gamevar
gamevar works like var but lets you query SimVar.GetGameVarValue in MSFS.
Examples:
{"gamevar": ["my_game_var", "my_unit"]}
# table
table lets you read a key from a named table. (Table must be open first)
Examples:
{"table": "my_table", "key": "my_key"}
# param
param lets you read a parameter from the params collection. There is a params collection for each macro and one for the main thread. create_thread's take the same params as the calling context.
Examples:
{"param": "my_param"}
{"param": "my_param", "path": "my_key"}
# has_param
has_param tells you whether 1 or 0 for whether or not the parameter key exists.
Example:
{"has_param": "my_param"}
# rand
rand will create a random decimal value between QUERY (minimum) and QUERY2 (maximum) bounds.
Examples:
{"rand":[QUERY1, QUERY2]}
{"rand":[0, 60]}
# add
add will add a list of queries (2 or more).
Examples:
{"add":[QUERY1, QUERY2, ...]}
{"add":[2,2]}
{"add":[{"var":["L:TEST","number]}, 1]}
# add360
add360 is like add but the final result is normalized between 0 and 360.
Examples:
{"add360":[QUERY1, QUERY2, ...]}
{"add360":[{"var":["L:TEST","number]}, 90]}
# compare360
compare360 will provide absolute value between two values 0-360.
Examples:
{"compare360":[1, 359]} // -> 2
# subtract
subtract subtracts QUERY1 - QUERY2.
Examples:
{"subtract":[QUERY1, QUERY2]}
# multiply
multiply multiplies QUERY1 * QUERY2.
Examples:
{"multiply":[QUERY1, QUERY2]}
# divide
divide divides QUERY1 / QUERY2. if QUERY2 is zero, the result is 0.
Examples:
{"divide":[QUERY1, QUERY2]}
# right_shift
right_shift is the right bit shift operator >>.
QUERY >> QUERY2
Examples:
{"right_shift": [QUERY1, QUERY2]}
{"right_shift": [0xFFFF, 2]}
# left_shift
left_shift is the left bit shift operator <<.
QUERY << QUERY2
Examples:
{"left_shift": [QUERY1, QUERY2]}
{"left_shift": [0xFFFF, 2]}
# xor
xor is the exclusive-or operator.
Examples:
{"xor": [QUERY1, QUERY2]}
# remainder
remainder is the mod or remainder operator.
Examples:
{"remainder": [QUERY1, QUERY2]}
# exponent
exponent is power operator.
Examples:
{"exponent": [QUERY1, QUERY2]}
# round
round will round a number to the nearest integer (whole number) value.
Examples:
{"round":QUERY}
{"round": 3.5}
# tofixed
tofixed is like round, but lets you configure the number of digits to round to. digits=2 would result in numbers like 0.00
Examples:
{"tofixed":QUERY, "digits": QUERY}
{"tofixed":3.141592, "digits": 2}
# floor
floor returns the closest previous whole number.
Examples:
{"floor":QUERY}
{"floor":2.5}
# ceil
ceil (ceiling) returns the closest next whole number.
Examples:
{"ceil":QUERY}
{"ceil":2.5}
# abs
abs returns the absolute value of a number (removing negative sign).
Examples:
{"abs":QUERY}
{"abs": -300}
# Math. ... functions
These Math functions are also available:
Math.sign
Math.log
Math.log2
Math.log10
Math.sin
Math.sinh
Math.asinh
Math.cos
Math.cosh
Math.acosh
Math.atan
Math.atanh
Math.atan2
Examples:
{"Math.sign": -100}
{"Math.atan2": [QUERY, QUERY]}
# clamp
clamp will return a number which is between the range of QUERY_MIN to QUERY_MAX. If QUERY_VAL is between the min and max, it will be returned directly.
Examples:
{"clamp":[QUERY_VAL, QUERY_MIN, QUERY_MAX]}
{"clamp":[5.5, 0, 100]}
# scale
scale is transforms a value in range A to range B.
Examples:
{"scale":[QUERY_A_VAL, QUERY_A_MIN, QUERY_A_MAX, QUERY_B_MIN, QUERY_B_MAX]}
{"scale":[0.05, 0, 1, 0, 100]}
# require
require returns 1 or 0 depending on whether the QUERY1 op QUERY2 condition is true or false.
Examples:
{"require": QUERY1, "eq": QUERY2}
{"require": {"var":["L:TEST","number"]}, "eq", 0}
# and
and is the logical AND operator.
and returns 1 if each of the queries are 1. If any query isn't 1, the overall result is 0.
Examples:
{"and":[
{"require": QUERY, "eq": QUERY},
...
]}
# or
or is the logical OR operator.
or will return 1 if any of the queries return 1. It will also short-circuit, in that further queries will not be checked if any subsequent query returns 1.
Examples:
{"or":[
{"require": QUERY, "eq": QUERY},
...
]}
# not
not is the logical NOT operator.
not will invert (1 to 0 and 0 to 1) any query.
Examples:
{"not":QUERY}
# typeof
typeof returns a string which describes the type of input it was given.
| Type | Type Name |
|---|---|
| structs | "object" |
| null | "object" |
| arrays | "array" |
| strings | "string" |
| numbers | "number" |
| undefined | "undefined" |
# isNaN
isNaN indicates whether a number is NaN or not.
Examples:
{"isNaN": QUERY}
# parseInt
parseInt converts a string to an integer
Examples:
{"parseInt": QUERY}
# parseFloat
parseFloat converts a string to an decimal value.
Examples:
{"parseFloat": QUERY}
# if
if works as a QUERY or a COMMAND. The syntax is the same, except COMMANDLIST is a QUERY.
Examples:
{"if": QUERY, "then": QUERY, "else": QUERY}
{"if": QUERY, "then": QUERY}
# switch
switch works as a QUERY as well as a COMMAND. COMMANDLISTs are instead a QUERY in this form.
Examples:
{"switch": QUERY, "case":{
"0": QUERY,
"1": QUERY,
"2": QUERY,
"3": QUERY,
"default": QUERY
}}
# convert
convert will do unit conversion.
Examples:
{"convert": QUERY, "from":"from_unit", "to":"to_unit"}
{"convert": QUERY, "from":"miles", "to":"meters"}
{"convert": QUERY, "from":"kg", "to":"lb"}
You can convert between these units:
| Weight Unit | Monikers |
|---|---|
| Kilogram | kilogram, kg, kilo |
| Pound | pound, lb |
| Length Unit | Monikers |
|---|---|
| Feet | feet, foot, ft |
| Meter | meter, m |
| Mile | mile, mi |
| Nautical Mile | nauticalmile, nm, nmi |
# fn.HOIST_SEND_TO_GROUND
HOIST_SEND_TO_GROUND will conditionally deploy and stow the hoist based on proximity to the target.
Examples:
{"HOIST_SEND_TO_GROUND", "params": {
"target": LOCATIONREF,
"after_deploy_commands": [
... commands after deploying the hoist
],
"before_stow_commands": [
... commands before stow
]
}}
# fn.HOIST_REEL_UP_AND_STOW
HOIST_REEL_UP_AND_STOW will wait for the hoist to be reeled up, and run the commands once when it happens:
before_stow_commands will run once when the hoist is stowing.
Examples:
{"fn":"HOIST_REEL_UP_AND_STOW", "params": {
"before_stow_commands": [
.. commands here to run before stow (to swap the objects)
]
}}
# fn.HOIST_REEL_UP
HOIST_REEL_UP will return true when the hoist is up and stowed, and false until that happens.
Examples:
{"fn":"HOIST_REEL_UP"}
# fn.hoist_get_reel_distance:ft
Gets the distance which the cable is extended.
Examples:
{"fn":"hoist_get_reel_distance:ft"}
{"fn":"hoist_get_reel_distance:m"}
# fn.hoist_get_distance_from_ground:ft
Gets the distance from the hoist object to the ground.
Examples:
{"fn":"hoist_get_distance_from_ground:ft"}
{"fn":"hoist_get_distance_from_ground:m"}
# fn.score_bambi_dump
score_bambi_dump will return a score value, which is calculated from all of the objects which were created with COUPLED=4. The total score is the summation of VAR 2 from each of those objects.
Examples:
{"fn":"score_bambi_dump"}
# fn.all_fires_extinguished
all_fires_extinguished indicates if there are any objects with COUPLED=4 that are alive. Returns 1 if any fire is active.
Examples:
{"fn":"all_fires_extinguished"}
# fn.has_remote_notify
Returns 1 or 0 based on whether the mission is running from a server.
Examples:
{"fn":"has_remote_notify"}
# fn.is_voice_server_connected
fn:is_voice_server_connected indicates whether or not the voice server is currently connected.
Examples:
{"fn": "is_voice_server_connected"}
# fn.create_guid
fn:create_guid will generate a globally unique identifier string.
Examples:
{"fn": "create_guid"}
# fn.create_date
create_date will create a JS Date object.
Examples:
{"set_message":{"text":"{0}", "params":[ {"fn":"create_date"} ]}},
# fn.get_time_string
get_time_string will get a 24-hour UTC timestamp like 07:05:57
Examples:
{"set_message":{"text":"{0}", "params":[
{"fn":"get_time_string"}
]}},
# fn.get_mission_objects
get_mission_objects will get the active mission objects (for enumeration).
Examples:
{"set_message":{"text":"{0}", "params":[
{"json:stringify": {"fn":"get_mission_objects"}}
]}},
# fn.get_aircraft_moniker
fn.get_aircraft_moniker will get a string identifier for the aircraft, like H145 or H160.
Examples:
{"#comment":"copy either H145 or H160 into a string local named HXX"},
{"set":{"local":"HXX"},"value":{"fn":"get_aircraft_moniker"}},
{"#comment":"fire an event where the name is either H145 or H160 but otherwise is the same..."},
{"trigger":"H:{local:HXX}_SDK_DO_RANDOM_THING"},
{"#comment":"just show a message, but note that you can now use {local:HXX} in any string across the mission"},
{"set_message":"hello from {local:HXX}"},
# fn.is_any_sling_object_coupled
fn.is_any_sling_object_coupled returns a boolean value indicating whether an object is coupled right now.
# fn.get_sling_object_type
fn.get_sling_object_type returns a value from 1 to 10 indicating the type of sling object currently coupled.
# fn.get_mission_icons
fn.get_mission_icons gets the entire icons table.
# fn.create_multiplayer_connection
fn.create_multiplayer_connection creates an MPClient multiplayer connection.