From bd1a3d4dc0811d4c0d62dc12c224a1d441ad164f Mon Sep 17 00:00:00 2001 From: "Ritesh.K" Date: Mon, 17 Aug 2026 11:42:53 +0200 Subject: [PATCH 01/12] feat(node-fmu): Add new FMU node-type Signed-off-by: Ritesh.K --- CMakeLists.txt | 3 + cmake/FindFMI.cmake | 26 ++ .../components/schemas/config/node_obj.yaml | 1 + .../components/schemas/config/nodes/_fmu.yaml | 7 + .../components/schemas/config/nodes/fmu.yaml | 71 ++++ etc/examples/nodes/fmu.conf | 27 ++ include/villas/nodes/fmu.hpp | 83 ++++ lib/nodes/CMakeLists.txt | 6 + lib/nodes/fmu.cpp | 372 ++++++++++++++++++ packaging/deps.sh | 15 + tests/integration/Dahlquist.fmu | Bin 0 -> 232037 bytes tests/integration/node-fmu.sh | 84 ++++ 12 files changed, 695 insertions(+) create mode 100644 cmake/FindFMI.cmake create mode 100644 doc/openapi/components/schemas/config/nodes/_fmu.yaml create mode 100644 doc/openapi/components/schemas/config/nodes/fmu.yaml create mode 100644 etc/examples/nodes/fmu.conf create mode 100644 include/villas/nodes/fmu.hpp create mode 100644 lib/nodes/fmu.cpp create mode 100644 tests/integration/Dahlquist.fmu create mode 100755 tests/integration/node-fmu.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 69f9e307c..0e201fa0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,7 @@ find_package(Criterion) find_package(OpalOrchestra) find_package(LibXml2) find_package(OpalAsyncApi) +find_package(FMI) # Check for tools find_program(PROTOBUFC_COMPILER NAMES protoc-c) @@ -199,6 +200,7 @@ cmake_dependent_option(WITH_NODE_ETHERCAT "Build with ethercat node-type" cmake_dependent_option(WITH_NODE_EXAMPLE "Build with example node-type" "${WITH_DEFAULTS}" "" OFF) cmake_dependent_option(WITH_NODE_EXEC "Build with exec node-type" "${WITH_DEFAULTS}" "" OFF) cmake_dependent_option(WITH_NODE_FILE "Build with file node-type" "${WITH_DEFAULTS}" "" OFF) +cmake_dependent_option(WITH_NODE_FMU "Build with fmu node-type" "${WITH_DEFAULTS}" "FMI_FOUND" OFF) cmake_dependent_option(WITH_NODE_FPGA "Build with fpga node-type" "${WITH_DEFAULTS}" "WITH_FPGA" OFF) cmake_dependent_option(WITH_NODE_IEC60870 "Build with iec60870 node-types" "${WITH_DEFAULTS}" "LIB60870_FOUND; NOT WITHOUT_GPL" OFF) cmake_dependent_option(WITH_NODE_IEC61850 "Build with iec61850 node-types" "${WITH_DEFAULTS}" "LIBIEC61850_FOUND; NOT WITHOUT_GPL" OFF) @@ -309,6 +311,7 @@ add_feature_info(NODE_ETHERCAT WITH_NODE_ETHERCAT "Build with add_feature_info(NODE_EXAMPLE WITH_NODE_EXAMPLE "Build with example node-type") add_feature_info(NODE_EXEC WITH_NODE_EXEC "Build with exec node-type") add_feature_info(NODE_FILE WITH_NODE_FILE "Build with file node-type") +add_feature_info(NODE_FMU WITH_NODE_FMU "Build with fmu node-type") add_feature_info(NODE_FPGA WITH_NODE_FPGA "Build with fpga node-type") add_feature_info(NODE_IEC60870 WITH_NODE_IEC60870 "Build with iec60870 node-types") add_feature_info(NODE_IEC61850 WITH_NODE_IEC61850 "Build with iec61850 node-types") diff --git a/cmake/FindFMI.cmake b/cmake/FindFMI.cmake new file mode 100644 index 000000000..b242d6b40 --- /dev/null +++ b/cmake/FindFMI.cmake @@ -0,0 +1,26 @@ +# CMakeLists.txt. +# +# Author: Ritesh Karki +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 + +find_path(FMI_INCLUDE_DIR + NAMES fmilib.h +) + +find_library(FMI_LIBRARY fmilib + PATHS /usr/local/lib /usr/local/lib64 +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(FMI DEFAULT_MSG FMI_LIBRARY FMI_INCLUDE_DIR) + +mark_as_advanced(FMI_INCLUDE_DIR FMI_LIBRARY) + +if(FMI_FOUND) + add_library(FMI SHARED IMPORTED) + set_target_properties(FMI PROPERTIES + IMPORTED_LOCATION "${FMI_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${FMI_INCLUDE_DIR}" + ) +endif() diff --git a/doc/openapi/components/schemas/config/node_obj.yaml b/doc/openapi/components/schemas/config/node_obj.yaml index c3e796171..afebd1e32 100644 --- a/doc/openapi/components/schemas/config/node_obj.yaml +++ b/doc/openapi/components/schemas/config/node_obj.yaml @@ -27,6 +27,7 @@ discriminator: example: nodes/_example.yaml exec: nodes/_exec.yaml file: nodes/_file.yaml + fmu: nodes/_fmu.yaml fpga: nodes/_fpga.yaml iec60870-5-104: nodes/_iec60870-5-104.yaml iec61850-8-1: nodes/_iec61850-8-1.yaml diff --git a/doc/openapi/components/schemas/config/nodes/_fmu.yaml b/doc/openapi/components/schemas/config/nodes/_fmu.yaml new file mode 100644 index 000000000..4618c468e --- /dev/null +++ b/doc/openapi/components/schemas/config/nodes/_fmu.yaml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=http://json-schema.org/draft-07/schema +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 +--- +allOf: +- $ref: ../node_obj.yaml +- $ref: file.yaml diff --git a/doc/openapi/components/schemas/config/nodes/fmu.yaml b/doc/openapi/components/schemas/config/nodes/fmu.yaml new file mode 100644 index 000000000..fa9b7c8c1 --- /dev/null +++ b/doc/openapi/components/schemas/config/nodes/fmu.yaml @@ -0,0 +1,71 @@ +# yaml-language-server: $schema=http://json-schema.org/draft-07/schema +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 +--- +allOf: +- type: object + properties: + fmu_path: + format: uri + description: | + Specifies the URI to a FMU model + + fmu_unpack_path: + format: uri + description: | + Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model). + + fmu_write_first: + type: boolean + description: | + Specifies whether the model has to be writtem with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead. + + start_time: + type: number + description: | + Specifies the start time for the simulation. Value has to be at least one `step_size` lesser than `stop_time`. + + stop_time: + type: number + description: | + Specifies the stop time for the simulation. The number of steps is calculated then by the difference between `start_time` and `stop_time` divided by the `step_size`. + + step_size: + type: number + description: | + Specifies the step size for the simulation. Special care has to be taken to ensure that the value is equal to the value mantioned in modelDescription.xml. + + in: + type: object + properties: + signals: + type: array + description: | + The input signals for the model have to be mentioned here as elements of an array while specifying the name (should be the same as that found in the modelDescription file) and the datatype. + + **Example**: + + ``` + signals = ( + {name = "In1", type = "float"}, + {name = "In2", type = "int"} + ) + ``` + out: + type: object + properties: + signals: + type: array + description: | + The output signals for the model have to be mentioned here as elements of an array while specifying the name (should be the same as that found in the modelDescription file) and the datatype. + + **Example**: + + ``` + signals = ( + {name = "Out1", type = "float"} + ) + ``` + +- $ref: ../node_signals.yaml +- $ref: ../node.yaml diff --git a/etc/examples/nodes/fmu.conf b/etc/examples/nodes/fmu.conf new file mode 100644 index 000000000..98e75d921 --- /dev/null +++ b/etc/examples/nodes/fmu.conf @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 + +nodes = { + fmu_node = { + type = "fmu" + # Path to FMU file (.fmu) + fmu_path = "/workspaces/node/fmu_temp/asine.fmu" + fmu_unpack_path = "/workspaces/node/fmu_temp/fmu_asine" + fmu_write_first = true + stop_time = 10.0 + start_time = 0.0 + step_size = 0.2 + + in = { + signals = ( + { name = "in1", type = "float" } + ) + } + + out = { + signals = ( + { name = "out1", type = "float" }, + ) + } + } +} diff --git a/include/villas/nodes/fmu.hpp b/include/villas/nodes/fmu.hpp new file mode 100644 index 000000000..d84acd453 --- /dev/null +++ b/include/villas/nodes/fmu.hpp @@ -0,0 +1,83 @@ +/* Node type: Functional Mock-up Unit. + * + * Author: Ritesh Karki , Jitpanu Maneeratpongsuk + * SPDX-FileCopyrightText: 2026 Institute for Automation of Complex Power Systems, RWTH Aachen University + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#include +#include + +#include + +#include +#include + +namespace villas { +namespace node { + +// Forward declarations +struct Sample; + +struct FmuSignal { + unsigned int ref = 0; + fmi3_base_type_enu_t type = fmi3_base_type_enu_t::fmi3_base_type_float64; + std::string name; +}; + +class FmuNode : public Node { + +protected: + int parse(json_t *json) override; + + int _read(struct Sample *smps[], unsigned cnt) override; + int _write(struct Sample *smps[], unsigned cnt) override; + + bool writing_turn = true; + const char *path; + const char *unpackPath; + + std::timespec ts; + pthread_mutex_t mutex; + pthread_cond_t cv; + + fmi3_import_t *fmu; + jm_callbacks callbacks; + fmi_import_context_t *context; + +public: + FmuNode(const uuid_t &id = {}, const std::string &name = ""); + + std::vector fmuSignalIn; + std::vector fmuSignalOut; + + int prepare() override; + + int check() override; + + int start() override; + + int stop() override; + + static void loggerCallback(jm_callbacks *c, jm_string module, + jm_log_level_enu_t log_level, jm_string message); + +private: + void parseSignal(json_t *json, bool in); + + double currentTime = 0; + double step_size = 0.1; + double stop_time = 0; + double start_time = 0; + bool stop_time_defined = false; + double nextTime = 0.0; + + void getValueReference(const char *varName, fmi3_value_reference_t &ref, + fmi3_base_type_enu_t &type); +}; + +} // namespace node +} // namespace villas diff --git a/lib/nodes/CMakeLists.txt b/lib/nodes/CMakeLists.txt index 068ad9fba..39bc84131 100644 --- a/lib/nodes/CMakeLists.txt +++ b/lib/nodes/CMakeLists.txt @@ -202,6 +202,12 @@ if(WITH_NODE_WEBRTC) list(APPEND LIBRARIES LibDataChannel::LibDataChannel) endif() +# Enable FMU node-type support +if(WITH_NODE_FMU) + list(APPEND NODE_SRC fmu.cpp) + list(APPEND LIBRARIES FMI) +endif() + add_library(nodes STATIC ${NODE_SRC}) target_include_directories(nodes PUBLIC ${INCLUDE_DIRS}) target_link_libraries(nodes PUBLIC ${LIBRARIES}) diff --git a/lib/nodes/fmu.cpp b/lib/nodes/fmu.cpp new file mode 100644 index 000000000..c62a70139 --- /dev/null +++ b/lib/nodes/fmu.cpp @@ -0,0 +1,372 @@ +/* Node type: Functional Mock-up Unit. + * + * Author: Ritesh Karki , Jitpanu Maneeratpongsuk + * SPDX-FileCopyrightText: 2026 Institute for Automation of Complex Power Systems, RWTH Aachen University + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace villas; +using namespace villas::node; + +void FmuNode::loggerCallback(jm_callbacks *c, jm_string module, + jm_log_level_enu_t log_level, jm_string message) { + auto *self = static_cast(c->context); + if (self) { + self->logger->info("{} {}", module, message); + } +} + +FmuNode::FmuNode(const uuid_t &id, const std::string &name) + : Node(id, name), writing_turn(false), path(""), unpackPath(""), fmu(), + context() { + int ret; + ret = pthread_mutex_init(&mutex, nullptr); + if (ret) + throw RuntimeError("Failed to initialize mutex"); + ret = pthread_cond_init(&cv, nullptr); + if (ret) + throw RuntimeError("Failed to initialize conditional variable"); + + // Initialize callbacks + callbacks.malloc = malloc; + callbacks.calloc = calloc; + callbacks.realloc = realloc; + callbacks.free = free; + callbacks.logger = FmuNode::loggerCallback; + callbacks.log_level = jm_log_level_info; + callbacks.context = static_cast(this); + + // Allocate FMI context + context = fmi_import_allocate_context(&callbacks); +} + +int FmuNode::prepare() { + struct stat sb; + if (stat(unpackPath, &sb) != 0) + logger->error("The unpack path is invalid: {}, {}", strerror(errno), + unpackPath); + + fmi_version_enu_t version = + fmi_import_get_fmi_version(context, path, unpackPath); + if (version != fmi_version_enu_t::fmi_version_3_0_enu) { + throw RuntimeError("Not FMI 3.0"); + } + + fmu = fmi3_import_parse_xml(context, unpackPath, 0); + if (!fmu) { + throw RuntimeError("Failed to parse xml file"); + } + + if (fmi3_import_create_dllfmu(fmu, fmi3_fmu_kind_cs, NULL, NULL) != + jm_status_success) { + throw RuntimeError("Failed to load FMU binary"); + } + + if (fmi3_import_instantiate_co_simulation( + fmu, "instance1", unpackPath, fmi3_false, fmi3_true, fmi3_false, + fmi3_true, NULL, 0, NULL) != jm_status_success) { + throw RuntimeError("Failed to instantiate FMU"); + } + + fmi3_import_enter_initialization_mode(fmu, fmi3_false, 0.0, start_time, + stop_time_defined, stop_time); + fmi3_import_exit_initialization_mode(fmu); + + // Fetch ref and type of input and output FMU variables + for (size_t i = 0; i < fmuSignalIn.size(); i++) { + getValueReference(fmuSignalIn[i].name.data(), fmuSignalIn[i].ref, + fmuSignalIn[i].type); + } + for (size_t i = 0; i < fmuSignalOut.size(); i++) { + getValueReference(fmuSignalOut[i].name.data(), fmuSignalOut[i].ref, + fmuSignalOut[i].type); + } + + return Node::prepare(); +} + +int FmuNode::check() { + return Node::check(); +} + +int FmuNode::_read(struct Sample *smps[], unsigned cnt) { + assert(cnt == 1); + + const bool hasInputs = !fmuSignalIn.empty(); + // Lock thread + pthread_mutex_lock(&mutex); + while (hasInputs && (writing_turn || currentTime >= stop_time)) { + pthread_cond_wait(&cv, &mutex); + } + double targetTime = currentTime + step_size; + double remainingStep = step_size; + smps[0]->signals = in.signals; + + // Stop node if current time exceeds the stop time. + if (currentTime >= stop_time) { + logger->info("Reached stop time {}", stop_time); + setState(State::STOPPING); + pthread_mutex_unlock(&mutex); + return -1; + } + + while (currentTime < targetTime && currentTime < stop_time) { + bool eventHandlingNeeded = false; + bool terminateSimulation = false; + bool earlyReturn = false; + double lastSuccessfulTime = currentTime; + + // Perform step + fmi3_status_t status = fmi3_import_do_step( + fmu, currentTime, remainingStep, fmi3_true, &eventHandlingNeeded, + &terminateSimulation, &earlyReturn, &lastSuccessfulTime); + + if (status == fmi3_status_error || status == fmi3_status_fatal) + throw RuntimeError("Error during step"); + + if (terminateSimulation) { + logger->info("FMU called for simulation termination"); + currentTime = lastSuccessfulTime; + break; + } + + currentTime = lastSuccessfulTime; + logger->debug("Current time {}, step size: {}", currentTime, step_size); + + if (earlyReturn) { + logger->debug("FMU returned early at {}, target time {}", + lastSuccessfulTime, targetTime); + remainingStep = targetTime - currentTime; + } + } + + smps[0]->ts.origin = time_now(); + smps[0]->flags = (int)SampleFlags::HAS_DATA | (int)SampleFlags::HAS_TS_ORIGIN; + smps[0]->length = fmuSignalOut.size(); + double val = 0; + for (size_t i = 0; i < fmuSignalOut.size(); i++) { + switch (fmuSignalOut[i].type) { + using enum fmi3_base_type_enu_t; + case fmi3_base_type_float64: + fmi3_import_get_float64(fmu, &fmuSignalOut[i].ref, 1, &val, 1); + break; + case fmi3_base_type_float32: { + float data = 0; + fmi3_import_get_float32(fmu, &fmuSignalOut[i].ref, 1, &data, 1); + val = data; + break; + } + case fmi3_base_type_int64: { + long data = 0; + fmi3_import_get_int64(fmu, &fmuSignalOut[i].ref, 1, &data, 1); + val = data; + break; + } + case fmi3_base_type_int32: { + int data = 0; + fmi3_import_get_int32(fmu, &fmuSignalOut[i].ref, 1, &data, 1); + val = data; + break; + } + case fmi3_base_type_bool: { + bool data = false; + fmi3_import_get_boolean(fmu, &fmuSignalOut[i].ref, 1, &data, 1); + val = data; + break; + } + default: + throw RuntimeError("Unsupported data type"); + break; + } + auto sig = smps[0]->signals->getByIndex(i); + switch (sig->type) { + case villas::node::SignalType::FLOAT: + smps[0]->data[i].f = val; + break; + case villas::node::SignalType::INTEGER: + smps[0]->data[i].i = val; + break; + case villas::node::SignalType::BOOLEAN: + smps[0]->data[i].b = val; + break; + default: + break; + } + } + + // Unlock thread + if (hasInputs) { + writing_turn = true; + pthread_cond_signal(&cv); + } + + pthread_mutex_unlock(&mutex); + + return 1; +} + +int FmuNode::_write(struct Sample *smps[], unsigned cnt) { + assert(cnt == 1); + // Lock thread + if (fmuSignalOut.empty()) + return 0; + pthread_mutex_lock(&mutex); + while (!writing_turn) { + pthread_cond_wait(&cv, &mutex); + } + ts = smps[0]->ts.origin; + for (size_t i = 0; i < fmuSignalIn.size(); i++) { + auto sig = smps[0]->signals->getByIndex(i); + double val = 0; + switch (sig->type) { + case villas::node::SignalType::FLOAT: + val = smps[0]->data[i].f; + break; + case villas::node::SignalType::INTEGER: + val = smps[0]->data[i].i; + break; + case villas::node::SignalType::BOOLEAN: + val = smps[0]->data[i].b; + break; + default: + break; + } + logger->debug("Input value {}", val); + switch (fmuSignalIn[i].type) { + using enum fmi3_base_type_enu_t; + case fmi3_base_type_float64: + fmi3_import_set_float64(fmu, &fmuSignalIn[i].ref, 1, &val, 1); + break; + case fmi3_base_type_float32: { + float data = val; + fmi3_import_set_float32(fmu, &fmuSignalIn[i].ref, 1, &data, 1); + break; + } + case fmi3_base_type_int64: { + long data = floor(val); + fmi3_import_set_int64(fmu, &fmuSignalIn[i].ref, 1, &data, 1); + break; + } + case fmi3_base_type_int32: { + int data = floor(val); + fmi3_import_set_int32(fmu, &fmuSignalIn[i].ref, 1, &data, 1); + break; + } + case fmi3_base_type_bool: { + bool data = val; + fmi3_import_set_boolean(fmu, &fmuSignalIn[i].ref, 1, &data, 1); + break; + } + default: + throw RuntimeError("Unsupported data type"); + break; + } + } + + // Unlock thread + writing_turn = false; + pthread_cond_signal(&cv); + pthread_mutex_unlock(&mutex); + + return 1; +} + +void FmuNode::getValueReference(const char *varName, + fmi3_value_reference_t &ref, + fmi3_base_type_enu_t &type) { + fmi3_import_variable_t *var = fmi3_import_get_variable_by_name(fmu, varName); + if (!var) { + throw SystemError("Invalid variable name '{}'", varName); + } + type = fmi3_import_get_variable_base_type(var); + ref = fmi3_import_get_variable_vr(var); +} + +int FmuNode::parse(json_t *json) { + int ret = Node::parse(json); + if (ret) + return ret; + + json_t *json_signals_in = nullptr; + json_t *json_signals_out = nullptr; + json_error_t err; + start_time = 0; + step_size = 0.1; + stop_time = INT_MAX; + ret = json_unpack_ex( + json, &err, 0, "{s:s, s:s, s?:f, s?:f, s?:f, s?:{s:o}, s?:{s:o}}", + "fmu_path", &path, "fmu_unpack_path", &unpackPath, "stop_time", + &stop_time, "start_time", &start_time, "step_size", &step_size, "in", + "signals", &json_signals_in, "out", "signals", &json_signals_out); + if (ret) + throw ConfigError(json, err, "node-config-node-fmu"); + if (stop_time == INT_MAX) { + stop_time_defined = false; + } else { + stop_time_defined = true; + } + + if (in.signals) { + for (const auto &sig : *in.signals) { + FmuSignal s; + s.name = sig->name; + fmuSignalIn.push_back(s); + } + } + + if (out.signals) { + for (const auto &sig : *out.signals) { + FmuSignal s; + s.name = sig->name; + fmuSignalOut.push_back(s); + } + } + + // Swap in.signals and out.signals so that in.signals = FMU outputs and out.signals = FMU inputs. + swapSignals(); + + // Initially set writing_turn to false if there are no input signals, _read() calls do_step() with default inputs. + writing_turn = !fmuSignalIn.empty(); + + return 0; +} + +int FmuNode::start() { + return Node::start(); +} + +int FmuNode::stop() { + fmi3_import_terminate(fmu); + fmi3_import_free_instance(fmu); + fmi3_import_destroy_dllfmu(fmu); + fmi3_import_free(fmu); + fmi_import_free_context(context); + return Node::stop(); +} + +// Register node +static char n[] = "fmu"; +static char d[] = "Interface to Functional Mockup Unit using FMI3.0"; +static NodePlugin + p; diff --git a/packaging/deps.sh b/packaging/deps.sh index 35e0f840c..2fc071e9a 100644 --- a/packaging/deps.sh +++ b/packaging/deps.sh @@ -587,6 +587,21 @@ if ! find /usr/{local/,}{lib,bin} -name "libOpenDSSC.so" | grep -q . && echo "${PREFIX}/openDSSC/bin/" > /etc/ld.so.conf.d/opendssc.conf fi +# Build & Install fmi-library +if ! find /usr/{local/,}{lib,lib64} -name "libfmilib_shared.so" -o -name "*FMILIB*.cmake"| grep -q . && + should_build "fmi-library" "For FMI node-type"; then + git clone --branch 3.0.4 https://github.com/modelon-community/fmi-library.git + mkdir -p fmi-library/build + pushd fmi-library/build + cmake -DFMILIB_GENERATE_DOXYGEN_DOC=OFF \ + -DFMILIB_BUILD_TESTS=OFF \ + ${CMAKE_OPTS} .. + cmake --build . \ + --target install \ + --parallel ${PARALLEL} + popd +fi + # Build & Install ghc::filesystem if ! cmake --find-package -DNAME=ghc_filesystem -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST >/dev/null 2>/dev/null && \ should_build "ghc_filesystem" "for compatability with older compilers"; then diff --git a/tests/integration/Dahlquist.fmu b/tests/integration/Dahlquist.fmu new file mode 100644 index 0000000000000000000000000000000000000000..6de9a1e6feed2bdcc946f5bbf17494f12ec6ff48 GIT binary patch literal 232037 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 Ek5oPa1wAhMRu}h8AqBKeKXbAz^Sq3{<3oF?M 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≧ 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 F{||50)@c9$ literal 0 HcmV?d00001 diff --git a/tests/integration/node-fmu.sh b/tests/integration/node-fmu.sh new file mode 100755 index 000000000..a229ea69d --- /dev/null +++ b/tests/integration/node-fmu.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# +# Integration test for node fmu. +# +# Author: Ritesh Karki +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 + +set -e + +SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +DIR=$(mktemp -d) + +cp $SCRIPTPATH/Dahlquist.fmu ${DIR} +mkdir -p ${DIR}/fmu_dahl + +pushd ${DIR} + +function finish { + popd + rm -rf ${DIR} +} +trap finish EXIT + +cat > expect.dat < config.json < Date: Mon, 17 Aug 2026 15:38:14 +0000 Subject: [PATCH 02/12] fix(reuse): Include reuse license for test FMU Signed-off-by: Ritesh.K --- tests/integration/Dahlquist.fmu.license | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tests/integration/Dahlquist.fmu.license diff --git a/tests/integration/Dahlquist.fmu.license b/tests/integration/Dahlquist.fmu.license new file mode 100644 index 000000000..5d79bf9db --- /dev/null +++ b/tests/integration/Dahlquist.fmu.license @@ -0,0 +1,6 @@ +/* Reference FMU model for integration test of FMU node-type. + * + * Author: Ritesh Karki + * SPDX-FileCopyrightText: 2026, Modelica Association Project "FMI" + * SPDX-License-Identifier: BSD-2-Clause + */ From 2a438bd3a4d56cc5d68fa4cd295848a1dce5d720 Mon Sep 17 00:00:00 2001 From: "Ritesh.K" Date: Mon, 17 Aug 2026 23:28:54 +0200 Subject: [PATCH 03/12] fix(node-fmu): Fix json format in integration test for FMU node-type Signed-off-by: Ritesh.K --- tests/integration/node-fmu.sh | 69 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/tests/integration/node-fmu.sh b/tests/integration/node-fmu.sh index a229ea69d..ddf56f513 100755 --- a/tests/integration/node-fmu.sh +++ b/tests/integration/node-fmu.sh @@ -36,42 +36,41 @@ cat > expect.dat < config.json < Date: Wed, 19 Aug 2026 07:03:16 +0000 Subject: [PATCH 04/12] fix(node-fmu): Naming, clang, reuse Signed-off-by: Alexandra --- .../components/schemas/config/nodes/fmu.yaml | 4 ++-- include/villas/nodes/fmu.hpp | 2 +- lib/nodes/fmu.cpp | 21 ++++++++++--------- tests/integration/Dahlquist.fmu.license | 1 - tests/integration/node-fmu.sh | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/openapi/components/schemas/config/nodes/fmu.yaml b/doc/openapi/components/schemas/config/nodes/fmu.yaml index fa9b7c8c1..abeb86e0a 100644 --- a/doc/openapi/components/schemas/config/nodes/fmu.yaml +++ b/doc/openapi/components/schemas/config/nodes/fmu.yaml @@ -15,10 +15,10 @@ allOf: description: | Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model). - fmu_write_first: + fmu_writing_turn: type: boolean description: | - Specifies whether the model has to be writtem with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead. + Specifies whether the model has to be written with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead. start_time: type: number diff --git a/include/villas/nodes/fmu.hpp b/include/villas/nodes/fmu.hpp index d84acd453..95b07f1dd 100644 --- a/include/villas/nodes/fmu.hpp +++ b/include/villas/nodes/fmu.hpp @@ -36,7 +36,7 @@ class FmuNode : public Node { int _read(struct Sample *smps[], unsigned cnt) override; int _write(struct Sample *smps[], unsigned cnt) override; - bool writing_turn = true; + bool writing_turn; const char *path; const char *unpackPath; diff --git a/lib/nodes/fmu.cpp b/lib/nodes/fmu.cpp index c62a70139..9004ff6c3 100644 --- a/lib/nodes/fmu.cpp +++ b/lib/nodes/fmu.cpp @@ -61,6 +61,10 @@ FmuNode::FmuNode(const uuid_t &id, const std::string &name) int FmuNode::prepare() { struct stat sb; + // Check if path is valid + if (stat(path, &sb) != 0) + logger->error("The FMU path is invalid: {}, {}", strerror(errno), path); + if (stat(unpackPath, &sb) != 0) logger->error("The unpack path is invalid: {}, {}", strerror(errno), unpackPath); @@ -104,9 +108,7 @@ int FmuNode::prepare() { return Node::prepare(); } -int FmuNode::check() { - return Node::check(); -} +int FmuNode::check() { return Node::check(); } int FmuNode::_read(struct Sample *smps[], unsigned cnt) { assert(cnt == 1); @@ -313,10 +315,11 @@ int FmuNode::parse(json_t *json) { step_size = 0.1; stop_time = INT_MAX; ret = json_unpack_ex( - json, &err, 0, "{s:s, s:s, s?:f, s?:f, s?:f, s?:{s:o}, s?:{s:o}}", - "fmu_path", &path, "fmu_unpack_path", &unpackPath, "stop_time", - &stop_time, "start_time", &start_time, "step_size", &step_size, "in", - "signals", &json_signals_in, "out", "signals", &json_signals_out); + json, &err, 0, "{s:s, s:s, s?:b, s?:f, s?:f, s?:f, s?:{s:o}, s?:{s:o}}", + "fmu_path", &path, "fmu_unpack_path", &unpackPath, "fmu_writing_turn", + &writing_turn, "stop_time", &stop_time, "start_time", &start_time, + "step_size", &step_size, "in", "signals", &json_signals_in, "out", + "signals", &json_signals_out); if (ret) throw ConfigError(json, err, "node-config-node-fmu"); if (stop_time == INT_MAX) { @@ -350,9 +353,7 @@ int FmuNode::parse(json_t *json) { return 0; } -int FmuNode::start() { - return Node::start(); -} +int FmuNode::start() { return Node::start(); } int FmuNode::stop() { fmi3_import_terminate(fmu); diff --git a/tests/integration/Dahlquist.fmu.license b/tests/integration/Dahlquist.fmu.license index 5d79bf9db..5a77f759f 100644 --- a/tests/integration/Dahlquist.fmu.license +++ b/tests/integration/Dahlquist.fmu.license @@ -1,6 +1,5 @@ /* Reference FMU model for integration test of FMU node-type. * - * Author: Ritesh Karki * SPDX-FileCopyrightText: 2026, Modelica Association Project "FMI" * SPDX-License-Identifier: BSD-2-Clause */ diff --git a/tests/integration/node-fmu.sh b/tests/integration/node-fmu.sh index ddf56f513..c6f057623 100755 --- a/tests/integration/node-fmu.sh +++ b/tests/integration/node-fmu.sh @@ -47,7 +47,7 @@ cat > config.json < Date: Wed, 19 Aug 2026 12:25:32 +0200 Subject: [PATCH 05/12] fix(node-fmu): Update Dahlquist.fmu.license Co-authored-by: Philipp Jungkamp Signed-off-by: al3xa23 <140614263+al3xa23@users.noreply.github.com> --- tests/integration/Dahlquist.fmu.license | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/integration/Dahlquist.fmu.license b/tests/integration/Dahlquist.fmu.license index 5a77f759f..123666c9a 100644 --- a/tests/integration/Dahlquist.fmu.license +++ b/tests/integration/Dahlquist.fmu.license @@ -1,5 +1,2 @@ -/* Reference FMU model for integration test of FMU node-type. - * - * SPDX-FileCopyrightText: 2026, Modelica Association Project "FMI" - * SPDX-License-Identifier: BSD-2-Clause - */ +SPDX-FileCopyrightText: 2026, Modelica Association Project "FMI" +SPDX-License-Identifier: BSD-2-Clause From 18b6f1c4898c792485c5bc5940bf816dd271a5ef Mon Sep 17 00:00:00 2001 From: Alexandra Date: Wed, 9 Sep 2026 10:34:02 +0000 Subject: [PATCH 06/12] chore(node-fmu): Move schema to node-fmu.yaml Signed-off-by: Alexandra --- doc/openapi/components/schemas/_fmu.yaml | 7 -- .../components/schemas/config/node_obj.yaml | 58 ------------ doc/openapi/components/schemas/fmu.yaml | 71 -------------- doc/openapi/components/schemas/node-fmu.yaml | 93 +++++++++++++++++++ 4 files changed, 93 insertions(+), 136 deletions(-) delete mode 100644 doc/openapi/components/schemas/_fmu.yaml delete mode 100644 doc/openapi/components/schemas/config/node_obj.yaml delete mode 100644 doc/openapi/components/schemas/fmu.yaml create mode 100644 doc/openapi/components/schemas/node-fmu.yaml diff --git a/doc/openapi/components/schemas/_fmu.yaml b/doc/openapi/components/schemas/_fmu.yaml deleted file mode 100644 index 4618c468e..000000000 --- a/doc/openapi/components/schemas/_fmu.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# yaml-language-server: $schema=http://json-schema.org/draft-07/schema -# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University -# SPDX-License-Identifier: Apache-2.0 ---- -allOf: -- $ref: ../node_obj.yaml -- $ref: file.yaml diff --git a/doc/openapi/components/schemas/config/node_obj.yaml b/doc/openapi/components/schemas/config/node_obj.yaml deleted file mode 100644 index afebd1e32..000000000 --- a/doc/openapi/components/schemas/config/node_obj.yaml +++ /dev/null @@ -1,58 +0,0 @@ -# yaml-language-server: $schema=http://json-schema.org/draft-07/schema -# SPDX-FileCopyrightText: 2014-2023 Institute for Automation of Complex Power Systems, RWTH Aachen University -# SPDX-License-Identifier: Apache-2.0 ---- -type: object -title: Format Object -required: -- type -properties: - type: - type: string - description: | - Specifies which protocol should be used by this node. - - For a complete list of supported node-types run `villas node --help`. - - In addition to the node settings described in this section, every node type has its own specific settings - -discriminator: - propertyName: type - mapping: - amqp: nodes/_amqp.yaml - api: nodes/_api.yaml - can: nodes/_can.yaml - comedi: nodes/_comedi.yaml - ethercat: nodes/_ethercat.yaml - example: nodes/_example.yaml - exec: nodes/_exec.yaml - file: nodes/_file.yaml - fmu: nodes/_fmu.yaml - fpga: nodes/_fpga.yaml - iec60870-5-104: nodes/_iec60870-5-104.yaml - iec61850-8-1: nodes/_iec61850-8-1.yaml - iec61850-9-2: nodes/_iec61850-9-2.yaml - infiniband: nodes/_infiniband.yaml - influxdb: nodes/_influxdb.yaml - kafka: nodes/_kafka.yaml - loopback: nodes/_loopback.yaml - modbus: nodes/_modbus.yaml - mqtt: nodes/_mqtt.yaml - nanomsg: nodes/_nanomsg.yaml - ngsi: nodes/_ngsi.yaml - opal_async: nodes/_opal_async.yaml - opendss: nodes/_opendss.yaml - opal.orchestra: nodes/_opal_orchestra.yaml - redis: nodes/_redis.yaml - rtp: nodes/_rtp.yaml - shmem: nodes/_shmem.yaml - signal: nodes/_signal_node.yaml - signal.v2: nodes/_signal_v2_node.yaml - socket: nodes/_socket.yaml - stats_node: nodes/_stats_node.yaml - temper: nodes/_temper.yaml - test_rtt: nodes/_test_rtt.yaml - uldaq: nodes/_uldaq.yaml - webrtc: nodes/_webrtc.yaml - websocket: nodes/_websocket.yaml - zeromq: nodes/_zeromq.yaml diff --git a/doc/openapi/components/schemas/fmu.yaml b/doc/openapi/components/schemas/fmu.yaml deleted file mode 100644 index abeb86e0a..000000000 --- a/doc/openapi/components/schemas/fmu.yaml +++ /dev/null @@ -1,71 +0,0 @@ -# yaml-language-server: $schema=http://json-schema.org/draft-07/schema -# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University -# SPDX-License-Identifier: Apache-2.0 ---- -allOf: -- type: object - properties: - fmu_path: - format: uri - description: | - Specifies the URI to a FMU model - - fmu_unpack_path: - format: uri - description: | - Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model). - - fmu_writing_turn: - type: boolean - description: | - Specifies whether the model has to be written with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead. - - start_time: - type: number - description: | - Specifies the start time for the simulation. Value has to be at least one `step_size` lesser than `stop_time`. - - stop_time: - type: number - description: | - Specifies the stop time for the simulation. The number of steps is calculated then by the difference between `start_time` and `stop_time` divided by the `step_size`. - - step_size: - type: number - description: | - Specifies the step size for the simulation. Special care has to be taken to ensure that the value is equal to the value mantioned in modelDescription.xml. - - in: - type: object - properties: - signals: - type: array - description: | - The input signals for the model have to be mentioned here as elements of an array while specifying the name (should be the same as that found in the modelDescription file) and the datatype. - - **Example**: - - ``` - signals = ( - {name = "In1", type = "float"}, - {name = "In2", type = "int"} - ) - ``` - out: - type: object - properties: - signals: - type: array - description: | - The output signals for the model have to be mentioned here as elements of an array while specifying the name (should be the same as that found in the modelDescription file) and the datatype. - - **Example**: - - ``` - signals = ( - {name = "Out1", type = "float"} - ) - ``` - -- $ref: ../node_signals.yaml -- $ref: ../node.yaml diff --git a/doc/openapi/components/schemas/node-fmu.yaml b/doc/openapi/components/schemas/node-fmu.yaml new file mode 100644 index 000000000..7ec1ec95c --- /dev/null +++ b/doc/openapi/components/schemas/node-fmu.yaml @@ -0,0 +1,93 @@ +# yaml-language-server: $schema=http://json-schema.org/draft-07/schema +# SPDX-FileCopyrightText: 2014-2026 Institute for Automation of Complex Power Systems, RWTH Aachen University +# SPDX-License-Identifier: Apache-2.0 +--- +title: FMU node-type +type: object +required: [fmu_path, fmu_unpack_path, fmu_writing_turn, start_time, stop_time, step_size] +properties: + fmu_path: + type: string + format: uri + description: | + Specifies the URI to a FMU model + + fmu_unpack_path: + type: string + format: uri + description: | + Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model). + + fmu_writing_turn: + type: boolean + description: | + Specifies whether the model has to be written with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead. + + start_time: + type: number + description: | + Specifies the start time for the simulation. Value has to be at least one `step_size` lesser than `stop_time`. + + stop_time: + type: number + description: | + Specifies the stop time for the simulation. The number of steps is calculated then by the difference between `start_time` and `stop_time` divided by the `step_size`. + + step_size: + type: number + description: | + Specifies the step size for the simulation. Special care has to be taken to ensure that the value is equal to the value mantioned in modelDescription.xml. + + in: + type: object + properties: + enabled: + default: true + $ref: ./shared-node-enabled.yaml + + builtin: + default: true + $ref: ./shared-node-builtin.yaml + + vectorize: + default: 1 + $ref: ./shared-node-vectorize.yaml + + hooks: + default: [] + $ref: ./shared-hook-list.yaml + + signals: + $ref: ./shared-signal-list.yaml + + out: + type: object + properties: + enabled: + default: true + $ref: ./shared-node-enabled.yaml + + netem: + $ref: ./shared-node-netem.yaml + + fwmark: + $ref: ./shared-node-fwmark.yaml + + builtin: + default: true + $ref: ./shared-node-builtin.yaml + + vectorize: + default: 1 + $ref: ./shared-node-vectorize.yaml + + hooks: + default: [] + $ref: ./shared-hook-list.yaml + + signals: + $ref: ./shared-signal-list.yaml + + additionalProperties: false + +additionalProperties: false From 1fc8339909ba154c3d5d0f67a7b363787e21221f Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Wed, 9 Sep 2026 08:46:06 +0200 Subject: [PATCH 07/12] fix(ci): Add version to Nix builds Signed-off-by: Steffen Vogel --- flake.nix | 11 ++++++++--- packaging/nix/python.nix | 4 +++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 78ea1a619..e9a7b9e03 100644 --- a/flake.nix +++ b/flake.nix @@ -25,6 +25,8 @@ let inherit (nixpkgs) lib; + version = "1.2.0"; # x-release-please-version + nixDir = ./packaging/nix; # Add separateDebugInfo to a derivation @@ -66,15 +68,18 @@ packagesWith = pkgs: rec { default = villas-node; - villas-node-python = pkgs.callPackage (nixDir + "/python.nix") { src = ./.; }; + villas-node-python = pkgs.callPackage (nixDir + "/python.nix") { + src = ./.; + inherit version; + }; villas-node-minimal = pkgs.callPackage (nixDir + "/villas.nix") { src = ./.; - version = "minimal"; + version = "${version}-minimal"; }; villas-node = villas-node-minimal.override { - version = "full"; + version = "${version}-full"; withAllExtras = true; withAllFormats = true; withAllHooks = true; diff --git a/packaging/nix/python.nix b/packaging/nix/python.nix index d91af6ef0..fdd41f54d 100644 --- a/packaging/nix/python.nix +++ b/packaging/nix/python.nix @@ -4,9 +4,11 @@ src, pkgs, python3Packages, + version, }: python3Packages.buildPythonPackage { - name = "villas-node"; + pname = "villas-node"; + inherit version; src = "${src}/python"; format = "pyproject"; propagatedBuildInputs = with python3Packages; [ From ec48766e1b9d01a5d47b67e61f48676798589d1f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:46:31 +0000 Subject: [PATCH 08/12] chore(master): Release 1.3.1 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 7 +++++++ CMakeLists.txt | 2 +- doc/package.json | 2 +- python/pyproject.toml | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 96f1cd949..9049e2fdf 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.3.0" + ".": "1.3.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 07ca86041..214bd4f33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.3.1](https://github.com/VILLASframework/node/compare/v1.3.0...v1.3.1) (2026-09-09) + + +### Bug Fixes + +* **ci:** Add version to Nix builds ([6357645](https://github.com/VILLASframework/node/commit/6357645d63aa70926f22b837a912541ef39f73e8)) + ## [1.3.0](https://github.com/VILLASframework/node/compare/v1.2.2...v1.3.0) (2026-09-07) diff --git a/CMakeLists.txt b/CMakeLists.txt index d8d5451ea..8b558ed6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ cmake_minimum_required(VERSION 3.14) project(villas-node - VERSION 1.3.0 # x-release-please-version + VERSION 1.3.1 # x-release-please-version DESCRIPTION "Open-Source Real-time Multi-protocol Gateway" HOMEPAGE_URL "https://www.fein-aachen.org/projects/villas-node/" LANGUAGES C CXX diff --git a/doc/package.json b/doc/package.json index 5ce68e263..75a6c479f 100644 --- a/doc/package.json +++ b/doc/package.json @@ -1,6 +1,6 @@ { "name": "villasnode-api", - "version": "1.3.0", + "version": "1.3.1", "type": "module", "dependencies": { "@redocly/cli": "1.16.0" diff --git a/python/pyproject.toml b/python/pyproject.toml index 804685804..ad194dc27 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -7,7 +7,7 @@ build-backend = 'setuptools.build_meta' [project] name = 'villas-node' -version = "1.3.0" +version = "1.3.1" description = 'Python support for the VILLASnode simulation-data gateway' readme = 'README.md' requires-python = '>=3.10' From 7dddcfeaa79195386967cba4ec8abe6e8954a455 Mon Sep 17 00:00:00 2001 From: "Ritesh.K" Date: Mon, 17 Aug 2026 23:28:54 +0200 Subject: [PATCH 09/12] fix(node-fmu): Fix json format in integration test for FMU node-type Signed-off-by: Ritesh.K --- tests/integration/node-fmu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/node-fmu.sh b/tests/integration/node-fmu.sh index c6f057623..ddf56f513 100755 --- a/tests/integration/node-fmu.sh +++ b/tests/integration/node-fmu.sh @@ -47,7 +47,7 @@ cat > config.json < Date: Wed, 9 Sep 2026 15:05:40 +0000 Subject: [PATCH 10/12] fix(node-fmu): Fix fmu json schema Signed-off-by: Alexandra --- doc/openapi/components/schemas/node-fmu.yaml | 8 +++++--- doc/openapi/components/schemas/node.yaml | 1 + lib/json_schema.cpp | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/openapi/components/schemas/node-fmu.yaml b/doc/openapi/components/schemas/node-fmu.yaml index 7ec1ec95c..5086c435f 100644 --- a/doc/openapi/components/schemas/node-fmu.yaml +++ b/doc/openapi/components/schemas/node-fmu.yaml @@ -4,17 +4,19 @@ --- title: FMU node-type type: object -required: [fmu_path, fmu_unpack_path, fmu_writing_turn, start_time, stop_time, step_size] +required: [type, fmu_path, fmu_unpack_path, fmu_writing_turn, start_time, stop_time, step_size] properties: + type: + type: string + const: fmu + fmu_path: type: string - format: uri description: | Specifies the URI to a FMU model fmu_unpack_path: type: string - format: uri description: | Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model). diff --git a/doc/openapi/components/schemas/node.yaml b/doc/openapi/components/schemas/node.yaml index 7417ab546..e0ccc806f 100644 --- a/doc/openapi/components/schemas/node.yaml +++ b/doc/openapi/components/schemas/node.yaml @@ -16,6 +16,7 @@ discriminator: ethercat: ./node-ethercat.yaml example: ./node-example.yaml exec: ./node-exec.yaml + fmu: ./node-fmu.yaml file: ./node-file.yaml fpga: ./node-fpga.yaml iec60870-5-104: ./node-iec60870-5-104.yaml diff --git a/lib/json_schema.cpp b/lib/json_schema.cpp index 3be4cfa0e..b80209a28 100644 --- a/lib/json_schema.cpp +++ b/lib/json_schema.cpp @@ -9,7 +9,7 @@ namespace villas::node { Json const &bundled_schemas() { // clang-format off - static auto const schema = Json::parse(R"BUNDLED_SCHEMA({"openapi":"3.1.1","info":{"title":"VILLASnode API","version":"0.10.0","description":"A HTTP/REST API for controlling VILLASnode remotely without the need to restart the daemon.","termsOfService":"https://www.fein-aachen.org/projects/villas-node/","contact":{"name":"Steffen Vogel","email":"post@steffenvogel.de","url":"https://fein-aachen.org/contact/"},"license":{"name":"Apache-2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"}},"jsonSchemaDialect":"http://json-schema.org/draft-07/schema","servers":[{"url":"https://villas.k8s.eonerc.rwth-aachen.de/api/v2","description":"The production API server in our EONERC OpenStack Kubernetes"},{"url":"http://localhost:8080","description":"Your local host"}],"tags":[{"name":"super-node","x-displayName":"Super Node","description":"Global super-node related operations."},{"name":"nodes","x-displayName":"Nodes","description":"Node related operations."},{"name":"paths","x-displayName":"Paths","description":"Path related operations."},{"name":"config","x-displayName":"VILLASnode configuration file","description":"This section decribes the schema of the VILLASnode configuration file.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"node","x-displayName":"VILLASnode node configuration","description":"This section decribes the schema of a VILLASnode node.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"hook","x-displayName":"VILLASnode hook configuration","description":"This section decribes the schema of the VILLASnode hook.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"format","x-displayName":"VILLASnode format configuration","description":"This section decribes the schema of the VILLASnode hook.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"format-edgeflex","x-displayName":"Edgeflex Format","description":"\n"},{"name":"format-igor","x-displayName":"Igor's Format","description":"\n"},{"name":"format-sogno","x-displayName":"SOGNO Format","description":"\n"},{"name":"format-sogno-old","x-displayName":"Old SOGNO Format","description":"\n"}],"externalDocs":{"url":"https://villas.fein-aachen.org/doc/node.html"},"paths":{"/status":{"get":{"operationId":"get-status","summary":"Get the current status of the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"state":"running","version":"v0.10.0","release":"1.node_uuid_unique_debug.20201015git335440d","build_id":"v0.10.0-335440d-debug","build_date":"20201015","hostname":"ernie","uuid":"c9d64cc7-c6e1-4dd4-8873-126318e9d42c","time_now":1602765814.9240997,"time_started":1602765814.3103526,"timezone":{"name":"CEST","offset":-3600,"dst":true},"kernel":{"sysname":"Linux","nodename":"ernie","release":"5.6.17-rt10","version":"#5 SMP Fri Jul 10 14:02:33 CEST 2020","machine":"x86_64","domainname":"(none)"},"system":{"cores_configured":28,"cores":28,"processes":780,"uptime":1379600,"load":[1.66259765625,1.271484375,1.18701171875],"ram":{"total":269994606592,"free":262204465152,"shared":44191744,"buffer":130211840},"swap":{"total":4294963200,"free":4294963200},"highmem":{"total":0,"free":0}}}}}}}},"400":{"description":"Failure"}}}},"/capabilities":{"get":{"operationId":"get-capabilities","summary":"Get the capabilities of the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"hooks":["average","cast","decimate","dp","drop","dump","ebm","fix","gate","jitter_calc","limit_rate","pps_ts","print","restart","scale","shift_seq","shift_ts","skip_first","stats","ts"],"node-types":["amqp","can","ethercat","example","exec","file","influxdb","kafka","loopback","loopback_internal","mqtt","ngsi","redis","shmem","signal","socket","stats","temper","test_rtt","websocket","zeromq"],"apis":["capabilities","config","node","node/file","node/pause","node/restart","node/resume","node/start","node/stats","node/stats/reset","node/stop","nodes","path","path/start","path/stop","paths","restart","shutdown","status"],"formats":["csv","gtnet","iotagent_ul","json","json.kafka","json.reserve","raw","tsv","value","villas.binary","villas.human","villas.web"]}}}}}},"400":{"description":"Failure"}}}},"/config":{"get":{"operationId":"get-config","summary":"Get the currently loaded configuration.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"nodes":{"udp_node1":{"type":"socket","layer":"udp","in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"}},"web_node1":{"type":"websocket","vectorize":2,"series":[{"label":"Random walk","unit":"V"},{"label":"Sine","unit":"A"},{"label":"Rect","unit":"Var"},{"label":"Ramp","unit":"°C"}]}},"paths":[{"in":["udp_node1"],"out":["web_node1"],"hooks":[{"type":"decimate","ratio":2}]},{"in":["web_node1"],"out":["udp_node1"]}]}}}}}},"400":{"description":"Failure"}}}},"/restart":{"post":{"operationId":"restart","summary":"Restart the VILLASnode instance.","tags":["super-node"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"config":{"oneOf":[{"type":"string","example":"http://example.com/path/to/config.json","title":"URL","description":"An optional path or URI to a new configuration file which\nshould be loaded after restarting the node.\n\nThe file referenced by the URL must be a [VILLASnode configuration file](#tag/config)\n"},{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":80,"title":"Listening port","description":"The TCP port number on which HTTP & WebSocket server.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}}]}}}}}},"responses":{"200":{"description":"Success. The instance has been restarted.","content":{"application/json":{"examples":{"example1":{"value":{"restarts":5,"config":"http://example.com/path/to/config.json"}}}}}},"400":{"description":"Failure"}}}},"/shutdown":{"post":{"operationId":"shutdown","summary":"Shutdown the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success. The instance has been shut down."},"400":{"description":"Failure"}}}},"/nodes":{"get":{"operationId":"get-nodes","summary":"Get a list of all configure node instances.","tags":["nodes"],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"schema":{"type":"array","items":{"$ref":"../components/schemas/node.yaml"}},"example1":{"value":[{"name":"udp_node1","uuid":"b3df1d73-f483-f16c-5936-4ea48295615c","state":"running","affinity":-1,"in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"},"type":"socket","layer":"udp"},{"name":"web_node1","uuid":"19c84350-c83a-8a3b-224b-43fa591c8998","state":"running","affinity":-1,"in":{"vectorize":2,"signals":[{"type":"float","enabled":true,"name":"signal0"},{"type":"float","enabled":true,"name":"signal1"},{"type":"float","enabled":true,"name":"signal2"},{"type":"float","enabled":true,"name":"signal3"}]},"out":{"vectorize":2,"signals":[{"type":"float","enabled":true,"name":"signal0"},{"type":"float","enabled":true,"name":"signal1"},{"type":"float","enabled":true,"name":"signal2"}]},"type":"websocket","vectorize":2,"series":[{"label":"Random walk","unit":"V"},{"label":"Sine","unit":"A"},{"label":"Rect","unit":"Var"},{"label":"Ramp","unit":"°C"}]}]}}}}},"400":{"description":"Failure"}}}},"/node/{uuid-or-name}":{"get":{"operationId":"get-node","summary":"Get the information of a specific node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"name":"udp_node1","uuid":"b3df1d73-f483-f16c-5936-4ea48295615c","state":"running","affinity":-1,"in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"},"type":"socket","layer":"udp"}}}}}},"404":{"description":"Error. There is no node with the given UUID or the node does not collect statistics."}}}},"/node/{uuid-or-name}/stats":{"get":{"operationId":"get-node-stats","summary":"Get the statistics of a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"rtp.jitter":{"low":1.3293196E-316,"high":0,"total":0},"rtp.pkts_lost":{"low":1.3285797E-316,"high":1.3290532E-316,"total":0},"rtp.loss_fraction":{"low":3E-323,"high":1.32907453E-316,"total":0},"age":{"low":1.3288619E-316,"high":1.32909588E-316,"total":0},"owd":{"low":3E-323,"high":3E-322,"total":144,"higher":0,"lower":0,"highest":0.099986117,"lowest":0.09990915800000001,"mean":0.09998063221527778,"variance":7.736879555478282E-11,"stddev":0.000008795953362472019,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"gap_received":{"low":0,"high":1.32743107E-316,"total":144,"higher":0,"lower":0,"highest":0.10000411000000001,"lowest":0.09999650900000001,"mean":0.09999998652777778,"variance":5.701784607620545E-13,"stddev":7.551016228045431E-7,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"gap_sent":{"low":1.58E-321,"high":1.3292848E-316,"total":144,"higher":0,"lower":0,"highest":0.10004273400000001,"lowest":0.09926839700000001,"mean":0.09999436691666665,"variance":3.7637473716438304E-9,"stddev":0.00006134938770390321,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"reordered":{"low":8.28904606E-315,"high":1.32930615E-316,"total":0},"skipped":{"low":1.32879865E-316,"high":1.3293275E-316,"total":0}}}}}}},"404":{"description":"Error. There is no node with the given UUID or the node does not collect statistics."}}}},"/node/{uuid-or-name}/stats/reset":{"post":{"operationId":"reset-node-stats","summary":"Reset the statistics counters for a specific node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The statistics of the node have been reset."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/start":{"post":{"operationId":"start-node","summary":"Start a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been started."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/stop":{"post":{"operationId":"stop-node","summary":"Stop a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been stopped."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/pause":{"post":{"operationId":"pause-graph","summary":"Pause a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been paused."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/resume":{"post":{"operationId":"resume-node","summary":"Resume a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been resumed."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/restart":{"post":{"operationId":"restart-node","summary":"Retart a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been restarted."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/file/rewind":{"post":{"operationId":"rewind-file-node","summary":"Rewind the playback file to the beginning.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The file has been rewound."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/file/seek":{"post":{"operationId":"seek-file-node","summary":"Rewind the playback file to the beginning.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"requestBody":{"description":"Sample position in file","required":true,"content":{"application/json":{"schema":{"type":"object","required":["position"],"additionalProperties":false,"properties":{"position":{"type":"integer","example":123,"description":"Skip the first nth samples in the file."}}}}}},"responses":{"200":{"description":"Success. The read-pointer of the file has been changed."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/paths":{"get":{"operationId":"get-paths","summary":"Get a list of all paths.","tags":["paths"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}},"examples":{"example1":{"value":[{"uuid":"251c99af-4b05-9de4-367e-2bb550412e56","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["udp_node1"],"out":["web_node1"]},{"uuid":"61b5674b-95fa-b35f-bff8-c877acf21e3b","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["web_node1"],"out":["udp_node1"]}]}}}}},"400":{"description":"Failure"}}}},"/path/{uuid}":{"post":{"operationId":"get-path","summary":"Get details of a single path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"uuid":"251c99af-4b05-9de4-367e-2bb550412e56","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["udp_node1"],"out":["web_node1"]}}}}}},"404":{"description":"Error. There is no path with the given UUID."}}}},"/path/{uuid}/start":{"post":{"operationId":"start-path","summary":"Start a path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success. The path has been started."},"404":{"description":"Error. There is no path with the given UUID."}}}},"/path/{uuid}/stop":{"post":{"operationId":"stop-path","summary":"Start a path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success. The path has been stopped."},"404":{"description":"Error. There is no path with the given UUID."}}}},"/graph.{format}":{"get":{"operationId":"get-graph","summary":"Get a graph representation of the currently loaded configuration.","tags":["super-node"],"parameters":[{"in":"path","name":"format","schema":{"type":"string","description":"The image format of the generated graph.","enum":["ps","eps","txt","svg","svgz","gif","png","jpg","jpeg","bmp","dot","fig","json","pdf"]}},{"in":"query","name":"layout","schema":{"type":"string","description":"The Graphviz layout engine used for rendering the graph.","enum":["circo","dot","fdp","neato","nop","nop1","nop2","osage","patchwork","sfdp","twopi"]}}],"responses":{"200":{"description":"Success"},"400":{"description":"Failure"}}}}},"components":{"schemas":{"Config":{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":80,"title":"Listening port","description":"The TCP port number on which HTTP & WebSocket server.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}},"Node":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}},"Hook":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}},"Format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"FormatEdgeflex":{"title":"PMU measurements as used in the EdgeFlex project by Manuel","description":"VILLASnode does not support deseralization (yet).\n","type":"object","required":["created"],"properties":{"created":{"title":"Sampling timestamp","description":"A timestamps in miliseconds since 1970-01-01 00:00:00","type":"number","minimum":0}},"additionalProperties":{"description":"Key-value pairs of measurements","anyOf":[{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"object","description":"A complex number represented in real and imaginary components","properties":{"real":{"type":"number"},"imag":{"type":"number"}},"additionalProperties":false}]},"example":{"created":1633791645123,"signal0":123.456,"signal1":true,"signal2":1234,"signal3":{"real":1234.4556,"imag":23232.12312}}},"FormatIgor":{"title":"PMU format used by Igor","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"channel":"BUS1-VA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","description":"Name of the monitored bus"},"magnitude":{"type":"number","description":"Amplitude of the measured signal [V]"},"phase":{"type":"number","description":"Phase of the measured signal [radian]"},"frequency":{"type":"number","description":"Frequency of the line signal [Hz]"},"rocof":{"type":"number","description":"Rate of change of frequency [Hz/s]"}},"additionalProperties":false}}},"additionalProperties":false},"FormatSognoOld":{"title":"Original PMU sensor data format as used in the SOGNO EU project","type":"object","required":["device","timestamp","component","measurand","phase","data"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false,"example":{"device":"pmu-abc0","timestamp":"2021-10-07T10:11:12.1231241+02:00","component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123124}},"FormatSogno":{"title":"PMU format used in SOGNO LF project","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false}}},"additionalProperties":false},"plugin-ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"shared-fpga-card":{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"plugin-fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"shared-format-column-separator":{"title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"shared-format-line-delimiter":{"title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"shared-format-line-comment_prefix":{"title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"shared-format-line-header":{"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"shared-format-line-skip_first_line":{"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"shared-format-real_precision":{"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"shared-format-ts_origin":{"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"shared-format-ts_received":{"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"shared-format-sequence":{"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"shared-format-data":{"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"shared-format-offset":{"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"},"format-csv":{"title":"csv","type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"csv"},"separator":{"default":",","title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":true,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-raw-bits":{"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"shared-format-raw-endianess":{"description":"The endianess of the data.","type":"string","enum":["big","little"]},"shared-format-raw-fake":{"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"format-gtnet":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"gtnet"},"bits":{"default":32,"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"endianess":{"default":"big","description":"The endianess of the data.","type":"string","enum":["big","little"]},"fake":{"default":false,"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-iotagent_ul":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"iotagent_ul"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-json-indent":{"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"shared-format-json-compact":{"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"shared-format-json-ensure_ascii":{"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"shared-format-json-sort_keys":{"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"shared-format-json-escape_slash":{"type":"boolean","default":false,"description":"Escape the `/` characters in strings with `\\/`."},"format-json":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_edgeflex":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.edgeflex"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_kafka":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.kafka"},"schema":{"type":"object","additionalProperties":true},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_reserve":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.reserve"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-opal_asyncip":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"opal.asyncip"},"dev_id":{"default":0,"type":"integer"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-protobuf":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"protobuf"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-raw":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"raw"},"bits":{"default":32,"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"endianess":{"default":"little","description":"The endianess of the data.","type":"string","enum":["big","little"]},"fake":{"default":false,"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-tsv":{"title":"tsv","type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"tsv"},"separator":{"default":"\t","title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":true,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-value":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"value"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-villas-source_index":{"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"shared-format-villas-validate_source_index":{"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"format-villas_binary":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.binary"},"source_index":{"default":0,"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"validate_source_index":{"default":false,"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-villas_human":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.human"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-villas_web":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.web"},"source_index":{"default":0,"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"validate_source_index":{"default":false,"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"shared-node-enabled":{"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"shared-node-builtin":{"type":"boolean","default":true,"title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"shared-node-vectorize":{"type":"integer","minimum":1,"default":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"shared-hook-priority":{"type":"integer","minimum":0},"shared-hook-signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"shared-hook-signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}},"hook-average":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"average"},"offset":{"type":"integer","description":"The signal offset at which the average signal should be inserted.\n\n**Examples:**\n- `0` inserts the averaged signal before all other signals in the sample\n- `1` inserts the averaged signal after the first signal.\n"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-cast":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"cast"},"new_type":{"type":"string","enum":["integer","float","boolean","complex"],"description":"The type of the casted signal.","example":"integer"},"new_name":{"type":"string","description":"The new name of the casted signal.","example":"BusA.V"},"new_unit":{"type":"string","description":"The new unit of the casted signal.","example":"V"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-decimate":{"type":"object","required":["type","ratio"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"decimate"},"ratio":{"type":"integer","description":"The decimation ratio. A value of 4 will skip every, but the 4th sample in a row.","example":4},"renumber":{"type":"boolean","default":false,"description":"Renumber the sequence numbers of the output samples starting from zero."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-digest":{"type":"object","required":["type","uri","algorithm"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"digest"},"uri":{"description":"The output file for digests.","example":"digest.txt","type":"string"},"algorithm":{"description":"The algorithm used for calculating digests.","example":"sha256","type":"string"},"mode":{"description":"The file open mode passed to fopen (e.g. \"w\" to truncate, \"a\" to append).","example":"w","type":"string"},"priority":{"default":999,"type":"integer","minimum":0}}},"hook-dp":{"type":"object","required":["type","f0","harmonics","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"dp"},"f0":{"description":"The fundamental frequency.","example":50,"type":"number"},"dt":{"description":"The timestep of the input samples. Exclusive with `rate` setting.","examples":[0.00005],"type":"number"},"rate":{"description":"The rate of the input samples. Exclusive with `dt` setting.","type":"number"},"harmonics":{"type":"array","minItems":1,"description":"A list of selected harmonics which should be calculated.","example":[0,1,3,5],"items":{"type":"integer"}},"inverse":{"description":"Enable the calucation of the inverse transform.","type":"boolean","default":false},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"description":"The name or index of a signal to which this hook should be applied","oneOf":[{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},{"type":"integer"}]}},"oneOf":[{"required":["dt"]},{"required":["rate"]}]},"hook-drop":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"drop"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-dump":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"dump"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-ebm":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","required":["type","phases"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ebm"},"phases":{"description":"Signal indices for voltage & current values for each phase.","type":"array","items":{"type":"array","minItems":2,"examples":[[0,1],[2,3],[4,5]],"additionalItems":false,"items":[{"title":"Voltage Signal Index","type":"integer"},{"title":"Current Signal Index","type":"integer"}]}},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-fix":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"fix"},"priority":{"default":99,"type":"integer","minimum":0}}},"shared-duration":{"oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"hook-frame":{"type":"object","required":["type","interval"],"properties":{"type":{"type":"string","const":"frame"},"trigger":{"description":"The trigger for new frames.","type":"string","default":"timestamp","enum":["sequence","timestamp"]},"interval":{"description":"The interval in which frames are annotated.","default":"1s","not":{"const":null}},"priority":{"default":10,"type":"integer","minimum":0}},"additionalProperties":false,"oneOf":[{"required":["trigger"],"properties":{"trigger":{"const":"sequence"},"interval":{"type":"integer"}},"additionalProperties":{}},{"properties":{"trigger":{"const":"timestamp"},"interval":{"oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]}},"additionalProperties":{}}]},"hook-gate":{"type":"object","required":["type","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"gate"},"mode":{"description":"The triggering condition at which the gate opens.","type":"string","default":"rising_edge","enum":["above","below","rising_edge","falling_edge"]},"threshold":{"default":0.5,"description":"The threshold the signal needs to overcome before the gate opens.","type":"number"},"duration":{"description":"The number of seconds for which the gate opens when the triggering condition is met. Exclusive with the `samples` setting.","type":"number"},"samples":{"description":"The number if samples for which the gate opens when the triggering condition is met. Exclusive with the `duration` setting.","type":"integer"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"}}},"hook-jitter_calc":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"jitter_calc"},"priority":{"default":0,"type":"integer","minimum":0}}},"hook-limit_rate":{"type":"object","required":["type","rate"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"limit_rate"},"rate":{"type":"number","exclusiveMinimum":0,"description":"The maximum sample rate in `1/s` before this hook will drop samples."},"mode":{"type":"string","default":"local","description":"Timestamp which should be used for rate estimation.","enum":["local","received","origin"]},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-limit_value":{"type":"object","required":["type","min","max"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"limit_value"},"min":{"description":"The smallest value which will pass through the hook before getting clipped.","type":"number"},"max":{"description":"The largest value which will pass through the hook before getting clipped.","type":"number"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"shared-signal-name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"shared-signal-unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"shared-signal-type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"shared-signal-init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"shared-signal-enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"},"hook-lua":{"type":"object","required":["type"],"additionalProperties":{"description":"The Lua hook will pass the complete hook configuration to the `prepare()` Lua function.\nSo you can add arbitrary settings here which are then consumed by the Lua script.\n"},"properties":{"type":{"type":"string","const":"lua"},"use_names":{"type":"boolean","default":true,"description":"Enables or disables the use of signal names in the `process()` Lua function. If disabled, numeric indices will be used."},"script":{"type":"string","description":"Provide the path to a Lua script containing functions for the individual hook points.\nDefine some or all of the following functions in your Lua script:\n\n#### `prepare(cfg)`\n\nCalled during initialization with a Lua table which contains the full hook configuration.\n\n#### `start()`\n\nCalled when the associated node or path is started\n\n#### `stop()`\n\nCalled when the associated node or path is stopped\n\n#### `restart()`\n\nCalled when the associated node or path is restarted.\nFalls back to `stop()` + `start()` if absent.\n\n#### `process(smp)`\n\nCalled for each sample which is being processed.\nThe sample is passed as a Lua table with the following fields:\n\n- `sequence` The sequence number of the sample.\n- `flags` The flags field of the sample.\n- `ts_origin` The origin timestamp as a Lua table containing the following keys:\n| Index | Description |\n|:-- |:-- |\n| 0 | seconds |\n| 1 | nanoseconds |\n\n- `ts_received` The receive timestamp a Lua table containing the following keys:\n| Index | Description |\n|:-- |:-- |\n| 0 | seconds |\n| 1 | nanoseconds |\n\n- `data` The sample data as a Lua table container either numeric indices or the signal names depending on the 'use_names' option of the hook.\n\n#### `periodic()`\n\nCalled periodically with the rate of @ref node-config-stats.\n"},"signals":{"description":"A definition of signals which this hook will emit.\nHere a list of signal definitions like @ref node-config-node-signals is expected.\n","type":"array","items":{"type":"object","required":["expression"],"additionalProperties":{"description":"The Lua hook passes each signal definition to the Lua script.\nYou may add arbitrary custom properties to a signal here which are\nthen available as context to your Lua code (e.g. within `prepare()`\nor `process()`). You are responsible for consuming them in your script.\n"},"properties":{"expression":{"type":"string","example":"math.sqrt(smp.data[0] ^ 2 + smp.data[1] ^ 2)","description":"An arbitrary Lua expression which will be evaluated and used for the value of the signal.\nNote you can access the current sample using the global Lua variable `smp`.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}}}},"priority":{"default":1,"type":"integer","minimum":0}}},"hook-ma":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ma"},"window_size":{"type":"integer","description":"The size of the window (number of samples) which should be used for the moving average filter.","example":100,"default":0,"minimum":0},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-pmu_dft":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"pmu_dft"},"sample_rate":{"type":"integer","default":0,"minimum":0,"example":10000,"description":"The sampling rate of the input signal."},"start_frequency":{"type":"number","minimum":0,"example":49.7,"description":"The lowest frequency bin."},"end_frequency":{"type":"number","example":50.3,"minimum":0,"description":"The highest frequency bin."},"frequency_resolution":{"type":"number","example":0.1,"minimum":0,"description":"The frequency resolution of the DFT."},"dft_rate":{"type":"integer","example":1,"minimum":1,"description":"The number of phasor calculations performed per second."},"window_size_factor":{"type":"integer","default":1,"description":"A factor that increases the automatically determined window size by a multiplicative factor."},"window_type":{"type":"string","enum":["flattop","hamming","hann","none"],"default":"none","description":"The window type."},"padding_type":{"type":"string","enum":["zero","signal_repeat"],"default":"none","description":"The padding type."},"estimate_type":{"type":"string","enum":["quadratic"],"default":"none","description":"The frequency estimation type."},"pps_index":{"type":"integer","description":"The signal index of the PPS signal. This is only needed if data dumper is active.","default":0},"angle_unit":{"type":"string","enum":["rad","degree"],"default":"rad","description":"The unit of the phase angle."},"add_channel_name":{"type":"boolean","default":false,"description":"Adds the name of the channel as a suffix to the signal name e.g `amplitude_ch1`."},"timestamp_align":{"enum":["left","center","right"],"default":"center","description":"The timestamp alignment in respect to the the window."},"phase_offset":{"type":"number","default":0,"example":10,"description":"An offset added to a calculated phase."},"amplitude_offset":{"type":"number","default":0,"example":10,"description":"An offset added to the calculated amplitude."},"frequency_offset":{"type":"number","default":0,"example":0.2,"description":"An offset added to the calculated frequency."},"rocof_offset":{"type":"number","default":0,"example":1,"description":"An offset added to the calculated RoCoF. This setting does not really make sense but is available for completeness reasons"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-pps_ts":{"type":"object","required":["type","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"pps_ts"},"mode":{"type":"string","enum":["simple","horizon"],"default":"simple","description":"The synchronization mode. The `horizon` mode is currently no recommended to use as it is not fully tested."},"threshold":{"type":"number","default":1.5,"description":"The signal level threshold of the PPS signal which is used to detect an edge."},"expected_smp_rate":{"type":"number","default":1,"description":"The expected sampling rate of the input signal. Only important for a faster initialization."},"horizon_estimation":{"type":"integer","default":10},"horizon_compensation":{"type":"integer","default":10},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"}}},"hook-print":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"print"},"output":{"type":"string","default":"/dev/stdout","description":"An optional path to a file to which the samples processed by this hook will be written to."},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"prefix":{"type":"string","default":"","description":"An optional prefix which will be prepended to each line written by this hook to the output"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-reorder_ts":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"reorder_ts"},"window_size":{"type":"integer","default":16,"minimum":1,"description":"The number of samples buffered for reordering."},"priority":{"default":2,"type":"integer","minimum":0}}},"hook-restart":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"restart"},"priority":{"default":1,"type":"integer","minimum":0}}},"hook-rms":{"type":"object","required":["type","window_size"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"rms"},"window_size":{"type":"integer","description":"The size of the window (number of samples) which should be used for the moving average filter.","example":100,"minimum":1},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-round":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"round"},"precision":{"type":"integer","default":1,"example":4,"description":"The number of decimal digits to which the signal is rounded."},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-scale":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"scale"},"offset":{"type":"number","default":0,"example":100.5,"description":"The offset which is added to the signal after gain."},"scale":{"type":"number","default":1,"example":1000,"description":"The factor by which the signal is multiplied before the offset is added."},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-shift_seq":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"shift_seq"},"offset":{"type":"integer","description":"The offset which is added to the sequence number of each processed sample."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-shift_ts":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"shift_ts"},"mode":{"type":"string","enum":["origin","received"],"description":"The timestamp field which should be adjusted by the `offset` setting."},"offset":{"type":"number","description":"The offset in seconds which is added to the timestamp field of each processed sample."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-skip_first":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"skip_first"},"samples":{"type":"integer","description":"The number of samples which should be dropped by this hook after a start or restart of the node/path."},"seconds":{"type":"number","description":"The number of seconds for which this hook should initially drop samples after a start or restart of the node/path."},"priority":{"default":99,"type":"integer","minimum":0}},"oneOf":[{"required":["samples"]},{"required":["seconds"]}]},"hook-stats":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"stats"},"format":{"type":"string","enum":["human","json","matlab"]},"buckets":{"type":"integer","default":20,"description":"The number of buckets which should be used for the underlying histograms."},"warmup":{"type":"integer","default":500,"description":"Use the first `warmup` samples to estimate the bucket range of the underlying histograms."},"verbose":{"type":"boolean","default":false,"description":"Include full dumps of the histogram buckets into the output."},"output":{"type":"string","description":"The file where you want to write the report to. If omitted, stdout (the terminal) will be used.","default":"/dev/stdout"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-ts":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ts"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}},"shared-hook-list":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"shared-signal-description":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"shared-signal-list":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"shared-node-in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"shared-node-netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"shared-node-fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"shared-node-out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-amqp":{"title":"Advanced Messaging & Queuing Protocol (AMQP)","type":"object","required":["type","exchange","routing_key"],"properties":{"type":{"type":"string","const":"amqp"},"format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"uri":{"type":"string","format":"uri","example":"amqp://guest:guest@localhost:5672/","description":"A complete AMQP connection URI.\n\nIf set, it takes precedence over the individual `host`, `port`, `username`, `password` and `vhost` settings, which are otherwise used to construct the URI.\n\nSee also: https://www.rabbitmq.com/uri-spec.html\n"},"host":{"type":"string","default":"localhost","description":"The hostname of the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"port":{"type":"integer","default":5672,"description":"The port number of the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"username":{"type":"string","default":"guest","description":"The username used for authentication with the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"password":{"type":"string","default":"guest","description":"The password used for authentication with the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"vhost":{"type":"string","default":"/","description":"The AMQP virtual host.\nUsed to construct the connection URI when `uri` is not set.\n"},"exchange":{"type":"string","description":"The name of the AMQP exchange the node will publish the messages to.\n"},"routing_key":{"type":"string","description":"The routing key of published messages as well as the routing key which is used to bind the subcriber queue.\n"},"ssl":{"description":"Note: These settings are only used if the `uri` setting is using the `amqps://` schema.\n","type":"object","properties":{"verify_hostname":{"type":"boolean","default":true},"verify_peer":{"type":"boolean","default":true},"ca_cert":{"type":"string","description":"Path to a CA certificate file used to verify the broker."},"client_cert":{"type":"string","description":"Path to the client certificate file."},"client_key":{"type":"string","description":"Path to the client private key file."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-c37.118-phasor":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"node-c37.118-analog":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"node-c37.118-digital":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"node-c37.118-pmu":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"node-c37_118":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"c37.118"},"in":{"type":"object","required":["address"],"description":"Client (PDC) side. When an address is given, the node connects to a\nremote PMU / PDC, requests its configuration and reads data frames.\n","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"address":{"type":"string","description":"Hostname or IP address of the remote PMU / PDC in the format\n`host[:port]`. The port defaults to the C37.118 port 4712 when\nomitted.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"IDCODE placed in the command frames sent to the remote device.\n"}},"additionalProperties":false},"out":{"type":"object","required":["address","data_rate","pmus"],"description":"Server (PMU / PDC) side. When an address is given, the node listens for\na connecting PDC, answers configuration and command frames and streams\ndata frames built from the samples written to the node.\n","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"address":{"type":"string","description":"Local address to bind to in the format `host[:port]`. An empty host\nbinds to all interfaces. The port defaults to the C37.118 port 4712\nwhen omitted.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"IDCODE reported in the frames served to the connecting PDC.\n"},"testing":{"type":"boolean","default":false,"description":"Enable \"testing\" mode. This is only intended to be used by our\nintegration tests.\n\nThis causes the server to not discard samples when no client is\nconnected. This option effectively makes the server busy-wait\nfor a client to connect and can easily exhaust the internal\nqueue of sent samples.\n"},"time_base":{"type":"integer","default":1000000,"minimum":1,"maximum":16777215,"description":"Resolution of the fractional second (FRACSEC) timestamp, i.e. the\nnumber of sub-second units per second. The C37.118 TIME_BASE field\nis 24 bits wide, so the value must not exceed 16777215.\n"},"data_rate":{"type":"number","minimum":0.0000305175,"maximum":32767,"description":"Reporting rate in frames per second. Rates below one frame per\nsecond are supported (e.g. 0.5 for one frame every two seconds) and\nare encoded using the C37.118 seconds-per-frame representation.\n"},"pmus":{"type":"array","minItems":1,"items":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"description":"The list of PMU configurations served by this node.\n"}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-c37.118-pmu":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"node-c37.118-phasor":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"node-c37.118-analog":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"node-c37.118-digital":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false}}},"node-can-signal":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-can":{"type":"object","required":["type","interface_name"],"properties":{"type":{"type":"string","const":"can"},"interface_name":{"type":"string","description":"Name of the Socket CAN interface"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-can-signal":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-comedi-signal":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-comedi":{"title":"Comedi-compatible DAQ/ADC cards","type":"object","required":["type","device"],"properties":{"type":{"type":"string","const":"comedi"},"device":{"type":"string","description":"The path to the Comedi device file.","example":"/dev/comedi0"},"in":{"type":"object","required":["rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subdevice":{"type":"integer","description":"The Comedi subdevice number. Auto-detected if not specified."},"bufsize":{"type":"integer","default":16,"description":"The size of the Comedi buffer in kilobytes."},"rate":{"type":"integer","description":"The sampling rate in Hertz."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subdevice":{"type":"integer","description":"The Comedi subdevice number. Auto-detected if not specified."},"bufsize":{"type":"integer","default":16,"description":"The size of the Comedi buffer in kilobytes."},"rate":{"type":"integer","description":"The sampling rate in Hertz."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-comedi-signal":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-ethercat":{"title":"Send and receive samples over an EtherCAT connection","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"ethercat"},"rate":{"type":"number","default":1000,"description":"The cyclic rate in Hertz at which process data is exchanged."},"in":{"type":"object","required":["num_channels"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"num_channels":{"type":"integer","default":8},"range":{"type":"number","default":10},"position":{"type":"integer","default":2},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["num_channels"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"num_channels":{"type":"integer","default":8},"range":{"type":"number","default":10},"position":{"type":"integer","default":1},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-example":{"title":"Example Node","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"example"},"setting1":{"type":"integer","minimum":0,"maximum":100,"default":72,"description":"A first setting"},"setting2":{"type":"string","minimum":0,"maximum":10,"default":"something","description":"Another setting"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-exec":{"title":"Exec","type":"object","required":["type","exec"],"properties":{"type":{"type":"string","const":"exec"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"shell":{"type":"boolean","default":false,"description":"If set, the `exec` setting gets passed the shell (`/usr/bin`).\nIn this case the `exec` setting must be given as a string.\n\nIf not set, we will directly execute the sub-process via `execvpe(2)`.\nIn this case the exec setting must be given as an array (`argv[]`).\n"},"exec":{"description":"The program which should be executed in the sub-process.\n\nThe option is passed to the system shell for execution.\n","oneOf":[{"type":"array","minItems":1,"items":{"type":"string"}},{"type":"string"}]},"flush":{"type":"boolean","default":true,"description":"Flush stream every time VILLASnode passes data the sub-process.\n"},"working_directory":{"type":"string","description":"If set, the working directory for the sub-process will be changed.\n"},"environment":{"type":"object","description":"A object of key/value pairs of environment variables which should be passed to the sub-process in addition to the parent environment.\n","additionalProperties":{"type":"string"}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-file":{"title":"File","type":"object","required":["type","uri"],"properties":{"type":{"type":"string","const":"file"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"uri":{"type":"string","description":"Specifies the path to a local file which is written to or read from depending on which group (`in` or `out`) is used.\n\nThis setting allows to add special placeholders for time and date values.\nSee [strftime(3)](http://man7.org/linux/man-pages/man3/strftime.3.html) for a list of supported placeholder.\n\n**Example**:\n\n```\nuri = \"logs/measurements_%Y-%m-%d_%H-%M-%S.log\"\n```\n\nwill create a file called:\n\n```\n./logs/measurements_2015-08-09_22-20-50.log\n```\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"epoch":{"type":"number"},"epoch_mode":{"type":"string","enum":["direct","wait","relative","absolute","original"],"description":"The *epoch* describes the point in time when the first message will be read from the file.\nThis setting allows to select the behavior of the following `epoch` setting.\nIt can be used to adjust the point in time when the first value should be read.\n\nThe behavior of `epoch` is depending on the value of `epoch_mode`.\n\nTo facilitate the following description of supported `epoch_mode`'s, we will introduce some intermediate variables (timestamps).\nThose variables will also been displayed during the startup phase of the server to simplify debugging.\n\n- `epoch` is the value of the `epoch` setting.\n- `first` is the timestamp of the first message / line in the input file.\n- `offset` will be added to the timestamps in the file to obtain the real time when the message will be sent.\n- `start` is the point in time when the first message will be sent (`first + offset`).\n- `eta` the time to wait until the first message will be send (`start - now`)\n\nThe supported values for `epoch_mode`:\n\n| `epoch_mode` \t| `offset` \t\t| `start = first + offset` |\n| :--\t\t| :--\t\t\t| :-- |\n| `direct` \t| `now - first + epoch` \t| `now + epoch` |\n| `wait` \t| `now + epoch` \t\t| `now + first` |\n| `relative` \t| `epoch` \t\t| `first + epoch` |\n| `absolute` \t| `epoch - first` \t| `epoch` |\n| `original` \t| `0` \t\t\t| immediately |\n"},"rate":{"type":"number","default":0,"description":"By default `send_rate` has the value `0` which means that the time between consecutive samples is the same as in the `in` file based on the timestamps in the first column.\n\nIf this setting has a non-zero value, the default behavior is overwritten with a fixed rate.\n"},"eof":{"type":"string","default":"exit","enum":["rewind","wait","exit","stop"],"description":"Defines the behavior if the end of file of the input file is reached.\n\n- `rewind` will rewind the file pointer and restart reading samples from the beginning of the file.\n- `exit` will terminated the program.\n- `wait` will periodically test if there are new samples which have been appended to the file.\n"},"buffer_size":{"type":"integer","minimum":0,"default":0,"description":"Similar to the [`out.buffer_size` setting](#out-buffer_size). This means that the data is loaded into the buffer before it is passed on to the node.\n\nIf `in.buffer_size = 0`, no buffer will be generated.\n"},"skip":{"type":"integer","minimum":0,"default":0,"description":"The number of lines which should be skipped at the beginning of the input file.\n"}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"flush":{"type":"boolean","description":"With this setting enabled, the outgoing file is flushed whenever new samples have been written to it.\n"},"buffer_size":{"type":"integer","default":0,"minimum":0,"description":"If this is set to a positive value ``, the node will generate a full [stream buffer](https://linux.die.net/man/3/setvbuf) with a size of `` bytes. This means that the data is buffered and not written until the buffer is full or until the node is stopped.\n\nIf `out.buffer_size = 0`, no buffer will be generated.\n"}},"additionalProperties":false}},"additionalProperties":false},"node-fpga":{"title":"VILLASfpga node-type","type":"object","required":["type","card"],"properties":{"type":{"type":"string","const":"fpga"},"card":{"description":"The FPGA card to use for this node.\nEither the name of a card defined elsewhere, or an inline card definition object.\n","oneOf":[{"type":"string","description":"The name of the FPGA card."},{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"required":["name"]}]}]},"connect":{"type":"array","description":"A list of connect strings describing the internal FPGA IP interconnections.","items":{"type":"string"}},"low_latency_mode":{"type":"boolean","description":"Enables low-latency mode using scatter-gather DMA."},"timestep":{"type":"number","default":0.01,"description":"The simulation timestep in seconds."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-iec60870-5-104-signal":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec60870-5-104":{"title":"IEC 60870-5-104","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"iec60870-5-104"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"address":{"type":"string","default":"localhost","description":"Hostname or IP address for the IEC60870 slave to listen on.\n"},"port":{"type":"integer","default":2404,"description":"Port number of the IEC60870 slave.\n"},"ca":{"type":"integer","default":1,"description":"Common Address of the IEC60870 slave.\n"},"low_priority_queue":{"type":"integer","default":100,"description":"Message queue size for the periodic messages (increase on dropped simulation data messages).\n"},"high_priority_queue":{"type":"integer","default":100,"description":"Message queue size for interrogation responses (increase on missing signals in interrogation response).\n"},"apci_t0":{"type":"integer"},"apci_t1":{"type":"integer"},"apci_t2":{"type":"integer"},"apci_t3":{"type":"integer"},"apci_k":{"type":"integer"},"apci_w":{"type":"integer"},"out":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"duplicate_ioa_is_sequence":{"type":"boolean","default":false,"description":"Treat consecutive signals with the same IOA as a sequence by assigning subsequent IOAs.\n"},"signals":{"type":"array","items":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec60870-5-104-signal":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-iec61850-8-1-publisher-data":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false},"node-iec61850-8-1-key":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber-signal":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false},"node-iec61850-8-1-publisher":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-iec61850-8-1":{"title":"IEC 61850-8-1 (GOOSE)","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"iec61850-8-1"},"keys":{"type":"array","description":"Session keys used for R-GOOSE (routed GOOSE).\n","items":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false}},"in":{"type":"object","required":["subscribers","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"subscribers":{"type":"object","additionalProperties":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false}},"routed":{"type":"boolean","default":false,"description":"Use R-GOOSE (routed GOOSE) instead of layer 2 GOOSE.\n"},"local_address":{"type":"string","default":"localhost","description":"Local address to bind to for R-GOOSE.\n"},"local_port":{"type":"integer","default":102,"description":"Local port to bind to for R-GOOSE.\n"},"multicast_groups":{"type":"array","items":{"type":"string"},"description":"Multicast groups to join for R-GOOSE.\n"},"interface":{"type":"string","default":"lo","description":"Name of the ethernet interface to receive on (layer 2 GOOSE).\n"},"with_timestamp":{"type":"boolean","default":true}},"additionalProperties":false},"out":{"type":"object","required":["publishers"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"publishers":{"type":"array","items":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"routed":{"type":"boolean","default":false,"description":"Use R-GOOSE (routed GOOSE) instead of layer 2 GOOSE.\n"},"local_address":{"type":"string","default":"localhost","description":"Local address to bind to for R-GOOSE.\n"},"local_port":{"type":"integer","default":0,"description":"Local port to bind to for R-GOOSE.\n"},"remote_address":{"type":"string","default":"localhost","description":"Remote address to send to for R-GOOSE.\n"},"remote_port":{"type":"integer","default":102,"description":"Remote port to send to for R-GOOSE.\n"},"key_id":{"type":"integer","description":"The id of the session key (see 'keys') to use for R-GOOSE.\n"},"interface":{"type":"string","default":"lo","description":"Name of the ethernet interface to send on (layer 2 GOOSE).\n"},"resend_interval":{"type":"number","description":"Time interval for periodic resend of last sample in floating point seconds.\n"}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec61850-8-1-key":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false},"node-iec61850-8-1-subscriber-signal":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-8-1-publisher":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-iec61850-8-1-publisher-data":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"node-iec61850-9-2-signal":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-9-2":{"title":"IEC 61850-9-2 (Sampled Values)","type":"object","required":["type","interface"],"properties":{"type":{"type":"string","const":"iec61850-9-2"},"interface":{"type":"string","description":"Name of network interface to/from which this node will publish/subscribe for SV frames."},"app_id":{"type":"integer","default":16384},"dst_address":{"type":"string","default":"01:0c:cd:01:00:01"},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"check_dst_address":{"type":"boolean","default":false},"signals":{"type":"array","minItems":1,"items":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["signals","sv_id"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"sv_id":{"type":"string"},"conf_rev":{"type":"integer"},"smp_mod":{"type":"string","enum":["per_nominal_period","samples_per_second","seconds_per_sample"]},"smp_synch":{"type":"string","enum":["not_synchronized","local_clock","global_clock"]},"smp_rate":{"type":"integer"},"vlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":true},"id":{"type":"integer","default":0},"priority":{"type":"integer","default":4}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec61850-9-2-signal":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-infiniband":{"title":"InfiniBand (RDMA) node-type","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"infiniband"},"rdma_transport_mode":{"type":"string","enum":["RC","UC","UD"],"default":"RC","description":"This specifies the type of connection the node will set up.\n\n* `RC` provides reliable, connection-oriented, message based communication between the nodes. Packets are delivered in order. In this mode, one Queue Pair is connected to one other Queue Pair.\n* `UC` provides unreliable, connection-oriented, message based communication between the nodes. This service type is not officially supported by the RDMA communication manager and is implemented for scientific purposes in VILLASnode. [The InfiniBand node-type source code provides information on how to enable this service type.](https://git.rwth-aachen.de/acs/public/villas/node/blob/master/lib/nodes/infiniband.c#L429)\n* `UD` provides unreliable, connection-less, datagram communication between nodes. Both ordering and delivery are not guaranteed in this mode.\n\n`RC`, `UC`, and `UD` are mapped to the Queue Pair types as `RDMA_PS_TCP`/`IBV_QPT_RC`, `RDMA_PS_IPOIB`/`IBV_QPT_UC`, and `RDMA_PS_UDP`/`IBV_QPT_UD`, respectively.\nIf two nodes should be connected, both should be set to the same `rdma_transport_mode`.\n\nMore information on these two modes can be found on the manual page for [`rdma_create_id()`](https://linux.die.net/man/3/rdma_create_id).\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"Connections between `infiniband` nodes are established over IP over IB (IPoIP).\nTo use this node, you have to make sure that the linux driver `ib_ipoib` is loaded.\nIf it is not loaded, load it with `modprobe ib_ipoib`.\n\nIf it is loaded, you have to make sure that the Host Channel Adapters (HCAs) have an IP address.\nYou can configure the IP address of the Infiniband HCA with the `ifconfig` utility, exactly like you would configure normal Ethernet adapters.\n\nAs soon as an IP is set for the local HCA, this entry can be used to point to the adapter and to define the port which will be used for connection related communication.\n\n**Example**:\n\n```\nin = {\n address=\"10.0.0.1:1337\"\n}\n```\n\nbinds the node to the local device which is bound to `10.0.0.1`. It will use port `1337` for communication related to the connection.\n"},"max_wrs":{"type":"integer","default":128,"description":"Before a packet can be received with Infiniband, the application has to describe how this will be handled (e.g., to what address the data will be written).\nThis happens in a so called Work Request (WR).\n\n`in.max_wrs` sets the maximum number of receive Work Requests which can be posted to the receive queue of the Queue Pair.\n\nFor higher throughput, it is recommended to increase this value since it will serve as a buffer.\n"},"cq_size":{"type":"integer","default":128,"description":"This value defines the number of Work Completions the Completion Queue can hold.\n\nIf a packet is received, the Queue Pair will write a Work Completion to the Completion Queue.\nThe node polls this queue to process received packets. If the Completion Queue gets full, which is often caused by `cq_size` being to small, and thus the receive queue is not able to post Work Completions, the node will abort.\n\nIf a connection is disconnected, all outstanding Work Requests—even is they are not used—are flushed to the Completion Queue.\nHere applies the same as mentioned above: if the Completion Queue has fewer space left than outstanding Work Requests are available, this will result in an error.\n\nIt is therefor recommended to set the value of `cq_size` to at least\n\n```\nin.cq_size >= in.max_wrs - in.buffer_subtraction\n```\n"},"buffer_subtraction":{"type":"integer","default":16,"description":"As mentioned in the `in.max_wrs` settings, Work Requests have to be present in the receive queue, for it to be able to process received data.\nTo take full advantage of the zero-copy capabilities of Infiniband this node-type directly posts addresses from the VILLASnode to the receive queue instead of copying all data over after receiving it.\n\nThis technique relies on the exchange of addresses. This means that if an array of `in.vectorize` addresses is handed over to the node-type, max `release` <= `in.vectorize` addresses that point to received data can be returned.\n\nFurthermore, if `release` addresses should be returned, `release` addresses from the original array must be posted to the receive queue.\nTo ensure that we can always post at least `in.vectorize` new samples to the receive queue, `in.buffer_subtraction` must always be bigger than `in.vectorize`.\n\nA second factor is performance: if `in.buffer_subtraction` is too small it might take long before the node starts to process data since it has to fill almost the complete queue first.\nIf `in.buffer_subtraction` is too big, the receive buffer might be too small.\n\nThus, the maximum number of Work Requests to be present in the receive queue is defined as follows:\n\n```c\nmax_wrs_posted = in.max_wrs - in.buffer_subtraction\n```\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"This value defines the IPoIB address of the remote node and is used to establish a connection to the remote host—in case of `RDMA_PS_TCP`—or to get the address handle of the remote host—in case of `RDMA_PS_UDP`.\n\nThis is similar to `in.address`.\n\n`out.address` has no default value and if it is not defined the node will be set to listening mode and all `out` configuration will be ignored.\n\n**Example**:\n\n```\nout = {\n address = \"10.0.0.1:1337\"\n}\n```\n"},"resolution_timeout":{"type":"integer","default":1000,"description":"This defines the time in milliseconds [`rdma_resolve_addr()`](https://linux.die.net/man/3/rdma_resolve_addr) waits for the resolution of the destination address to complete.\n"},"max_wrs":{"type":"integer","default":128,"description":"This is similar to `in.max_wrs` but for the send side of the Queue Pair.\nIn contrast to the receive queue, there is no minimum amount of Work Requests in this queue and it can be filled up completely to `out.max_wrs`.\n"},"cq_size":{"type":"integer","default":128,"description":"This is similar to `in.cq_size`.\n\nAn important side note for the receive completion queue was that it should be able to hold all Work Requests if the receive queue is flushed.\nSince no \"preparatory\" Work Requests are posted to the send queue and and thus all work requests are send out as soon as possible, there is no need for `out.cq_size` to be as big as `out.max_wrs`.\n"},"send_inline":{"type":"boolean","default":true,"description":"It is possible that the CPU copies the data to be sent directly to the HCA.\nThen, the HCA can take the data from it's internal memory as soon as it is ready to send it.\nThis has the advantage that the buffer can be returned immediately to the VILLASnode and that it increases performance.\n\nIf this flag is set, the [`infiniband`](../nodes/infiniband.md) node-type checks if a sample is small enough to be sent inline, and if this is the case sends it inline.\n"},"max_inline_data":{"type":"integer","default":0,"description":"This value represents the maximum number of bytes to be send inline.\nThe maximum number of this value depends on the HCA.\nThe settings defaults to zero. However, many HCAs will automatically adjust it to 60.\n\n*Important note*: The greater this value gets, the smaller `out.max_wrs` can be. If `out.max_inline_data` is too big for the number specified in `out.max_wrs`, the node will return an error that the Queue Pair could not be created.\nSince this is different for various HCAs, it is not possible for us to give more specified errors.\n\n**Example**:\n\n```\nout = {\n send_inline = 1,\n max_inline_data = 60\n}\n```\n\nEvery sample which is smaller than 60 bytes will be send inline. All other samples will be sent normally.\n"},"use_fallback":{"type":"boolean","default":true,"description":"If an out section with a valid remote entry is present in the configuration file, the node will first bind to the local host channel adapter and subsequentially try to connect to the remote host.\nIf the latter fails (e.g., because the remote host was not reachable or rejected the connection), there are two possible outcomes: the node can throw an error and abort or it can show a warning and continue in listening mode.\n\nIf `use_fallback = true`, the node will fallback to listening mode if it is not able to connect to the remote host.\n"},"periodic_signaling":{"type":"integer","default":"","description":"If a sample is sent inline, no Completion Queue Entry (CQE) is generated.\nHowever, once a while, a CQE must be generated to prevent the Send Queue from overflowing.\nTherefore, every `out.periodic_signaling`th sample will be sent normally with signaling.\n\nIt turns out that the ideal value in most cases is `out.max_wrs / 2`.\nHence, usually, it is not necessary to explicitly set this value.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-influxdb":{"title":"InfluxDB","type":"object","required":["type","server","key"],"properties":{"type":{"type":"string","const":"influxdb"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"server":{"type":"string","description":"A hostname/port combination of the InfluxDB database server."},"key":{"type":"string","description":"The key is the measurement name and any optional tags separated by commas.\n\nSee also: [InfluxDB documentation](https://docs.influxdata.com/influxdb/v0.9/write_protocols/line/#key).\n"},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-kafka":{"type":"object","required":["type","server","protocol"],"properties":{"type":{"type":"string","const":"kafka"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"server":{"type":"string","description":"The bootstrap server `{ip}:{port}` of the Kafka message brokers cluster.\n"},"protocol":{"type":"string","enum":["PLAINTEXT","SASL_PLAINTEXT","SASL_SSL","SSL"],"description":"The [security protocol](https://kafka.apache.org/24/javadoc/org/apache/kafka/common/security/auth/SecurityProtocol.html) which is used for authentication with the Kafka cluster.\n"},"client_id":{"type":"string","default":"villas-node","description":"The Kafka client identifier."},"timeout":{"type":"number","description":"A timeout in seconds for the broker connection.","default":1},"ssl":{"type":"object","required":["ca"],"properties":{"ca":{"type":"string","description":"Path to a Certificate Authority (CA) bundle which is used to validate broker server certificate."}},"additionalProperties":false},"sasl":{"type":"object","description":"An object for configuring the SASL authentication against the broker.\nThis setting is used if the `protocol` setting is on of `SASL_PLAINTEXT` or `SASL_SSL`.\n","required":["mechanisms","username","password"],"properties":{"mechanisms":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"consume":{"type":"string","description":"The Kafka topic to which this node-type will subscribe for receiving messages."},"group_id":{"type":"string","description":"The group id of the Kafka client used for receiving messages."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"produce":{"type":"string","description":"The Kafka topic to which this node-type will publish messages."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-loopback":{"title":"Loopback","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"loopback"},"queuelen":{"type":"integer","minimum":0,"description":"The queue length of the internal queue which buffers the samples."},"mode":{"type":"string","enum":["pthread","polling","eventfd","auto"],"default":"auto","description":"Specify the synchronization mode of the internal queue."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-modbus-signal":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-modbus":{"title":"Read and write Modbus registers","type":"object","required":["type","transport"],"properties":{"type":{"type":"string","const":"modbus"},"transport":{"type":"string","description":"The transport protocol used for Modbus communication.","enum":["tcp","rtu"]},"response_timeout":{"type":"number","description":"The timeout in seconds when waiting for responses from a Modbus server.","default":1,"example":1},"reconnect_interval":{"type":"number","description":"The interval in seconds for trying to reconnect on connection loss.","default":10},"min_block_usage":{"type":"number","description":"The minimum ratio of used registers to queried registers for a merged block of registers.\nThis caps the amount of unnecessary data transmitted.\n","default":0.25},"max_block_size":{"type":"integer","description":"The maximum size (in registers) of a merged block of register mappings.","default":32},"rate":{"type":"number","description":"The rate at which Modbus device registers are queried for changes.","example":1},"remote":{"type":"string","description":"The hostname or IP of the Modbus TCP device. Only used with `transport = tcp`.","example":"example.com"},"port":{"type":"integer","description":"The port number of the Modbus TCP device. Only used with `transport = tcp`.","default":502},"device":{"type":"string","description":"Path to the serial device file. Only used with `transport = rtu`.","example":"/dev/ttyS0"},"baudrate":{"type":"integer","description":"The baudrate used for serial communication. Only used with `transport = rtu`.","example":9600},"parity":{"type":"string","enum":["none","even","odd"],"description":"The parity used for serial communication. Only used with `transport = rtu`.","example":"none"},"data_bits":{"type":"integer","description":"The data bits used for serial communication. Only used with `transport = rtu`.","minimum":5,"maximum":8,"example":5},"stop_bits":{"type":"integer","description":"The stop bits used for serial communication. Only used with `transport = rtu`.","minimum":1,"maximum":2,"example":1},"unit":{"type":"integer","description":"The addressed unit used for communication. Optional for TCP.","minimum":0,"maximum":65535,"example":1},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-modbus-signal":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-mqtt":{"type":"object","required":["type","host"],"properties":{"type":{"type":"string","const":"mqtt"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"username":{"type":"string","description":"The username which is used for authentication with the MQTT broker."},"password":{"type":"string","description":"The password which is used for authentication with the MQTT broker."},"host":{"type":"string","description":"The hostname of the MQTT broker.","example":"example.com"},"port":{"type":"integer","description":"The port number of the MQTT broker.","default":1883},"retain":{"type":"boolean","description":"Set to true to make the will a retained message.","default":false},"keepalive":{"type":"integer","default":5,"description":"The MQTT keepalive value."},"qos":{"type":"integer","default":0,"description":"The quality of service (QoS) to use for the subscription."},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean","default":true},"insecure":{"type":"boolean"},"cafile":{"type":"string","description":"Path to a file containing the PEM encoded trusted CA certificate file."},"capath":{"type":"string","description":"Path to a directory containing the PEM encoded trusted CA certificate files."},"certfile":{"type":"string","description":"Path to a file containing the PEM encoded certificate file for this client."},"keyfile":{"type":"string","description":"Path to a file containing the PEM encoded private key for this client."},"cipher":{"type":"string","description":"A string describing the ciphers available for use. See the `openssl ciphers` tool for more information."},"verify":{"type":"boolean","default":true,"description":"Configure verification of the server hostname in the server certificate.\nIf value is set to true, it is impossible to guarantee that the host you are connecting to is not impersonating your server.\nThis can be useful in initial server testing, but makes it possible for a malicious third party to impersonate your server through DNS spoofing, for example.\nDo not use this function in a real system.\nSetting value to true makes the connection encryption pointless.\n"},"tls_version":{"type":"string","enum":["tlsv1","tlsv1.1","tlsv1.2"],"description":"The version of the SSL/TLS protocol to use as a string.\nIf not set, the default value is used. The default value and the available values depend on the version of openssl that the library was compiled against.\nFor openssl >= 1.0.1, the available options are tlsv1.2, tlsv1.1 and tlsv1, with tlv1.2 as the default.\nFor openssl < 1.0.1, only tlsv1 is available.\n"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subscribe":{"type":"string","description":"Topic to which this node subscribes."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"publish":{"type":"string","description":"Topic to which this node publishes."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-nanomsg":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"nanomsg"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"endpoints":{"description":"A single endpoint URI or list of URIs to which this node should connect as a subscriber.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"endpoints":{"description":"A single endpoint URI or list of URIs on which this node should listen for subscribers.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-ngsi-signal":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-ngsi":{"title":"FIWARE NGSI 9/10","type":"object","required":["type","endpoint","entity_id","entity_type"],"properties":{"type":{"type":"string","const":"ngsi"},"endpoint":{"type":"string","format":"uri"},"entity_id":{"type":"string","description":"ID of NGSI entity."},"entity_type":{"type":"string","description":"Type of NGSI entity."},"ssl_verify":{"type":"boolean","default":true,"description":"Verify SSL certificate against local trust store."},"timeout":{"description":"Timeout in seconds for HTTP requests.","type":"number","default":1},"rate":{"description":"Polling rate in Hz for requesting entity updates from broker.","type":"number","default":1},"access_token":{"type":"string","description":"Send 'Auth-Token' header with every HTTP request."},"create":{"type":"boolean","default":true,"description":"Create NGSI entities during startup of node."},"delete":{"type":"boolean","default":true,"description":"Remove NGSI entities during shutdown of node."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-ngsi-signal":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-opal_async":{"title":"OPAL-RT Asynchronous Process","type":"object","required":["type","id"],"properties":{"type":{"type":"string","const":"opal.async"},"id":{"description":"The Send/Recv ID of the RT-Lab OpAsyncSend/Recv blocks.","minimum":1,"default":1,"type":"integer"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"reply":{"description":"Send a confirmation to the Simulink model that signals have been received and processed.","default":false,"type":"boolean"}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"opal-orchestra-connection-local":{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},"opal-orchestra-connection-remote":{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},"opal-orchestra-connection-dolphin":{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false},"opal-orchestra-connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"node-opal_orchestra-signal":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-opal_orchestra":{"title":"OPAL-RT Orchestra","type":"object","required":["type","domain"],"properties":{"type":{"type":"string","const":"opal.orchestra"},"domain":{"type":"string","description":"The name of the domain to which the connection is requested. This domain must exist in the DDF read by an RT-LAB subsystem."},"synchronous":{"type":"boolean","description":"Determines whether domain participants exchange simulation data synchronously or asynchronously."},"states":{"type":"boolean"},"connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"ddf":{"type":"string","description":"The path to the DDF file that describes the data exchanged in the specified domain."},"connect_timeout":{"default":"5s","description":"The duration after which a failed connection attempt times out.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"flag_delay":{"default":"0s","description":"Forces the local Orchestra communication to be made with flags instead of semaphores when using an external communication process. Flags are recommended for better performance: they are faster but also more CPU-consuming.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"flag_delay_tool":{"description":"Forces the local Orchestra communication to be made with flags instead of semaphores when using an external communication process. Flags are recommended for better performance: they are faster but also more CPU-consuming.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"skip_wait_to_go":{"type":"boolean","default":false,"description":"Sets the WaitToGo setting of the model. When true, VILLASnode ignores the WaitToGo during the connection step. When false, VILLASnode performs the WaitToGo during the connection step."},"ddf_overwrite":{"type":"boolean","default":false,"description":"If true, the DDF file provided in the 'dff' setting will be overwriting with settings and signals from the VILLASnode configuration."},"ddf_overwrite_only":{"type":"boolean","default":false,"description":"If true, VILLASnode will overwrite the file provided in the 'ddf' setting, and terminate immediately afterwards."},"rate":{"type":"number","default":1,"description":"In asynchronous mode (see 'synchronous' setting), this rate defines how often per second the data exchange with the Orchestra domain takes place."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"opal-orchestra-connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"opal-orchestra-connection-local":{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},"opal-orchestra-connection-remote":{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},"opal-orchestra-connection-dolphin":{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false},"node-opal_orchestra-signal":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-opendss":{"title":"Interface to OpenDSS, EPRI's Distribution System Simulator","type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"opendss"},"file_path":{"type":"string","description":"Specifies the URI to a OpenDSS file.\n"},"in":{"type":"object","required":["list"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"list":{"type":"array","items":{"type":"object","required":["name","type","data"],"properties":{"name":{"type":"string","description":"Name of the element.\n"},"type":{"type":"string","description":"Type of the element.\n"},"data":{"type":"array","description":"Data to be input. Possible options depend on the element type.\n","items":{"type":"string"}}},"oneOf":[{"title":"Load or generator","properties":{"type":{"type":"string","enum":["load","generator"]},"data":{"type":"array","items":{"enum":["kV","kW","kVar","Pf"]}}},"additionalProperties":true},{"title":"Current source","properties":{"type":{"type":"string","const":"isource"},"data":{"type":"array","items":{"enum":["Amps","AngleDeg","Frequency"]}}},"additionalProperties":true}],"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["list"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"list":{"description":"Names of the monitors to be read.\n","type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false},"node-redis":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"redis"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"mode":{"type":"string","enum":["key","set-get","hash","hset-hget","channel","pub-sub"],"default":"key","description":"- `key`: [Get](https://redis.io/commands/get)/[Set](https://redis.io/commands/set) of [Redis strings](https://redis.io/topics/data-types#strings)\n - The implementation uses the Redis `MSET` and `MGET` commands.\n- `hash`: Hashtables using [hash data-type](https://redis.io/topics/data-types#hashes)\n - The implementation uses the Redis `HMSET` and `HGETALL` commands.\n- `channel`: [Publish/subscribe](https://redis.io/topics/pubsub)\n - The implementation uses the Redis `PUBLISH` and `SUBSCRIBE` commands.\n"},"uri":{"type":"string","format":"uri","description":"A Redis connection URI in the form of: `redis://:@:/`.\n"},"host":{"type":"string","default":"localhost","description":"The hostname or IP address of the Redis server.\n\nYou can also connect to Redis server with a URI:\n\n- `tcp://[[username:]password@]host[:port][/db]`\n- `unix://[[username:]password@]path-to-unix-domain-socket[/db]`\n"},"port":{"type":"integer","description":"The port number of the Redis server to connect to.","default":6379},"path":{"type":"string","description":"A path of a Unix socket which should be used for the connection."},"user":{"type":"string","default":"default","description":"The username which should be used for authentication.\n\nSee: https://redis.io/commands/auth\n"},"password":{"type":"string","description":"The password which should be used for authentication.\n\nSee: https://redis.io/commands/auth\n"},"db":{"type":"integer","default":0,"description":"The logical database which should be used by the Redis client.\n\nSee: https://redis.io/commands/select\n"},"timeout":{"type":"object","properties":{"connect":{"type":"number","description":"The timeout in seconds for the initial connection establishment."},"socket":{"type":"number","description":"The timeout in seconds for executing commands against the Redis server."}},"additionalProperties":false},"keepalive":{"type":"boolean","default":false,"description":"Enable periodic keepalive packets."},"rate":{"type":"number","description":"The rate in Hertz at which this node polls the Redis server for new values."},"key":{"type":"string","default":"","description":"The key which this node will use in the Redis keyspace."},"channel":{"type":"string","default":"","description":"The channel which this node will use when `mode` setting is `channel`."},"notify":{"type":"boolean","default":true,"description":"Use [Redis keyspace notifications](https://redis.io/topics/notifications) to listen for new updates.\nThis setting is only used if setting `mode` is set to `key` or `hash`.\n"},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"If enabled the connection to the Redis server will be encrypted via SSL/TLS."},"cacert":{"type":"string","description":"A path to a CA certificate file."},"cacertdir":{"type":"string","description":"A path to a directory containing CA certificates."},"cert":{"type":"string","description":"A path to a client certificate file."},"key":{"type":"string","description":"A path to the private key file."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-rtp":{"type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"rtp"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"rtcp":{"type":"boolean","description":"Enable Real-time Control Protocol (RTCP)"},"aimd":{"type":"object","properties":{"a":{"type":"number","default":10},"b":{"type":"number","default":0.5},"Kp":{"type":"number","default":1},"Ki":{"type":"number","default":0},"Kd":{"type":"number","default":0},"rate_min":{"type":"number","default":1},"rate_source":{"type":"number","default":2000},"rate_init":{"type":"number"},"log":{"type":"string"},"hook_type":{"type":"string","default":"disabled","enum":["decimate","limit_rate","disabled"]}},"additionalProperties":false},"in":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The local address and port number this node should listen for incoming packets.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The remote address and port number to which this node will send data.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-shmem":{"title":"Shared Memory","type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"shmem"},"queuelen":{"type":"integer","default":"","description":"Length of the input and output queues in elements."},"mode":{"type":"string","default":"pthread","enum":["pthread","polling"],"description":"If set to `pthread`, POSIX condition variables (CV) are used to signal writes between processes.\nIf set to `polling`, no CV's are used, meaning that blocking writes have to be implemented using polling, leading to performance improvements at a cost of unnecessary CPU usage.\n"},"exec":{"description":"Optional name and command-line arguments (as passed to `execve`) of a command to be executed during node startup.\nThis can be used to start the external program directly from VILLASNode. If unset, no command is executed.\n","type":"array","items":{"type":"string"}},"in":{"type":"object","required":["name"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"name":{"type":"string","description":"Name of the POSIX shared memory object.\nMust start with a forward slash (/).\nThe same name should be passed to the external program somehow in its configuration or command-line arguments.\n"}},"additionalProperties":false},"out":{"type":"object","required":["name"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"name":{"type":"string","description":"Name of the POSIX shared memory object.\nMust start with a forward slash (/).\nThe same name should be passed to the external program somehow in its configuration or command-line arguments.\n"}},"additionalProperties":false}},"additionalProperties":false},"node-signal-type":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},"node-signal-value":{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"node-signal":{"title":"Signal Generator","type":"object","required":["type","signal"],"properties":{"type":{"type":"string","const":"signal"},"signal":{"description":"The type of signal which should be generated.\n\nA single value is applied to all generated signals, or an array with one\nentry per signal may be given (its length must then match `values`).\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n","oneOf":[{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},{"type":"array","items":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]}}]},"values":{"type":"integer","default":1,"description":"The number of signals which each of the generated samples should contain."},"rate":{"type":"number","description":"The rate at which sample should be generated by the node.","default":10},"amplitude":{"default":1,"description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"frequency":{"default":1,"description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"phase":{"default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_width":{"default":1,"description":"The width of the pulse, with respect to the rate","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_low":{"default":0,"description":"The low value of the pulse signal.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_high":{"default":1,"description":"The high value of the pulse signal.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"stddev":{"default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"offset":{"default":0,"description":"Adds a constant offset to each of the generated signals.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"limit":{"type":"integer","default":-1,"description":"Limit the number of generated output samples by this node-type.\nA negative number disables the limitation.\n"},"realtime":{"type":"boolean","default":true,"description":"Wait `1 / rate` seconds between emitting each sample."},"monitor_missed":{"type":"boolean","default":true,"description":"If `true`, the `signal` node-type will count missed steps and warn the user during every iteration about missed steps.\nEspecially at high rates, it can be beneficial for performance to set this flag to `false`.\nWarnings would namely cause system calls which will slow the node down even more, and thus cause even more missed steps.\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-signal-type":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},"node-signal-value":{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}}},"node-signal_v2-signal":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-signal_v2":{"title":"Signal Generator (v2)","type":"object","required":["type","in"],"properties":{"type":{"type":"string","const":"signal.v2"},"realtime":{"type":"boolean","default":true,"description":"Pace the generation of samples by the `rate` setting."},"limit":{"type":"integer","default":-1,"description":"Stop the node after the provided number of samples."},"rate":{"type":"number","default":10,"description":"The rate at which the samples are generated if operating in real-time mode (See `realtime` option)."},"monitor_missed":{"type":"boolean","default":true,"description":"Raise warnings if the signal generator fails to operate in real-time due to missed deadlines."},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-signal_v2-signal":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-socket":{"type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"socket"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"layer":{"type":"string","enum":["udp","ip","eth","unix","local","tcp-client","tcp-server"],"default":"udp","description":"Select the network layer which should be used for the socket. Please note that `eth` can only be used locally in a LAN as it contains no routing information for the internet.\n"},"in":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The local address and port number this node should listen for incoming packets.\n\nUse `*` to listen on all interfaces: `local = \"*:12000\"`.\n"},"verify_source":{"type":"boolean","default":false,"description":"Check if source address of incoming packets matches the remote address.\n"},"multicast":{"type":"object","required":["group"],"properties":{"enabled":{"type":"boolean","default":true,"description":"Weather or not multicast group subscription is active.\n"},"group":{"type":"string","description":"The multicast group. Must be within 224.0.0.0/4\n"},"interface":{"type":"string","description":"The address of the interface which should join the multicast group.\n"},"ttl":{"type":"integer","minimum":0,"default":255,"description":"The time to live for outgoing multicast packets.\n"},"loop":{"type":"boolean","default":false,"description":"Whether or not sent multicast packets should be looped back to the local socket.\n"}},"additionalProperties":false},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The remote address and port number to which this node will send data.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-stats-signal":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-stats":{"title":"Statistics","type":"object","required":["type","rate","in"],"properties":{"type":{"type":"string","const":"stats"},"rate":{"type":"number","description":"A rate in Hz at which the statistics are generated by this node."},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-stats-signal":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-temper":{"title":"PCSensor / TEMPer USB temperature sensors","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"temper"},"calibration":{"type":"object","properties":{"scale":{"type":"number","default":1,"description":"A scaling factor for calibrating the sensor."},"offset":{"type":"number","default":0,"description":"An offset for calibrating the sensor."}},"additionalProperties":false},"bus":{"type":"integer","description":"A filter applied to the USB bus number for selecting a specific sensor if multiple are available."},"port":{"type":"integer","description":"A filter applied to the USB port number for selecting a specific sensor if multiple are available."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-test_rtt":{"title":"Round-trip Time Test","type":"object","required":["type","cases"],"properties":{"type":{"type":"string","const":"test_rtt"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"prefix":{"type":"string","description":"A prefix which is prepended to the output file name of the RTT test result file.","example":"test_1"},"output":{"type":"string","default":".","description":"A directory path at which the RTT test result files be placed."},"shutdown":{"type":"boolean","description":"If set, the node will shut down VILLASnode after all test cases have finished."},"cooldown":{"type":"number","default":0,"description":"A default cool-down time between consecutive test cases.\nThe node will insert a pause between the tests to avoid any network effects of the previous test-case to influence the upcoming test-case.\n"},"warmup":{"type":"number","default":0,"description":"A default warm-up time in seconds before the measurement of each test-case is started.\n"},"rates":{"description":"The default list of sending rates in Hz used by test-cases which do not specify their own `rates`.\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"values":{"description":"The default list of sample lengths used by test-cases which do not specify their own `values`.\n","oneOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"count":{"type":"integer","default":1000,"description":"The default number of samples used by test-cases which do not specify their own `count`.\n"},"duration":{"type":"number","default":300,"description":"The default duration in seconds used by test-cases which do not specify their own `duration`.\n"},"mode":{"type":"string","enum":["min","max","at_least_count","at_least_duration","stop_after_count","stop_after_duration"],"description":"The default mode used by test-cases which do not specify their own `mode`."},"cases":{"type":"array","description":"A list of test-case specifications.\n\nThe values from the `rates` and `values` settings of each test-case specification will be used to form a cross-product.\n","items":{"type":"object","properties":{"rates":{"description":"A list of sending rates in Hz.\nThe resulting test-case will generate samples at the given rate.\n","example":[10,100,1000,10000],"oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"values":{"description":"A list of sample length.\nThe resulting test-case will generate samples with the given number of signals.\n","example":[10,100],"oneOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"count":{"description":"The resulting test-case will send the number of samples specified by this setting.\nThis setting is exclusive with the `duration` setting.\n","type":"integer","example":10000},"duration":{"description":"The resulting test-case will be stopped after the configured duration in seconds.\nThis setting is exclusive with the `count` setting.\n","type":"number","example":60},"mode":{"type":"string","enum":["min","max","at_least_count","at_least_duration","stop_after_count","stop_after_duration"]}},"additionalProperties":false}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-uldaq-signal":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-uldaq":{"title":"Measurement Computing DAQ devices (uldaq)","type":"object","required":["type","in"],"properties":{"type":{"type":"string","const":"uldaq"},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"interface_type":{"type":"string","enum":["usb","bluetooth","ethernet","any"],"description":"The interface to which the ADC is connected. Check manual for your device."},"device_id":{"type":"string","example":"10000","description":"The used device type. If empty it is auto detected."},"in":{"type":"object","description":"Configuration for the ul201","required":["sample_rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"sample_rate":{"type":"number","minimum":0,"default":1000,"example":10000,"description":"The default sampling rate of the input signals."},"range":{"type":"string","enum":["bipolar-60","bipolar-30","bipolar-15","bipolar-20","bipolar-10","bipolar-5","bipolar-4","bipolar-2.5","bipolar-2","bipolar-1.25","bipolar-1","bipolar-0.625","bipolar-0.5","bipolar-0.25","bipolar-0.125","bipolar-0.2","bipolar-0.1","bipolar-0.078","bipolar-0.05","bipolar-0.01","bipolar-0.005","unipolar-60","unipolar-30","unipolar-15","unipolar-20","unipolar-10","unipolar-5","unipolar-4","unipolar-2.5","unipolar-2","unipolar-1.25","unipolar-1","unipolar-0.625","unipolar-0.5","unipolar-0.25","unipolar-0.125","unipolar-0.2","unipolar-0.1","unipolar-0.078","unipolar-0.05","unipolar-0.01","unipolar-0.005"],"description":"The default input range for signals. Check manual for your device.\n\n## Supported ranges\n\n| Value | Min | Max |\n| :--------------- | :------ | :----- |\n| `bipolar-60` | -60.0 | +60.0 |\n| `bipolar-60` | -60.0 | +60.0 |\n| `bipolar-30` | -30.0 | +30.0 |\n| `bipolar-15` | -15.0 | +15.0 |\n| `bipolar-20` | -20.0 | +20.0 |\n| `bipolar-10` | -10.0 | +10.0 |\n| `bipolar-5` | -5.0 | +5.0 |\n| `bipolar-4` | -4.0 | +4.0 |\n| `bipolar-2.5` | -2.5 | +2.5 |\n| `bipolar-2` | -2.0 | +2.0 |\n| `bipolar-1.25` | -1.25 | +1.25 |\n| `bipolar-1` | -1.0 | +1.0 |\n| `bipolar-0.625` | -0.625 | +0.625 |\n| `bipolar-0.5` | -0.5 | +0.5 |\n| `bipolar-0.25` | -0.25 | +0.25 |\n| `bipolar-0.125` | -0.125 | +0.125 |\n| `bipolar-0.2` | -0.2 | +0.2 |\n| `bipolar-0.1` | -0.1 | +0.1 |\n| `bipolar-0.078` | -0.078 | +0.078 |\n| `bipolar-0.05` | -0.05 | +0.05 |\n| `bipolar-0.01` | -0.01 | +0.01 |\n| `bipolar-0.005` | -0.005 | +0.005 |\n| `unipolar-60` | 0.0 | +60.0 |\n| `unipolar-30` | 0.0 | +30.0 |\n| `unipolar-15` | 0.0 | +15.0 |\n| `unipolar-20` | 0.0 | +20.0 |\n| `unipolar-10` | 0.0 | +10.0 |\n| `unipolar-5` | 0.0 | +5.0 |\n| `unipolar-4` | 0.0 | +4.0 |\n| `unipolar-2.5` | 0.0 | +2.5 |\n| `unipolar-2` | 0.0 | +2.0 |\n| `unipolar-1.25` | 0.0 | +1.25 |\n| `unipolar-1` | 0.0 | +1.0 |\n| `unipolar-0.625` | 0.0 | +0.625 |\n| `unipolar-0.5` | 0.0 | +0.5 |\n| `unipolar-0.25` | 0.0 | +0.25 |\n| `unipolar-0.125` | 0.0 | +0.125 |\n| `unipolar-0.2` | 0.0 | +0.2 |\n| `unipolar-0.1` | 0.0 | +0.1 |\n| `unipolar-0.078` | 0.0 | +0.078 |\n| `unipolar-0.05` | 0.0 | +0.05 |\n| `unipolar-0.005` | 0.0 | +0.00 |\n"},"input_mode":{"type":"string","enum":["differential","single-ended","pseudo-differential"],"description":"The default sampling type. Check manual for you device."},"sample_clock_source":{"type":"string","enum":["internal","external"],"description":"The clock source used for sampling."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-uldaq-signal":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-webrtc":{"type":"object","required":["type","session"],"properties":{"type":{"type":"string","const":"webrtc"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"wait_seconds":{"type":"integer","default":0,"description":"Suspend start-up of VILLASnode for some seconds until the connection with the remote peer has been established.\n"},"ordered":{"type":"boolean","default":false,"description":"Indicates if data is allowed to be delivered out of order.\nThe default value of false, does not make guarantees that data will be delivered in order.\n"},"max_retransmits":{"type":"integer","default":0,"description":"Limit the number of times a channel will retransmit data if not successfully delivered.\nThis value may be clamped if it exceeds the maximum value supported.\n"},"session":{"type":"string","title":"Session identifier","description":"A unique session identifier which must be shared between two nodes"},"peer":{"type":"string","title":"Peer identifier","description":"A unique peer identifier within the session. Defaults to the node UUID."},"server":{"type":"string","title":"Signaling Server Address","description":"Address to the websocket signaling server","default":"wss://villas.k8s.eonerc.rwth-aachen.de/ws/signaling"},"ice":{"type":"object","title":"ICE configuration settings","properties":{"servers":{"title":"ICE Servers","description":"A list of ICE servers used for connection establishment","type":"array","items":{"type":"string","format":"uri","title":"STUN & TURN server URI","description":"A valid Uniform Resource Identifier (URI) identifying a STUN or TURN server.\n\nSee [RFC7064](https://datatracker.ietf.org/doc/html/rfc7064) and [RFC7065](https://datatracker.ietf.org/doc/html/rfc7065) for details.\n\nAs an extension to the URI format specified additional username & password can be specified as shown in the examples\n"}},"tcp":{"type":"boolean","title":"Enable ICE over TCP","description":"Whether or not ICE candidates using the TCP transport should be gathered."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-websocket":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"websocket"},"wait_connected":{"default":false,"type":"boolean"},"destinations":{"description":"During startup connect to those WebSocket servers as a client.\n\nEach URI must use the following scheme:\n\n```\nprotocol://host:port/nodename\n```\n\nIt starts with a protocol which must be one of `ws` (unencrypted) or `wss` (SSL).\nThe host name or IP address is separated by `://`.\nThe optional port number is separated by a colon `:`.\nThe node name is separated by a slash `/`.\n","type":"array","items":{"type":"string","format":"uri","description":"A WebSocket URI"}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-zeromq":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"zeromq"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"pattern":{"type":"string","enum":["pubsub","radiodish"],"description":"The ZeroMQ messaging pattern which is used by this node."},"ipv6":{"type":"boolean","default":false},"curve":{"title":"CurveZMQ cryptography","description":"**Note:** This feature is currently broken.\n\nYou can use the [`villas zmq-keygen`](../usage/villas-zmq-keygen.md) command to create a new keypair for the following configuration options:\n","type":"object","required":["public_key","secret_key"],"properties":{"enabled":{"type":"boolean","description":"Whether or not the encryption is enabled."},"public_key":{"type":"string","description":"The public key of the server.\n"},"secret_key":{"type":"string","description":"The secret key of the server.\n"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subscribe":{"description":"A single endpoint URI or list of URIs to which this node should connect as a subscriber.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"filter":{"type":"string","description":"A filter which is used to select messages to receive."},"bind":{"type":"boolean","description":"Whether this node binds to the endpoint instead of connecting to it."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"publish":{"description":"A single endpoint URI or list of URIs on which this node should publish messages.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"filter":{"type":"string","description":"A filter which is prepended to published messages."},"bind":{"type":"boolean","description":"Whether this node binds to the endpoint instead of connecting to it."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}},"path":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}},"config-http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":80,"title":"Listening port","description":"The TCP port number on which HTTP & WebSocket server.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"config-logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"config":{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":80,"title":"Listening port","description":"The TCP port number on which HTTP & WebSocket server.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}},"edgeflex":{"title":"PMU measurements as used in the EdgeFlex project by Manuel","description":"VILLASnode does not support deseralization (yet).\n","type":"object","required":["created"],"properties":{"created":{"title":"Sampling timestamp","description":"A timestamps in miliseconds since 1970-01-01 00:00:00","type":"number","minimum":0}},"additionalProperties":{"description":"Key-value pairs of measurements","anyOf":[{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"object","description":"A complex number represented in real and imaginary components","properties":{"real":{"type":"number"},"imag":{"type":"number"}},"additionalProperties":false}]},"example":{"created":1633791645123,"signal0":123.456,"signal1":true,"signal2":1234,"signal3":{"real":1234.4556,"imag":23232.12312}}},"igor":{"title":"PMU format used by Igor","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"channel":"BUS1-VA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","description":"Name of the monitored bus"},"magnitude":{"type":"number","description":"Amplitude of the measured signal [V]"},"phase":{"type":"number","description":"Phase of the measured signal [radian]"},"frequency":{"type":"number","description":"Frequency of the line signal [Hz]"},"rocof":{"type":"number","description":"Rate of change of frequency [Hz/s]"}},"additionalProperties":false}}},"additionalProperties":false},"sogno-old":{"title":"Original PMU sensor data format as used in the SOGNO EU project","type":"object","required":["device","timestamp","component","measurand","phase","data"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false,"example":{"device":"pmu-abc0","timestamp":"2021-10-07T10:11:12.1231241+02:00","component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123124}},"sogno":{"title":"PMU format used in SOGNO LF project","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false}}},"additionalProperties":false}},"parameters":{"node-uuid-name":{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}},"path-uuid":{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}}},"x-tagGroups":[{"name":"VILLASnode APIs","tags":["super-node","nodes","paths"]},{"name":"Configuration Files","tags":["config"]},{"name":"Format Schemas","tags":["format-edgeflex","format-igor","format-sogno","format-sogno-old"]}]})BUNDLED_SCHEMA"); + static auto const schema = Json::parse(R"BUNDLED_SCHEMA({"openapi":"3.1.1","info":{"title":"VILLASnode API","version":"0.10.0","description":"A HTTP/REST API for controlling VILLASnode remotely without the need to restart the daemon.","termsOfService":"https://www.fein-aachen.org/projects/villas-node/","contact":{"name":"Steffen Vogel","email":"post@steffenvogel.de","url":"https://fein-aachen.org/contact/"},"license":{"name":"Apache-2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"}},"jsonSchemaDialect":"http://json-schema.org/draft-07/schema","servers":[{"url":"https://villas.k8s.eonerc.rwth-aachen.de/api/v2","description":"The production API server in our EONERC OpenStack Kubernetes"},{"url":"http://localhost:8080","description":"Your local host"}],"tags":[{"name":"super-node","x-displayName":"Super Node","description":"Global super-node related operations."},{"name":"nodes","x-displayName":"Nodes","description":"Node related operations."},{"name":"paths","x-displayName":"Paths","description":"Path related operations."},{"name":"config","x-displayName":"VILLASnode configuration file","description":"This section decribes the schema of the VILLASnode configuration file.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"node","x-displayName":"VILLASnode node configuration","description":"This section decribes the schema of a VILLASnode node.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"hook","x-displayName":"VILLASnode hook configuration","description":"This section decribes the schema of the VILLASnode hook.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"format","x-displayName":"VILLASnode format configuration","description":"This section decribes the schema of the VILLASnode hook.\nPlease use the `>` to expand the individual sub-sections.\n\n\n"},{"name":"format-edgeflex","x-displayName":"Edgeflex Format","description":"\n"},{"name":"format-igor","x-displayName":"Igor's Format","description":"\n"},{"name":"format-sogno","x-displayName":"SOGNO Format","description":"\n"},{"name":"format-sogno-old","x-displayName":"Old SOGNO Format","description":"\n"}],"externalDocs":{"url":"https://villas.fein-aachen.org/doc/node.html"},"paths":{"/status":{"get":{"operationId":"get-status","summary":"Get the current status of the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"state":"running","version":"v0.10.0","release":"1.node_uuid_unique_debug.20201015git335440d","build_id":"v0.10.0-335440d-debug","build_date":"20201015","hostname":"ernie","uuid":"c9d64cc7-c6e1-4dd4-8873-126318e9d42c","time_now":1602765814.9240997,"time_started":1602765814.3103526,"timezone":{"name":"CEST","offset":-3600,"dst":true},"kernel":{"sysname":"Linux","nodename":"ernie","release":"5.6.17-rt10","version":"#5 SMP Fri Jul 10 14:02:33 CEST 2020","machine":"x86_64","domainname":"(none)"},"system":{"cores_configured":28,"cores":28,"processes":780,"uptime":1379600,"load":[1.66259765625,1.271484375,1.18701171875],"ram":{"total":269994606592,"free":262204465152,"shared":44191744,"buffer":130211840},"swap":{"total":4294963200,"free":4294963200},"highmem":{"total":0,"free":0}}}}}}}},"400":{"description":"Failure"}}}},"/capabilities":{"get":{"operationId":"get-capabilities","summary":"Get the capabilities of the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"hooks":["average","cast","decimate","dp","drop","dump","ebm","fix","gate","jitter_calc","limit_rate","pps_ts","print","restart","scale","shift_seq","shift_ts","skip_first","stats","ts"],"node-types":["amqp","can","ethercat","example","exec","file","influxdb","kafka","loopback","loopback_internal","mqtt","ngsi","redis","shmem","signal","socket","stats","temper","test_rtt","websocket","zeromq"],"apis":["capabilities","config","node","node/file","node/pause","node/restart","node/resume","node/start","node/stats","node/stats/reset","node/stop","nodes","path","path/start","path/stop","paths","restart","shutdown","status"],"formats":["csv","gtnet","iotagent_ul","json","json.kafka","json.reserve","raw","tsv","value","villas.binary","villas.human","villas.web"]}}}}}},"400":{"description":"Failure"}}}},"/config":{"get":{"operationId":"get-config","summary":"Get the currently loaded configuration.","tags":["super-node"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"nodes":{"udp_node1":{"type":"socket","layer":"udp","in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"}},"web_node1":{"type":"websocket","vectorize":2,"series":[{"label":"Random walk","unit":"V"},{"label":"Sine","unit":"A"},{"label":"Rect","unit":"Var"},{"label":"Ramp","unit":"°C"}]}},"paths":[{"in":["udp_node1"],"out":["web_node1"],"hooks":[{"type":"decimate","ratio":2}]},{"in":["web_node1"],"out":["udp_node1"]}]}}}}}},"400":{"description":"Failure"}}}},"/restart":{"post":{"operationId":"restart","summary":"Restart the VILLASnode instance.","tags":["super-node"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"config":{"oneOf":[{"type":"string","example":"http://example.com/path/to/config.json","title":"URL","description":"An optional path or URI to a new configuration file which\nshould be loaded after restarting the node.\n\nThe file referenced by the URL must be a [VILLASnode configuration file](#tag/config)\n"},{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","fmu":"#/components/schemas/node-fmu","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP/WebSocket server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":8080,"title":"Listening port","description":"The TCP port number on which the HTTP & WebSocket server listens.\nDefaults to 80 when running as root, otherwise 8080.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}}]}}}}}},"responses":{"200":{"description":"Success. The instance has been restarted.","content":{"application/json":{"examples":{"example1":{"value":{"restarts":5,"config":"http://example.com/path/to/config.json"}}}}}},"400":{"description":"Failure"}}}},"/shutdown":{"post":{"operationId":"shutdown","summary":"Shutdown the VILLASnode instance.","tags":["super-node"],"responses":{"200":{"description":"Success. The instance has been shut down."},"400":{"description":"Failure"}}}},"/nodes":{"get":{"operationId":"get-nodes","summary":"Get a list of all configure node instances.","tags":["nodes"],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"schema":{"type":"array","items":{"$ref":"../components/schemas/node.yaml"}},"example1":{"value":[{"name":"udp_node1","uuid":"b3df1d73-f483-f16c-5936-4ea48295615c","state":"running","affinity":-1,"in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"},"type":"socket","layer":"udp"},{"name":"web_node1","uuid":"19c84350-c83a-8a3b-224b-43fa591c8998","state":"running","affinity":-1,"in":{"vectorize":2,"signals":[{"type":"float","enabled":true,"name":"signal0"},{"type":"float","enabled":true,"name":"signal1"},{"type":"float","enabled":true,"name":"signal2"},{"type":"float","enabled":true,"name":"signal3"}]},"out":{"vectorize":2,"signals":[{"type":"float","enabled":true,"name":"signal0"},{"type":"float","enabled":true,"name":"signal1"},{"type":"float","enabled":true,"name":"signal2"}]},"type":"websocket","vectorize":2,"series":[{"label":"Random walk","unit":"V"},{"label":"Sine","unit":"A"},{"label":"Rect","unit":"Var"},{"label":"Ramp","unit":"°C"}]}]}}}}},"400":{"description":"Failure"}}}},"/node/{uuid-or-name}":{"get":{"operationId":"get-node","summary":"Get the information of a specific node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"name":"udp_node1","uuid":"b3df1d73-f483-f16c-5936-4ea48295615c","state":"running","affinity":-1,"in":{"address":"*:12000","signals":{"count":8,"type":"float"}},"out":{"address":"127.0.0.1:12001"},"type":"socket","layer":"udp"}}}}}},"404":{"description":"Error. There is no node with the given UUID or the node does not collect statistics."}}}},"/node/{uuid-or-name}/stats":{"get":{"operationId":"get-node-stats","summary":"Get the statistics of a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success","content":{"application/json":{"examples":{"example1":{"value":{"rtp.jitter":{"low":1.3293196E-316,"high":0,"total":0},"rtp.pkts_lost":{"low":1.3285797E-316,"high":1.3290532E-316,"total":0},"rtp.loss_fraction":{"low":3E-323,"high":1.32907453E-316,"total":0},"age":{"low":1.3288619E-316,"high":1.32909588E-316,"total":0},"owd":{"low":3E-323,"high":3E-322,"total":144,"higher":0,"lower":0,"highest":0.099986117,"lowest":0.09990915800000001,"mean":0.09998063221527778,"variance":7.736879555478282E-11,"stddev":0.000008795953362472019,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"gap_received":{"low":0,"high":1.32743107E-316,"total":144,"higher":0,"lower":0,"highest":0.10000411000000001,"lowest":0.09999650900000001,"mean":0.09999998652777778,"variance":5.701784607620545E-13,"stddev":7.551016228045431E-7,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"gap_sent":{"low":1.58E-321,"high":1.3292848E-316,"total":144,"higher":0,"lower":0,"highest":0.10004273400000001,"lowest":0.09926839700000001,"mean":0.09999436691666665,"variance":3.7637473716438304E-9,"stddev":0.00006134938770390321,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"reordered":{"low":8.28904606E-315,"high":1.32930615E-316,"total":0},"skipped":{"low":1.32879865E-316,"high":1.3293275E-316,"total":0}}}}}}},"404":{"description":"Error. There is no node with the given UUID or the node does not collect statistics."}}}},"/node/{uuid-or-name}/stats/reset":{"post":{"operationId":"reset-node-stats","summary":"Reset the statistics counters for a specific node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The statistics of the node have been reset."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/start":{"post":{"operationId":"start-node","summary":"Start a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been started."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/stop":{"post":{"operationId":"stop-node","summary":"Stop a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been stopped."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/pause":{"post":{"operationId":"pause-graph","summary":"Pause a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been paused."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/resume":{"post":{"operationId":"resume-node","summary":"Resume a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been resumed."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/restart":{"post":{"operationId":"restart-node","summary":"Retart a node.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The node has been restarted."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/file/rewind":{"post":{"operationId":"rewind-file-node","summary":"Rewind the playback file to the beginning.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"responses":{"200":{"description":"Success. The file has been rewound."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/node/{uuid-or-name}/file/seek":{"post":{"operationId":"seek-file-node","summary":"Rewind the playback file to the beginning.","tags":["nodes"],"parameters":[{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}}],"requestBody":{"description":"Sample position in file","required":true,"content":{"application/json":{"schema":{"type":"object","required":["position"],"additionalProperties":false,"properties":{"position":{"type":"integer","example":123,"description":"Skip the first nth samples in the file."}}}}}},"responses":{"200":{"description":"Success. The read-pointer of the file has been changed."},"404":{"description":"Error. There is no node with the given UUID."}}}},"/paths":{"get":{"operationId":"get-paths","summary":"Get a list of all paths.","tags":["paths"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}},"examples":{"example1":{"value":[{"uuid":"251c99af-4b05-9de4-367e-2bb550412e56","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["udp_node1"],"out":["web_node1"]},{"uuid":"61b5674b-95fa-b35f-bff8-c877acf21e3b","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["web_node1"],"out":["udp_node1"]}]}}}}},"400":{"description":"Failure"}}}},"/path/{uuid}":{"post":{"operationId":"get-path","summary":"Get details of a single path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"},"examples":{"example1":{"value":{"uuid":"251c99af-4b05-9de4-367e-2bb550412e56","state":"running","mode":"any","enabled":true,"builtin":true,"reverse":false,"original_sequence_no":true,"last_sequence":false,"poll":false,"queuelen":1024,"signals":[],"hooks":[],"in":["udp_node1"],"out":["web_node1"]}}}}}},"404":{"description":"Error. There is no path with the given UUID."}}}},"/path/{uuid}/start":{"post":{"operationId":"start-path","summary":"Start a path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success. The path has been started."},"404":{"description":"Error. There is no path with the given UUID."}}}},"/path/{uuid}/stop":{"post":{"operationId":"stop-path","summary":"Start a path.","tags":["paths"],"parameters":[{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success. The path has been stopped."},"404":{"description":"Error. There is no path with the given UUID."}}}},"/graph.{format}":{"get":{"operationId":"get-graph","summary":"Get a graph representation of the currently loaded configuration.","tags":["super-node"],"parameters":[{"in":"path","name":"format","schema":{"type":"string","description":"The image format of the generated graph.","enum":["ps","eps","txt","svg","svgz","gif","png","jpg","jpeg","bmp","dot","fig","json","pdf"]}},{"in":"query","name":"layout","schema":{"type":"string","description":"The Graphviz layout engine used for rendering the graph.","enum":["circo","dot","fdp","neato","nop","nop1","nop2","osage","patchwork","sfdp","twopi"]}}],"responses":{"200":{"description":"Success"},"400":{"description":"Failure"}}}}},"components":{"schemas":{"Config":{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","fmu":"#/components/schemas/node-fmu","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP/WebSocket server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":8080,"title":"Listening port","description":"The TCP port number on which the HTTP & WebSocket server listens.\nDefaults to 80 when running as root, otherwise 8080.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}},"Node":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","fmu":"#/components/schemas/node-fmu","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}},"Hook":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}},"Format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"FormatEdgeflex":{"title":"PMU measurements as used in the EdgeFlex project by Manuel","description":"VILLASnode does not support deseralization (yet).\n","type":"object","required":["created"],"properties":{"created":{"title":"Sampling timestamp","description":"A timestamps in miliseconds since 1970-01-01 00:00:00","type":"number","minimum":0}},"additionalProperties":{"description":"Key-value pairs of measurements","anyOf":[{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"object","description":"A complex number represented in real and imaginary components","properties":{"real":{"type":"number"},"imag":{"type":"number"}},"additionalProperties":false}]},"example":{"created":1633791645123,"signal0":123.456,"signal1":true,"signal2":1234,"signal3":{"real":1234.4556,"imag":23232.12312}}},"FormatIgor":{"title":"PMU format used by Igor","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"channel":"BUS1-VA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","description":"Name of the monitored bus"},"magnitude":{"type":"number","description":"Amplitude of the measured signal [V]"},"phase":{"type":"number","description":"Phase of the measured signal [radian]"},"frequency":{"type":"number","description":"Frequency of the line signal [Hz]"},"rocof":{"type":"number","description":"Rate of change of frequency [Hz/s]"}},"additionalProperties":false}}},"additionalProperties":false},"FormatSognoOld":{"title":"Original PMU sensor data format as used in the SOGNO EU project","type":"object","required":["device","timestamp","component","measurand","phase","data"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false,"example":{"device":"pmu-abc0","timestamp":"2021-10-07T10:11:12.1231241+02:00","component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123124}},"FormatSogno":{"title":"PMU format used in SOGNO LF project","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false}}},"additionalProperties":false},"plugin-ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"shared-fpga-card":{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"plugin-fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"shared-format-column-separator":{"title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"shared-format-line-delimiter":{"title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"shared-format-line-comment_prefix":{"title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"shared-format-line-header":{"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"shared-format-line-skip_first_line":{"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"shared-format-real_precision":{"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"shared-format-ts_origin":{"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"shared-format-ts_received":{"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"shared-format-sequence":{"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"shared-format-data":{"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"shared-format-offset":{"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"},"format-csv":{"title":"csv","type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"csv"},"separator":{"default":",","title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":true,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-raw-bits":{"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"shared-format-raw-endianess":{"description":"The endianess of the data.","type":"string","enum":["big","little"]},"shared-format-raw-fake":{"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"format-gtnet":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"gtnet"},"bits":{"default":32,"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"endianess":{"default":"big","description":"The endianess of the data.","type":"string","enum":["big","little"]},"fake":{"default":false,"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-iotagent_ul":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"iotagent_ul"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-json-indent":{"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"shared-format-json-compact":{"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"shared-format-json-ensure_ascii":{"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"shared-format-json-sort_keys":{"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"shared-format-json-escape_slash":{"type":"boolean","default":false,"description":"Escape the `/` characters in strings with `\\/`."},"format-json":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_edgeflex":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.edgeflex"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_kafka":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.kafka"},"schema":{"type":"object","additionalProperties":true},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-json_reserve":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"json.reserve"},"indent":{"default":0,"type":"integer","minimum":0,"maximum":31,"description":"Pretty-print the result, using newlines between array and object items, and indenting with n spaces.\nIf the settings is not used or is 0, no newlines are inserted between array and object items.\n"},"compact":{"default":false,"type":"boolean","description":"This flag enables a compact representation, i.e. sets the separator between array and object items to \",\" and between object keys and values to \":\".\nWithout this flag, the corresponding separators are \", \" and \": \" for more readable output.\n"},"ensure_ascii":{"default":false,"type":"boolean","description":"If this flag is used, the output is guaranteed to consist only of ASCII characters.\nThis is achieved by escaping all Unicode characters outside the ASCII range.\n"},"sort_keys":{"default":false,"type":"boolean","description":"If this flag is used, all the objects in output are sorted by key.\nThis is useful e.g. if two JSON texts are diffed or visually compared.\n"},"escape_slash":{"default":false,"type":"boolean","description":"Escape the `/` characters in strings with `\\/`."},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-opal_asyncip":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"opal.asyncip"},"dev_id":{"default":0,"type":"integer"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-protobuf":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"protobuf"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-raw":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"raw"},"bits":{"default":32,"description":"Number of bits per signal.","type":"integer","enum":[8,16,32,64,128]},"endianess":{"default":"little","description":"The endianess of the data.","type":"string","enum":["big","little"]},"fake":{"default":false,"description":"Send and interpret the first three signals of each sample as the following header fields:\n- sequence number\n- timestamp seconds\n- timestamp nano-seconds\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-tsv":{"title":"tsv","type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"tsv"},"separator":{"default":"\t","title":"Column Separator","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Separator between entries in column-based formats.\n"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":true,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-value":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"value"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":false,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":false,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"shared-format-villas-source_index":{"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"shared-format-villas-validate_source_index":{"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"format-villas_binary":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.binary"},"source_index":{"default":0,"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"validate_source_index":{"default":false,"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-villas_human":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.human"},"delimiter":{"default":"\n","title":"Line Delimiter","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Delimiter following rows in line-based formats.\n"},"comment_prefix":{"default":"#","title":"Line Comment Prefix","type":"string","pattern":"^[\\x00-\\x7F]$","description":"Prefix indicating that a row in line-based format should be treated as a comment.\n"},"header":{"default":true,"title":"First Line Header","type":"boolean","description":"Print a single header-row at the beginning of a line-based format.\n"},"skip_first_line":{"default":false,"title":"Skip First Line","type":"boolean","description":"Skip the first row in a line-based format.\n"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format-villas_web":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"villas.web"},"source_index":{"default":0,"title":"Source Index","description":"VILLASnode source index for outgoing messages.\nThe source index of incoming messages will be verified against this value if `validate_source_index` is enabled.\n","type":"integer","minimum":0},"validate_source_index":{"default":false,"title":"Validate Source Index","description":"Validate the source index of incoming messages.\n","type":"boolean"},"real_precision":{"default":17,"title":"Floating Point Decimal Precision","type":"integer","minimum":0,"maximum":31,"description":"Output all real numbers with at most n digits of precision.\nA precision of 17 is sufficient to correctly and losslessly encode all IEEE 754 double precision floating point numbers.\n"},"ts_origin":{"default":true,"title":"Include Origin Timestamp","type":"boolean","description":"Include a timestamp recorded at a sample's origin.\n"},"ts_received":{"default":false,"title":"Include Received Timestamp","type":"boolean","description":"Include a timestamp recorded when a sample was received by a VILLASnode instance.\n"},"sequence":{"default":true,"title":"Include Sequence Number","type":"boolean","description":"Include the sequence number of a sample.\n"},"data":{"default":true,"title":"Include Data","type":"boolean","description":"Include sample data.\n"},"offset":{"default":false,"title":"Include Timestamp Offset","type":"boolean","description":"Include difference between received and origin timestamp.\n"}}},"format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"shared-node-enabled":{"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"shared-node-builtin":{"type":"boolean","default":true,"title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"shared-node-vectorize":{"type":"integer","minimum":1,"default":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"shared-hook-priority":{"type":"integer","minimum":0},"shared-hook-signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"shared-hook-signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}},"hook-average":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"average"},"offset":{"type":"integer","description":"The signal offset at which the average signal should be inserted.\n\n**Examples:**\n- `0` inserts the averaged signal before all other signals in the sample\n- `1` inserts the averaged signal after the first signal.\n"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-cast":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"cast"},"new_type":{"type":"string","enum":["integer","float","boolean","complex"],"description":"The type of the casted signal.","example":"integer"},"new_name":{"type":"string","description":"The new name of the casted signal.","example":"BusA.V"},"new_unit":{"type":"string","description":"The new unit of the casted signal.","example":"V"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-decimate":{"type":"object","required":["type","ratio"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"decimate"},"ratio":{"type":"integer","description":"The decimation ratio. A value of 4 will skip every, but the 4th sample in a row.","example":4},"renumber":{"type":"boolean","default":false,"description":"Renumber the sequence numbers of the output samples starting from zero."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-digest":{"type":"object","required":["type","uri","algorithm"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"digest"},"uri":{"description":"The output file for digests.","example":"digest.txt","type":"string"},"algorithm":{"description":"The algorithm used for calculating digests.","example":"sha256","type":"string"},"mode":{"description":"The file open mode passed to fopen (e.g. \"w\" to truncate, \"a\" to append).","example":"w","type":"string"},"priority":{"default":999,"type":"integer","minimum":0}}},"hook-dp":{"type":"object","required":["type","f0","harmonics","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"dp"},"f0":{"description":"The fundamental frequency.","example":50,"type":"number"},"dt":{"description":"The timestep of the input samples. Exclusive with `rate` setting.","examples":[0.00005],"type":"number"},"rate":{"description":"The rate of the input samples. Exclusive with `dt` setting.","type":"number"},"harmonics":{"type":"array","minItems":1,"description":"A list of selected harmonics which should be calculated.","example":[0,1,3,5],"items":{"type":"integer"}},"inverse":{"description":"Enable the calucation of the inverse transform.","type":"boolean","default":false},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"description":"The name or index of a signal to which this hook should be applied","oneOf":[{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},{"type":"integer"}]}},"oneOf":[{"required":["dt"]},{"required":["rate"]}]},"hook-drop":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"drop"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-dump":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"dump"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-ebm":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","required":["type","phases"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ebm"},"phases":{"description":"Signal indices for voltage & current values for each phase.","type":"array","items":{"type":"array","minItems":2,"examples":[[0,1],[2,3],[4,5]],"additionalItems":false,"items":[{"title":"Voltage Signal Index","type":"integer"},{"title":"Current Signal Index","type":"integer"}]}},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-fix":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"fix"},"priority":{"default":99,"type":"integer","minimum":0}}},"shared-duration":{"oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"hook-frame":{"type":"object","required":["type","interval"],"properties":{"type":{"type":"string","const":"frame"},"trigger":{"description":"The trigger for new frames.","type":"string","default":"timestamp","enum":["sequence","timestamp"]},"interval":{"description":"The interval in which frames are annotated.","default":"1s","not":{"const":null}},"priority":{"default":10,"type":"integer","minimum":0}},"additionalProperties":false,"oneOf":[{"required":["trigger"],"properties":{"trigger":{"const":"sequence"},"interval":{"type":"integer"}},"additionalProperties":{}},{"properties":{"trigger":{"const":"timestamp"},"interval":{"oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]}},"additionalProperties":{}}]},"hook-gate":{"type":"object","required":["type","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"gate"},"mode":{"description":"The triggering condition at which the gate opens.","type":"string","default":"rising_edge","enum":["above","below","rising_edge","falling_edge"]},"threshold":{"default":0.5,"description":"The threshold the signal needs to overcome before the gate opens.","type":"number"},"duration":{"description":"The number of seconds for which the gate opens when the triggering condition is met. Exclusive with the `samples` setting.","type":"number"},"samples":{"description":"The number if samples for which the gate opens when the triggering condition is met. Exclusive with the `duration` setting.","type":"integer"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"}}},"hook-jitter_calc":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"jitter_calc"},"priority":{"default":0,"type":"integer","minimum":0}}},"hook-limit_rate":{"type":"object","required":["type","rate"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"limit_rate"},"rate":{"type":"number","exclusiveMinimum":0,"description":"The maximum sample rate in `1/s` before this hook will drop samples."},"mode":{"type":"string","default":"local","description":"Timestamp which should be used for rate estimation.","enum":["local","received","origin"]},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-limit_value":{"type":"object","required":["type","min","max"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"limit_value"},"min":{"description":"The smallest value which will pass through the hook before getting clipped.","type":"number"},"max":{"description":"The largest value which will pass through the hook before getting clipped.","type":"number"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"shared-signal-name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"shared-signal-unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"shared-signal-type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"shared-signal-init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"shared-signal-enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"},"hook-lua":{"type":"object","required":["type"],"additionalProperties":{"description":"The Lua hook will pass the complete hook configuration to the `prepare()` Lua function.\nSo you can add arbitrary settings here which are then consumed by the Lua script.\n"},"properties":{"type":{"type":"string","const":"lua"},"use_names":{"type":"boolean","default":true,"description":"Enables or disables the use of signal names in the `process()` Lua function. If disabled, numeric indices will be used."},"script":{"type":"string","description":"Provide the path to a Lua script containing functions for the individual hook points.\nDefine some or all of the following functions in your Lua script:\n\n#### `prepare(cfg)`\n\nCalled during initialization with a Lua table which contains the full hook configuration.\n\n#### `start()`\n\nCalled when the associated node or path is started\n\n#### `stop()`\n\nCalled when the associated node or path is stopped\n\n#### `restart()`\n\nCalled when the associated node or path is restarted.\nFalls back to `stop()` + `start()` if absent.\n\n#### `process(smp)`\n\nCalled for each sample which is being processed.\nThe sample is passed as a Lua table with the following fields:\n\n- `sequence` The sequence number of the sample.\n- `flags` The flags field of the sample.\n- `ts_origin` The origin timestamp as a Lua table containing the following keys:\n| Index | Description |\n|:-- |:-- |\n| 0 | seconds |\n| 1 | nanoseconds |\n\n- `ts_received` The receive timestamp a Lua table containing the following keys:\n| Index | Description |\n|:-- |:-- |\n| 0 | seconds |\n| 1 | nanoseconds |\n\n- `data` The sample data as a Lua table container either numeric indices or the signal names depending on the 'use_names' option of the hook.\n\n#### `periodic()`\n\nCalled periodically with the rate of @ref node-config-stats.\n"},"signals":{"description":"A definition of signals which this hook will emit.\nHere a list of signal definitions like @ref node-config-node-signals is expected.\n","type":"array","items":{"type":"object","required":["expression"],"additionalProperties":{"description":"The Lua hook passes each signal definition to the Lua script.\nYou may add arbitrary custom properties to a signal here which are\nthen available as context to your Lua code (e.g. within `prepare()`\nor `process()`). You are responsible for consuming them in your script.\n"},"properties":{"expression":{"type":"string","example":"math.sqrt(smp.data[0] ^ 2 + smp.data[1] ^ 2)","description":"An arbitrary Lua expression which will be evaluated and used for the value of the signal.\nNote you can access the current sample using the global Lua variable `smp`.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}}}},"priority":{"default":1,"type":"integer","minimum":0}}},"hook-ma":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ma"},"window_size":{"type":"integer","description":"The size of the window (number of samples) which should be used for the moving average filter.","example":100,"default":0,"minimum":0},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-pmu_dft":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"pmu_dft"},"sample_rate":{"type":"integer","default":0,"minimum":0,"example":10000,"description":"The sampling rate of the input signal."},"start_frequency":{"type":"number","minimum":0,"example":49.7,"description":"The lowest frequency bin."},"end_frequency":{"type":"number","example":50.3,"minimum":0,"description":"The highest frequency bin."},"frequency_resolution":{"type":"number","example":0.1,"minimum":0,"description":"The frequency resolution of the DFT."},"dft_rate":{"type":"integer","example":1,"minimum":1,"description":"The number of phasor calculations performed per second."},"window_size_factor":{"type":"integer","default":1,"description":"A factor that increases the automatically determined window size by a multiplicative factor."},"window_type":{"type":"string","enum":["flattop","hamming","hann","none"],"default":"none","description":"The window type."},"padding_type":{"type":"string","enum":["zero","signal_repeat"],"default":"none","description":"The padding type."},"estimate_type":{"type":"string","enum":["quadratic"],"default":"none","description":"The frequency estimation type."},"pps_index":{"type":"integer","description":"The signal index of the PPS signal. This is only needed if data dumper is active.","default":0},"angle_unit":{"type":"string","enum":["rad","degree"],"default":"rad","description":"The unit of the phase angle."},"add_channel_name":{"type":"boolean","default":false,"description":"Adds the name of the channel as a suffix to the signal name e.g `amplitude_ch1`."},"timestamp_align":{"enum":["left","center","right"],"default":"center","description":"The timestamp alignment in respect to the the window."},"phase_offset":{"type":"number","default":0,"example":10,"description":"An offset added to a calculated phase."},"amplitude_offset":{"type":"number","default":0,"example":10,"description":"An offset added to the calculated amplitude."},"frequency_offset":{"type":"number","default":0,"example":0.2,"description":"An offset added to the calculated frequency."},"rocof_offset":{"type":"number","default":0,"example":1,"description":"An offset added to the calculated RoCoF. This setting does not really make sense but is available for completeness reasons"},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-pps_ts":{"type":"object","required":["type","signal"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"pps_ts"},"mode":{"type":"string","enum":["simple","horizon"],"default":"simple","description":"The synchronization mode. The `horizon` mode is currently no recommended to use as it is not fully tested."},"threshold":{"type":"number","default":1.5,"description":"The signal level threshold of the PPS signal which is used to detect an edge."},"expected_smp_rate":{"type":"number","default":1,"description":"The expected sampling rate of the input signal. Only important for a faster initialization."},"horizon_estimation":{"type":"integer","default":10},"horizon_compensation":{"type":"integer","default":10},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"}}},"hook-print":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"print"},"output":{"type":"string","default":"/dev/stdout","description":"An optional path to a file to which the samples processed by this hook will be written to."},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"prefix":{"type":"string","default":"","description":"An optional prefix which will be prepended to each line written by this hook to the output"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-reorder_ts":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"reorder_ts"},"window_size":{"type":"integer","default":16,"minimum":1,"description":"The number of samples buffered for reordering."},"priority":{"default":2,"type":"integer","minimum":0}}},"hook-restart":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"restart"},"priority":{"default":1,"type":"integer","minimum":0}}},"hook-rms":{"type":"object","required":["type","window_size"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"rms"},"window_size":{"type":"integer","description":"The size of the window (number of samples) which should be used for the moving average filter.","example":100,"minimum":1},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-round":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"round"},"precision":{"type":"integer","default":1,"example":4,"description":"The number of decimal digits to which the signal is rounded."},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-scale":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"scale"},"offset":{"type":"number","default":0,"example":100.5,"description":"The offset which is added to the signal after gain."},"scale":{"type":"number","default":1,"example":1000,"description":"The factor by which the signal is multiplied before the offset is added."},"priority":{"default":99,"type":"integer","minimum":0},"signal":{"type":"string","description":"The name of a signal to which this hook should be applied","example":"busA.V"},"signals":{"type":"array","minItems":1,"description":"A list of signal names to which a hook should be applied.","example":["busA.V","busB.V","busC.V"],"items":{"type":"string","description":"The name of a signal to which a hook should be applied."}}},"oneOf":[{"required":["signals"]},{"required":["signal"]}]},"hook-shift_seq":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"shift_seq"},"offset":{"type":"integer","description":"The offset which is added to the sequence number of each processed sample."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-shift_ts":{"type":"object","required":["type","offset"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"shift_ts"},"mode":{"type":"string","enum":["origin","received"],"description":"The timestamp field which should be adjusted by the `offset` setting."},"offset":{"type":"number","description":"The offset in seconds which is added to the timestamp field of each processed sample."},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-skip_first":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"skip_first"},"samples":{"type":"integer","description":"The number of samples which should be dropped by this hook after a start or restart of the node/path."},"seconds":{"type":"number","description":"The number of seconds for which this hook should initially drop samples after a start or restart of the node/path."},"priority":{"default":99,"type":"integer","minimum":0}},"oneOf":[{"required":["samples"]},{"required":["seconds"]}]},"hook-stats":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"stats"},"format":{"type":"string","enum":["human","json","matlab"]},"buckets":{"type":"integer","default":20,"description":"The number of buckets which should be used for the underlying histograms."},"warmup":{"type":"integer","default":500,"description":"Use the first `warmup` samples to estimate the bucket range of the underlying histograms."},"verbose":{"type":"boolean","default":false,"description":"Include full dumps of the histogram buckets into the output."},"output":{"type":"string","description":"The file where you want to write the report to. If omitted, stdout (the terminal) will be used.","default":"/dev/stdout"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook-ts":{"type":"object","required":["type"],"additionalProperties":false,"properties":{"type":{"type":"string","const":"ts"},"priority":{"default":99,"type":"integer","minimum":0}}},"hook":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}},"shared-hook-list":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"shared-signal-description":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"shared-signal-list":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"shared-node-in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"shared-node-netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"shared-node-fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"shared-node-out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-amqp":{"title":"Advanced Messaging & Queuing Protocol (AMQP)","type":"object","required":["type","exchange","routing_key"],"properties":{"type":{"type":"string","const":"amqp"},"format":{"$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"uri":{"type":"string","format":"uri","example":"amqp://guest:guest@localhost:5672/","description":"A complete AMQP connection URI.\n\nIf set, it takes precedence over the individual `host`, `port`, `username`, `password` and `vhost` settings, which are otherwise used to construct the URI.\n\nSee also: https://www.rabbitmq.com/uri-spec.html\n"},"host":{"type":"string","default":"localhost","description":"The hostname of the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"port":{"type":"integer","default":5672,"description":"The port number of the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"username":{"type":"string","default":"guest","description":"The username used for authentication with the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"password":{"type":"string","default":"guest","description":"The password used for authentication with the AMQP broker.\nUsed to construct the connection URI when `uri` is not set.\n"},"vhost":{"type":"string","default":"/","description":"The AMQP virtual host.\nUsed to construct the connection URI when `uri` is not set.\n"},"exchange":{"type":"string","description":"The name of the AMQP exchange the node will publish the messages to.\n"},"routing_key":{"type":"string","description":"The routing key of published messages as well as the routing key which is used to bind the subcriber queue.\n"},"ssl":{"description":"Note: These settings are only used if the `uri` setting is using the `amqps://` schema.\n","type":"object","properties":{"verify_hostname":{"type":"boolean","default":true},"verify_peer":{"type":"boolean","default":true},"ca_cert":{"type":"string","description":"Path to a CA certificate file used to verify the broker."},"client_cert":{"type":"string","description":"Path to the client certificate file."},"client_key":{"type":"string","description":"Path to the client private key file."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-c37.118-phasor":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"node-c37.118-analog":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"node-c37.118-digital":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"node-c37.118-pmu":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"node-c37_118":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"c37.118"},"in":{"type":"object","required":["address"],"description":"Client (PDC) side. When an address is given, the node connects to a\nremote PMU / PDC, requests its configuration and reads data frames.\n","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"address":{"type":"string","description":"Hostname or IP address of the remote PMU / PDC in the format\n`host[:port]`. The port defaults to the C37.118 port 4712 when\nomitted.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"IDCODE placed in the command frames sent to the remote device.\n"}},"additionalProperties":false},"out":{"type":"object","required":["address","data_rate","pmus"],"description":"Server (PMU / PDC) side. When an address is given, the node listens for\na connecting PDC, answers configuration and command frames and streams\ndata frames built from the samples written to the node.\n","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"address":{"type":"string","description":"Local address to bind to in the format `host[:port]`. An empty host\nbinds to all interfaces. The port defaults to the C37.118 port 4712\nwhen omitted.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"IDCODE reported in the frames served to the connecting PDC.\n"},"testing":{"type":"boolean","default":false,"description":"Enable \"testing\" mode. This is only intended to be used by our\nintegration tests.\n\nThis causes the server to not discard samples when no client is\nconnected. This option effectively makes the server busy-wait\nfor a client to connect and can easily exhaust the internal\nqueue of sent samples.\n"},"time_base":{"type":"integer","default":1000000,"minimum":1,"maximum":16777215,"description":"Resolution of the fractional second (FRACSEC) timestamp, i.e. the\nnumber of sub-second units per second. The C37.118 TIME_BASE field\nis 24 bits wide, so the value must not exceed 16777215.\n"},"data_rate":{"type":"number","minimum":0.0000305175,"maximum":32767,"description":"Reporting rate in frames per second. Rates below one frame per\nsecond are supported (e.g. 0.5 for one frame every two seconds) and\nare encoded using the C37.118 seconds-per-frame representation.\n"},"pmus":{"type":"array","minItems":1,"items":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"description":"The list of PMU configurations served by this node.\n"}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-c37.118-pmu":{"type":"object","description":"Configuration of a single PMU.\n","required":["name","frequency","rocof"],"properties":{"name":{"type":"string","maxLength":255,"description":"Station name of the PMU. Clients using revision 2005 of the protocol\nmight see the name truncated to 16 characters.\n"},"idcode":{"type":"integer","default":1,"minimum":0,"maximum":65535,"description":"Data stream ID code of the PMU.\n"},"guid":{"type":"string","format":"uuid","description":"Global PMU identifier. Defaults to the node's UUID.\n"},"nominal_frequency":{"type":"number","enum":[50,60],"default":50,"description":"Nominal line frequency in Hz.\n"},"latitude":{"type":"number","description":"Latitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"longitude":{"type":"number","description":"Longitude of the PMU in degrees (CONFIG3 only). Defaults to unknown.\n"},"elevation":{"type":"number","description":"Elevation of the PMU in meters (CONFIG3 only). Defaults to unknown.\n"},"service_class":{"type":"string","default":"measurement","enum":["measurement","protection"],"description":"Performance/service class of the PMU (CONFIG3 only). `measurement`\nmaps to service class M, `protection` to service class P.\n"},"window":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement window length in microseconds (CONFIG3 only).\n"},"group_delay":{"type":"integer","default":0,"minimum":0,"description":"Phasor measurement group delay in microseconds (CONFIG3 only).\n"},"frequency":{"type":"string","description":"Name of the input signal providing the measured frequency (server\ndirection only).\n"},"rocof":{"type":"string","description":"Name of the input signal providing the rate of change of frequency\n(server direction only).\n"},"phasor":{"type":"array","items":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"description":"The phasor channels of the PMU.\n"},"analog":{"type":"array","items":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"description":"The analog channels of the PMU.\n"},"digital":{"type":"array","items":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false},"description":"The digital status bits of the PMU. Every 16 bits form one digital\nstatus word.\n"}},"additionalProperties":false},"node-c37.118-phasor":{"type":"object","description":"Configuration of a single phasor channel.\n","required":["signal","unit"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this phasor (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the phasor channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","enum":["volt","ampere"],"description":"Physical unit of the phasor.\n"},"component":{"type":"string","default":"phase_a","enum":["zero_sequence","positive_sequence","negative_sequence","phase_a","phase_b","phase_c"],"description":"The phasor component (sequence or phase) that this phasor represents.\n"},"modifications":{"type":"array","uniqueItems":true,"description":"Measurement modifications applied to the phasor (CONFIG3 only).\n","items":{"type":"string","enum":["upsampled_with_interpolation","upsampled_with_extrapolation","downsampled_with_reselection","downsampled_with_fir_filter","downsampled_with_non_fir_filter","filtered_without_resampling","magnitude_adjusted_for_calibration","phase_adjusted_for_calibration","phase_adjusted_for_rotation","pseudo_phasor_value","other"]}}},"additionalProperties":false},"node-c37.118-analog":{"type":"object","description":"Configuration of a single analog channel.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this analog channel (server\ndirection).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the analog channel. Defaults to the signal name. Clients using\nrevision 2005 of the protocol might see the name truncated to 16\ncharacters.\n"},"unit":{"type":"string","default":"point_on_wave","enum":["point_on_wave","rms","peak"],"description":"Type of the analog value.\n"}},"additionalProperties":false},"node-c37.118-digital":{"type":"object","description":"Configuration of a single digital status bit. Every 16 bits form one\ndigital status word.\n","required":["signal"],"properties":{"signal":{"type":"string","description":"Name of the input signal mapped to this bit (server direction).\n"},"name":{"type":"string","maxLength":255,"description":"Name of the bit. Defaults to the signal name. Clients using revision\n2005 of the protocol might see the name truncated to 16 characters.\n"},"normal":{"type":"boolean","default":false,"description":"Normal state of the digital status bit.\n"}},"additionalProperties":false}}},"node-can-signal":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-can":{"type":"object","required":["type","interface_name"],"properties":{"type":{"type":"string","const":"can"},"interface_name":{"type":"string","description":"Name of the Socket CAN interface"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-can-signal":{"type":"object","properties":{"can_id":{"type":"integer","default":0},"can_size":{"type":"integer","default":8},"can_offset":{"type":"integer","default":0},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-comedi-signal":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-comedi":{"title":"Comedi-compatible DAQ/ADC cards","type":"object","required":["type","device"],"properties":{"type":{"type":"string","const":"comedi"},"device":{"type":"string","description":"The path to the Comedi device file.","example":"/dev/comedi0"},"in":{"type":"object","required":["rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subdevice":{"type":"integer","description":"The Comedi subdevice number. Auto-detected if not specified."},"bufsize":{"type":"integer","default":16,"description":"The size of the Comedi buffer in kilobytes."},"rate":{"type":"integer","description":"The sampling rate in Hertz."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subdevice":{"type":"integer","description":"The Comedi subdevice number. Auto-detected if not specified."},"bufsize":{"type":"integer","default":16,"description":"The size of the Comedi buffer in kilobytes."},"rate":{"type":"integer","description":"The sampling rate in Hertz."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-comedi-signal":{"type":"object","required":["channel","range","aref"],"properties":{"channel":{"type":"integer"},"range":{"type":"integer"},"aref":{"type":"integer"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-ethercat":{"title":"Send and receive samples over an EtherCAT connection","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"ethercat"},"rate":{"type":"number","default":1000,"description":"The cyclic rate in Hertz at which process data is exchanged."},"in":{"type":"object","required":["num_channels"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"num_channels":{"type":"integer","default":8},"range":{"type":"number","default":10},"position":{"type":"integer","default":2},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["num_channels"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"num_channels":{"type":"integer","default":8},"range":{"type":"number","default":10},"position":{"type":"integer","default":1},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-example":{"title":"Example Node","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"example"},"setting1":{"type":"integer","minimum":0,"maximum":100,"default":72,"description":"A first setting"},"setting2":{"type":"string","minimum":0,"maximum":10,"default":"something","description":"Another setting"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-exec":{"title":"Exec","type":"object","required":["type","exec"],"properties":{"type":{"type":"string","const":"exec"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"shell":{"type":"boolean","default":false,"description":"If set, the `exec` setting gets passed the shell (`/usr/bin`).\nIn this case the `exec` setting must be given as a string.\n\nIf not set, we will directly execute the sub-process via `execvpe(2)`.\nIn this case the exec setting must be given as an array (`argv[]`).\n"},"exec":{"description":"The program which should be executed in the sub-process.\n\nThe option is passed to the system shell for execution.\n","oneOf":[{"type":"array","minItems":1,"items":{"type":"string"}},{"type":"string"}]},"flush":{"type":"boolean","default":true,"description":"Flush stream every time VILLASnode passes data the sub-process.\n"},"working_directory":{"type":"string","description":"If set, the working directory for the sub-process will be changed.\n"},"environment":{"type":"object","description":"A object of key/value pairs of environment variables which should be passed to the sub-process in addition to the parent environment.\n","additionalProperties":{"type":"string"}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-fmu":{"title":"FMU node-type","type":"object","required":["type","fmu_path","fmu_unpack_path","fmu_writing_turn","start_time","stop_time","step_size"],"properties":{"type":{"type":"string","const":"fmu"},"fmu_path":{"type":"string","description":"Specifies the URI to a FMU model\n"},"fmu_unpack_path":{"type":"string","description":"Specifies the URI to a directory which has the unpacked files of the FMU model (mainly the shared library and the modelDescription.xml for the model).\n"},"fmu_writing_turn":{"type":"boolean","description":"Specifies whether the model has to be written with input values before running. `true` denotes that the model should use the input values. `false` would make the model use default values instead.\n"},"start_time":{"type":"number","description":"Specifies the start time for the simulation. Value has to be at least one `step_size` lesser than `stop_time`.\n"},"stop_time":{"type":"number","description":"Specifies the stop time for the simulation. The number of steps is calculated then by the difference between `start_time` and `stop_time` divided by the `step_size`.\n"},"step_size":{"type":"number","description":"Specifies the step size for the simulation. Special care has to be taken to ensure that the value is equal to the value mantioned in modelDescription.xml.\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}}},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}}},"additionalProperties":false},"additionalProperties":false},"node-file":{"title":"File","type":"object","required":["type","uri"],"properties":{"type":{"type":"string","const":"file"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"uri":{"type":"string","description":"Specifies the path to a local file which is written to or read from depending on which group (`in` or `out`) is used.\n\nThis setting allows to add special placeholders for time and date values.\nSee [strftime(3)](http://man7.org/linux/man-pages/man3/strftime.3.html) for a list of supported placeholder.\n\n**Example**:\n\n```\nuri = \"logs/measurements_%Y-%m-%d_%H-%M-%S.log\"\n```\n\nwill create a file called:\n\n```\n./logs/measurements_2015-08-09_22-20-50.log\n```\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"epoch":{"type":"number"},"epoch_mode":{"type":"string","enum":["direct","wait","relative","absolute","original"],"description":"The *epoch* describes the point in time when the first message will be read from the file.\nThis setting allows to select the behavior of the following `epoch` setting.\nIt can be used to adjust the point in time when the first value should be read.\n\nThe behavior of `epoch` is depending on the value of `epoch_mode`.\n\nTo facilitate the following description of supported `epoch_mode`'s, we will introduce some intermediate variables (timestamps).\nThose variables will also been displayed during the startup phase of the server to simplify debugging.\n\n- `epoch` is the value of the `epoch` setting.\n- `first` is the timestamp of the first message / line in the input file.\n- `offset` will be added to the timestamps in the file to obtain the real time when the message will be sent.\n- `start` is the point in time when the first message will be sent (`first + offset`).\n- `eta` the time to wait until the first message will be send (`start - now`)\n\nThe supported values for `epoch_mode`:\n\n| `epoch_mode` \t| `offset` \t\t| `start = first + offset` |\n| :--\t\t| :--\t\t\t| :-- |\n| `direct` \t| `now - first + epoch` \t| `now + epoch` |\n| `wait` \t| `now + epoch` \t\t| `now + first` |\n| `relative` \t| `epoch` \t\t| `first + epoch` |\n| `absolute` \t| `epoch - first` \t| `epoch` |\n| `original` \t| `0` \t\t\t| immediately |\n"},"rate":{"type":"number","default":0,"description":"By default `send_rate` has the value `0` which means that the time between consecutive samples is the same as in the `in` file based on the timestamps in the first column.\n\nIf this setting has a non-zero value, the default behavior is overwritten with a fixed rate.\n"},"eof":{"type":"string","default":"exit","enum":["rewind","wait","exit","stop"],"description":"Defines the behavior if the end of file of the input file is reached.\n\n- `rewind` will rewind the file pointer and restart reading samples from the beginning of the file.\n- `exit` will terminated the program.\n- `wait` will periodically test if there are new samples which have been appended to the file.\n"},"buffer_size":{"type":"integer","minimum":0,"default":0,"description":"Similar to the [`out.buffer_size` setting](#out-buffer_size). This means that the data is loaded into the buffer before it is passed on to the node.\n\nIf `in.buffer_size = 0`, no buffer will be generated.\n"},"skip":{"type":"integer","minimum":0,"default":0,"description":"The number of lines which should be skipped at the beginning of the input file.\n"}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"flush":{"type":"boolean","description":"With this setting enabled, the outgoing file is flushed whenever new samples have been written to it.\n"},"buffer_size":{"type":"integer","default":0,"minimum":0,"description":"If this is set to a positive value ``, the node will generate a full [stream buffer](https://linux.die.net/man/3/setvbuf) with a size of `` bytes. This means that the data is buffered and not written until the buffer is full or until the node is stopped.\n\nIf `out.buffer_size = 0`, no buffer will be generated.\n"}},"additionalProperties":false}},"additionalProperties":false},"node-fpga":{"title":"VILLASfpga node-type","type":"object","required":["type","card"],"properties":{"type":{"type":"string","const":"fpga"},"card":{"description":"The FPGA card to use for this node.\nEither the name of a card defined elsewhere, or an inline card definition object.\n","oneOf":[{"type":"string","description":"The name of the FPGA card."},{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"required":["name"]}]}]},"connect":{"type":"array","description":"A list of connect strings describing the internal FPGA IP interconnections.","items":{"type":"string"}},"low_latency_mode":{"type":"boolean","description":"Enables low-latency mode using scatter-gather DMA."},"timestep":{"type":"number","default":0.01,"description":"The simulation timestep in seconds."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-iec60870-5-104-signal":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec60870-5-104":{"title":"IEC 60870-5-104","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"iec60870-5-104"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"address":{"type":"string","default":"localhost","description":"Hostname or IP address for the IEC60870 slave to listen on.\n"},"port":{"type":"integer","default":2404,"description":"Port number of the IEC60870 slave.\n"},"ca":{"type":"integer","default":1,"description":"Common Address of the IEC60870 slave.\n"},"low_priority_queue":{"type":"integer","default":100,"description":"Message queue size for the periodic messages (increase on dropped simulation data messages).\n"},"high_priority_queue":{"type":"integer","default":100,"description":"Message queue size for interrogation responses (increase on missing signals in interrogation response).\n"},"apci_t0":{"type":"integer"},"apci_t1":{"type":"integer"},"apci_t2":{"type":"integer"},"apci_t3":{"type":"integer"},"apci_k":{"type":"integer"},"apci_w":{"type":"integer"},"out":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"duplicate_ioa_is_sequence":{"type":"boolean","default":false,"description":"Treat consecutive signals with the same IOA as a sequence by assigning subsequent IOAs.\n"},"signals":{"type":"array","items":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec60870-5-104-signal":{"type":"object","required":["ioa"],"properties":{"asdu_type":{"description":"Human readable names for the supported IEC60870 message types.","type":"string","enum":["single-point","double-point","scaled-int","normalized-float","short-float"]},"with_timestamp":{"description":"Only for use with the human readable asdu_type.","type":"boolean","default":false},"asdu_type_id":{"description":"The IEC60870 standard type id.","type":"string","enum":["M_SP_NA_1","M_SP_TB_1","M_DP_NA_1","M_DP_TB_1","M_ME_NB_1","M_ME_TB_1","M_ME_NA_1","M_ME_TA_1","M_ME_NC_1","M_ME_TC_1"]},"ioa":{"description":"The IEC60870 information object address associated with this signal.","type":"integer","minimum":1},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-iec61850-8-1-publisher-data":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false},"node-iec61850-8-1-key":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber-signal":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false},"node-iec61850-8-1-publisher":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-iec61850-8-1":{"title":"IEC 61850-8-1 (GOOSE)","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"iec61850-8-1"},"keys":{"type":"array","description":"Session keys used for R-GOOSE (routed GOOSE).\n","items":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false}},"in":{"type":"object","required":["subscribers","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"subscribers":{"type":"object","additionalProperties":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false}},"routed":{"type":"boolean","default":false,"description":"Use R-GOOSE (routed GOOSE) instead of layer 2 GOOSE.\n"},"local_address":{"type":"string","default":"localhost","description":"Local address to bind to for R-GOOSE.\n"},"local_port":{"type":"integer","default":102,"description":"Local port to bind to for R-GOOSE.\n"},"multicast_groups":{"type":"array","items":{"type":"string"},"description":"Multicast groups to join for R-GOOSE.\n"},"interface":{"type":"string","default":"lo","description":"Name of the ethernet interface to receive on (layer 2 GOOSE).\n"},"with_timestamp":{"type":"boolean","default":true}},"additionalProperties":false},"out":{"type":"object","required":["publishers"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"publishers":{"type":"array","items":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"routed":{"type":"boolean","default":false,"description":"Use R-GOOSE (routed GOOSE) instead of layer 2 GOOSE.\n"},"local_address":{"type":"string","default":"localhost","description":"Local address to bind to for R-GOOSE.\n"},"local_port":{"type":"integer","default":0,"description":"Local port to bind to for R-GOOSE.\n"},"remote_address":{"type":"string","default":"localhost","description":"Remote address to send to for R-GOOSE.\n"},"remote_port":{"type":"integer","default":102,"description":"Remote port to send to for R-GOOSE.\n"},"key_id":{"type":"integer","description":"The id of the session key (see 'keys') to use for R-GOOSE.\n"},"interface":{"type":"string","default":"lo","description":"Name of the ethernet interface to send on (layer 2 GOOSE).\n"},"resend_interval":{"type":"number","description":"Time interval for periodic resend of last sample in floating point seconds.\n"}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec61850-8-1-key":{"type":"object","required":["id","security","signature"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the session key.\n"},"security":{"type":"string","enum":["aes_128_gcm","aes_256_gcm","none"],"description":"Security (encryption) algorithm for the session key.\n"},"signature":{"type":"string","enum":["aes_gmac_64","aes_gmac_128","hmac_sha256_80","hmac_sha256_128","hmac_sha256_256","hmac_sha3_80","hmac_sha3_128","hmac_sha3_256","none"],"description":"Signature algorithm for the session key.\n"},"string":{"type":"string","description":"The key material as a raw string. Mutually exclusive with 'base64'.\n"},"base64":{"type":"string","description":"The key material as a base64 encoded string. Mutually exclusive with 'string'.\n"}},"additionalProperties":false},"node-iec61850-8-1-subscriber":{"type":"object","required":["go_cb_ref"],"properties":{"go_cb_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"trigger":{"type":"string","enum":["always","change"],"default":"always"}},"additionalProperties":false},"node-iec61850-8-1-subscriber-signal":{"type":"object","required":["subscriber","index","mms_type"],"properties":{"subscriber":{"type":"string","description":"Name of the subscriber (see 'subscribers') this signal is mapped to.\n"},"index":{"type":"integer","description":"Index within the received GOOSE event array.\n"},"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Expected basic data type in received array.\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-8-1-publisher":{"type":"object","required":["go_cb_ref","data_set_ref","app_id","conf_rev","time_allowed_to_live","data"],"properties":{"go_id":{"type":"string"},"go_cb_ref":{"type":"string"},"data_set_ref":{"type":"string"},"dst_address":{"type":"string"},"app_id":{"type":"integer"},"conf_rev":{"type":"integer"},"time_allowed_to_live":{"type":"integer"},"burst":{"type":"integer","default":1},"data":{"type":"array","items":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"additionalProperties":false},"node-iec61850-8-1-publisher-data":{"type":"object","required":["mms_type"],"properties":{"mms_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","bitstring","float32","float64"],"description":"Basic data type of the value in the transmitted array.\n"},"signal":{"type":"string","description":"Name of the input signal for the value.\n"},"value":{"type":["integer","number","boolean"],"description":"Constant signal value.\n"},"mms_bitstring_size":{"type":"integer","default":32,"description":"Size metadata for mms_type bitstring.\n"}},"additionalProperties":false}}},"node-iec61850-9-2-signal":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-iec61850-9-2":{"title":"IEC 61850-9-2 (Sampled Values)","type":"object","required":["type","interface"],"properties":{"type":{"type":"string","const":"iec61850-9-2"},"interface":{"type":"string","description":"Name of network interface to/from which this node will publish/subscribe for SV frames."},"app_id":{"type":"integer","default":16384},"dst_address":{"type":"string","default":"01:0c:cd:01:00:01"},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"check_dst_address":{"type":"boolean","default":false},"signals":{"type":"array","minItems":1,"items":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["signals","sv_id"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","minItems":1,"items":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"sv_id":{"type":"string"},"conf_rev":{"type":"integer"},"smp_mod":{"type":"string","enum":["per_nominal_period","samples_per_second","seconds_per_sample"]},"smp_synch":{"type":"string","enum":["not_synchronized","local_clock","global_clock"]},"smp_rate":{"type":"integer"},"vlan":{"type":"object","properties":{"enabled":{"type":"boolean","default":true},"id":{"type":"integer","default":0},"priority":{"type":"integer","default":4}},"additionalProperties":false}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-iec61850-9-2-signal":{"type":"object","properties":{"iec_type":{"type":"string","enum":["boolean","int8","int16","int32","int64","int8u","int16u","int32u","int64u","float32","float64","enumerated","coded_enum","octet_string","visible_string","objectname","objectreference","timestamp","entrytime","bitstring"]},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-infiniband":{"title":"InfiniBand (RDMA) node-type","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"infiniband"},"rdma_transport_mode":{"type":"string","enum":["RC","UC","UD"],"default":"RC","description":"This specifies the type of connection the node will set up.\n\n* `RC` provides reliable, connection-oriented, message based communication between the nodes. Packets are delivered in order. In this mode, one Queue Pair is connected to one other Queue Pair.\n* `UC` provides unreliable, connection-oriented, message based communication between the nodes. This service type is not officially supported by the RDMA communication manager and is implemented for scientific purposes in VILLASnode. [The InfiniBand node-type source code provides information on how to enable this service type.](https://git.rwth-aachen.de/acs/public/villas/node/blob/master/lib/nodes/infiniband.c#L429)\n* `UD` provides unreliable, connection-less, datagram communication between nodes. Both ordering and delivery are not guaranteed in this mode.\n\n`RC`, `UC`, and `UD` are mapped to the Queue Pair types as `RDMA_PS_TCP`/`IBV_QPT_RC`, `RDMA_PS_IPOIB`/`IBV_QPT_UC`, and `RDMA_PS_UDP`/`IBV_QPT_UD`, respectively.\nIf two nodes should be connected, both should be set to the same `rdma_transport_mode`.\n\nMore information on these two modes can be found on the manual page for [`rdma_create_id()`](https://linux.die.net/man/3/rdma_create_id).\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"Connections between `infiniband` nodes are established over IP over IB (IPoIP).\nTo use this node, you have to make sure that the linux driver `ib_ipoib` is loaded.\nIf it is not loaded, load it with `modprobe ib_ipoib`.\n\nIf it is loaded, you have to make sure that the Host Channel Adapters (HCAs) have an IP address.\nYou can configure the IP address of the Infiniband HCA with the `ifconfig` utility, exactly like you would configure normal Ethernet adapters.\n\nAs soon as an IP is set for the local HCA, this entry can be used to point to the adapter and to define the port which will be used for connection related communication.\n\n**Example**:\n\n```\nin = {\n address=\"10.0.0.1:1337\"\n}\n```\n\nbinds the node to the local device which is bound to `10.0.0.1`. It will use port `1337` for communication related to the connection.\n"},"max_wrs":{"type":"integer","default":128,"description":"Before a packet can be received with Infiniband, the application has to describe how this will be handled (e.g., to what address the data will be written).\nThis happens in a so called Work Request (WR).\n\n`in.max_wrs` sets the maximum number of receive Work Requests which can be posted to the receive queue of the Queue Pair.\n\nFor higher throughput, it is recommended to increase this value since it will serve as a buffer.\n"},"cq_size":{"type":"integer","default":128,"description":"This value defines the number of Work Completions the Completion Queue can hold.\n\nIf a packet is received, the Queue Pair will write a Work Completion to the Completion Queue.\nThe node polls this queue to process received packets. If the Completion Queue gets full, which is often caused by `cq_size` being to small, and thus the receive queue is not able to post Work Completions, the node will abort.\n\nIf a connection is disconnected, all outstanding Work Requests—even is they are not used—are flushed to the Completion Queue.\nHere applies the same as mentioned above: if the Completion Queue has fewer space left than outstanding Work Requests are available, this will result in an error.\n\nIt is therefor recommended to set the value of `cq_size` to at least\n\n```\nin.cq_size >= in.max_wrs - in.buffer_subtraction\n```\n"},"buffer_subtraction":{"type":"integer","default":16,"description":"As mentioned in the `in.max_wrs` settings, Work Requests have to be present in the receive queue, for it to be able to process received data.\nTo take full advantage of the zero-copy capabilities of Infiniband this node-type directly posts addresses from the VILLASnode to the receive queue instead of copying all data over after receiving it.\n\nThis technique relies on the exchange of addresses. This means that if an array of `in.vectorize` addresses is handed over to the node-type, max `release` <= `in.vectorize` addresses that point to received data can be returned.\n\nFurthermore, if `release` addresses should be returned, `release` addresses from the original array must be posted to the receive queue.\nTo ensure that we can always post at least `in.vectorize` new samples to the receive queue, `in.buffer_subtraction` must always be bigger than `in.vectorize`.\n\nA second factor is performance: if `in.buffer_subtraction` is too small it might take long before the node starts to process data since it has to fill almost the complete queue first.\nIf `in.buffer_subtraction` is too big, the receive buffer might be too small.\n\nThus, the maximum number of Work Requests to be present in the receive queue is defined as follows:\n\n```c\nmax_wrs_posted = in.max_wrs - in.buffer_subtraction\n```\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"This value defines the IPoIB address of the remote node and is used to establish a connection to the remote host—in case of `RDMA_PS_TCP`—or to get the address handle of the remote host—in case of `RDMA_PS_UDP`.\n\nThis is similar to `in.address`.\n\n`out.address` has no default value and if it is not defined the node will be set to listening mode and all `out` configuration will be ignored.\n\n**Example**:\n\n```\nout = {\n address = \"10.0.0.1:1337\"\n}\n```\n"},"resolution_timeout":{"type":"integer","default":1000,"description":"This defines the time in milliseconds [`rdma_resolve_addr()`](https://linux.die.net/man/3/rdma_resolve_addr) waits for the resolution of the destination address to complete.\n"},"max_wrs":{"type":"integer","default":128,"description":"This is similar to `in.max_wrs` but for the send side of the Queue Pair.\nIn contrast to the receive queue, there is no minimum amount of Work Requests in this queue and it can be filled up completely to `out.max_wrs`.\n"},"cq_size":{"type":"integer","default":128,"description":"This is similar to `in.cq_size`.\n\nAn important side note for the receive completion queue was that it should be able to hold all Work Requests if the receive queue is flushed.\nSince no \"preparatory\" Work Requests are posted to the send queue and and thus all work requests are send out as soon as possible, there is no need for `out.cq_size` to be as big as `out.max_wrs`.\n"},"send_inline":{"type":"boolean","default":true,"description":"It is possible that the CPU copies the data to be sent directly to the HCA.\nThen, the HCA can take the data from it's internal memory as soon as it is ready to send it.\nThis has the advantage that the buffer can be returned immediately to the VILLASnode and that it increases performance.\n\nIf this flag is set, the [`infiniband`](../nodes/infiniband.md) node-type checks if a sample is small enough to be sent inline, and if this is the case sends it inline.\n"},"max_inline_data":{"type":"integer","default":0,"description":"This value represents the maximum number of bytes to be send inline.\nThe maximum number of this value depends on the HCA.\nThe settings defaults to zero. However, many HCAs will automatically adjust it to 60.\n\n*Important note*: The greater this value gets, the smaller `out.max_wrs` can be. If `out.max_inline_data` is too big for the number specified in `out.max_wrs`, the node will return an error that the Queue Pair could not be created.\nSince this is different for various HCAs, it is not possible for us to give more specified errors.\n\n**Example**:\n\n```\nout = {\n send_inline = 1,\n max_inline_data = 60\n}\n```\n\nEvery sample which is smaller than 60 bytes will be send inline. All other samples will be sent normally.\n"},"use_fallback":{"type":"boolean","default":true,"description":"If an out section with a valid remote entry is present in the configuration file, the node will first bind to the local host channel adapter and subsequentially try to connect to the remote host.\nIf the latter fails (e.g., because the remote host was not reachable or rejected the connection), there are two possible outcomes: the node can throw an error and abort or it can show a warning and continue in listening mode.\n\nIf `use_fallback = true`, the node will fallback to listening mode if it is not able to connect to the remote host.\n"},"periodic_signaling":{"type":"integer","default":"","description":"If a sample is sent inline, no Completion Queue Entry (CQE) is generated.\nHowever, once a while, a CQE must be generated to prevent the Send Queue from overflowing.\nTherefore, every `out.periodic_signaling`th sample will be sent normally with signaling.\n\nIt turns out that the ideal value in most cases is `out.max_wrs / 2`.\nHence, usually, it is not necessary to explicitly set this value.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-influxdb":{"title":"InfluxDB","type":"object","required":["type","server","key"],"properties":{"type":{"type":"string","const":"influxdb"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"server":{"type":"string","description":"A hostname/port combination of the InfluxDB database server."},"key":{"type":"string","description":"The key is the measurement name and any optional tags separated by commas.\n\nSee also: [InfluxDB documentation](https://docs.influxdata.com/influxdb/v0.9/write_protocols/line/#key).\n"},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-kafka":{"type":"object","required":["type","server","protocol"],"properties":{"type":{"type":"string","const":"kafka"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"server":{"type":"string","description":"The bootstrap server `{ip}:{port}` of the Kafka message brokers cluster.\n"},"protocol":{"type":"string","enum":["PLAINTEXT","SASL_PLAINTEXT","SASL_SSL","SSL"],"description":"The [security protocol](https://kafka.apache.org/24/javadoc/org/apache/kafka/common/security/auth/SecurityProtocol.html) which is used for authentication with the Kafka cluster.\n"},"client_id":{"type":"string","default":"villas-node","description":"The Kafka client identifier."},"timeout":{"type":"number","description":"A timeout in seconds for the broker connection.","default":1},"ssl":{"type":"object","required":["ca"],"properties":{"ca":{"type":"string","description":"Path to a Certificate Authority (CA) bundle which is used to validate broker server certificate."}},"additionalProperties":false},"sasl":{"type":"object","description":"An object for configuring the SASL authentication against the broker.\nThis setting is used if the `protocol` setting is on of `SASL_PLAINTEXT` or `SASL_SSL`.\n","required":["mechanisms","username","password"],"properties":{"mechanisms":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"consume":{"type":"string","description":"The Kafka topic to which this node-type will subscribe for receiving messages."},"group_id":{"type":"string","description":"The group id of the Kafka client used for receiving messages."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"produce":{"type":"string","description":"The Kafka topic to which this node-type will publish messages."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-loopback":{"title":"Loopback","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"loopback"},"queuelen":{"type":"integer","minimum":0,"description":"The queue length of the internal queue which buffers the samples."},"mode":{"type":"string","enum":["pthread","polling","eventfd","auto"],"default":"auto","description":"Specify the synchronization mode of the internal queue."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-modbus-signal":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-modbus":{"title":"Read and write Modbus registers","type":"object","required":["type","transport"],"properties":{"type":{"type":"string","const":"modbus"},"transport":{"type":"string","description":"The transport protocol used for Modbus communication.","enum":["tcp","rtu"]},"response_timeout":{"type":"number","description":"The timeout in seconds when waiting for responses from a Modbus server.","default":1,"example":1},"reconnect_interval":{"type":"number","description":"The interval in seconds for trying to reconnect on connection loss.","default":10},"min_block_usage":{"type":"number","description":"The minimum ratio of used registers to queried registers for a merged block of registers.\nThis caps the amount of unnecessary data transmitted.\n","default":0.25},"max_block_size":{"type":"integer","description":"The maximum size (in registers) of a merged block of register mappings.","default":32},"rate":{"type":"number","description":"The rate at which Modbus device registers are queried for changes.","example":1},"remote":{"type":"string","description":"The hostname or IP of the Modbus TCP device. Only used with `transport = tcp`.","example":"example.com"},"port":{"type":"integer","description":"The port number of the Modbus TCP device. Only used with `transport = tcp`.","default":502},"device":{"type":"string","description":"Path to the serial device file. Only used with `transport = rtu`.","example":"/dev/ttyS0"},"baudrate":{"type":"integer","description":"The baudrate used for serial communication. Only used with `transport = rtu`.","example":9600},"parity":{"type":"string","enum":["none","even","odd"],"description":"The parity used for serial communication. Only used with `transport = rtu`.","example":"none"},"data_bits":{"type":"integer","description":"The data bits used for serial communication. Only used with `transport = rtu`.","minimum":5,"maximum":8,"example":5},"stop_bits":{"type":"integer","description":"The stop bits used for serial communication. Only used with `transport = rtu`.","minimum":1,"maximum":2,"example":1},"unit":{"type":"integer","description":"The addressed unit used for communication. Optional for TCP.","minimum":0,"maximum":65535,"example":1},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-modbus-signal":{"type":"object","required":["address"],"properties":{"address":{"type":"integer","description":"The modbus register address."},"integer_registers":{"type":"integer","description":"The number of consecutive registers combined into a single integer value.\n","minimum":1,"maximum":4},"word_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of two modbus registers joined together to form a larger number.","default":"big"},"byte_endianess":{"type":"string","enum":["big","little"],"description":"The ordering of the bytes within a modbus register.","default":"big"},"scale":{"type":"number","description":"The scale of the register's value.","default":1},"offset":{"type":"number","description":"The offset of the register's value.","default":0},"bit":{"type":"integer","description":"The bit index within a register.","minimum":0,"maximum":15},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-mqtt":{"type":"object","required":["type","host"],"properties":{"type":{"type":"string","const":"mqtt"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"username":{"type":"string","description":"The username which is used for authentication with the MQTT broker."},"password":{"type":"string","description":"The password which is used for authentication with the MQTT broker."},"host":{"type":"string","description":"The hostname of the MQTT broker.","example":"example.com"},"port":{"type":"integer","description":"The port number of the MQTT broker.","default":1883},"retain":{"type":"boolean","description":"Set to true to make the will a retained message.","default":false},"keepalive":{"type":"integer","default":5,"description":"The MQTT keepalive value."},"qos":{"type":"integer","default":0,"description":"The quality of service (QoS) to use for the subscription."},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean","default":true},"insecure":{"type":"boolean"},"cafile":{"type":"string","description":"Path to a file containing the PEM encoded trusted CA certificate file."},"capath":{"type":"string","description":"Path to a directory containing the PEM encoded trusted CA certificate files."},"certfile":{"type":"string","description":"Path to a file containing the PEM encoded certificate file for this client."},"keyfile":{"type":"string","description":"Path to a file containing the PEM encoded private key for this client."},"cipher":{"type":"string","description":"A string describing the ciphers available for use. See the `openssl ciphers` tool for more information."},"verify":{"type":"boolean","default":true,"description":"Configure verification of the server hostname in the server certificate.\nIf value is set to true, it is impossible to guarantee that the host you are connecting to is not impersonating your server.\nThis can be useful in initial server testing, but makes it possible for a malicious third party to impersonate your server through DNS spoofing, for example.\nDo not use this function in a real system.\nSetting value to true makes the connection encryption pointless.\n"},"tls_version":{"type":"string","enum":["tlsv1","tlsv1.1","tlsv1.2"],"description":"The version of the SSL/TLS protocol to use as a string.\nIf not set, the default value is used. The default value and the available values depend on the version of openssl that the library was compiled against.\nFor openssl >= 1.0.1, the available options are tlsv1.2, tlsv1.1 and tlsv1, with tlv1.2 as the default.\nFor openssl < 1.0.1, only tlsv1 is available.\n"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subscribe":{"type":"string","description":"Topic to which this node subscribes."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"publish":{"type":"string","description":"Topic to which this node publishes."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-nanomsg":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"nanomsg"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"endpoints":{"description":"A single endpoint URI or list of URIs to which this node should connect as a subscriber.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"endpoints":{"description":"A single endpoint URI or list of URIs on which this node should listen for subscribers.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-ngsi-signal":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-ngsi":{"title":"FIWARE NGSI 9/10","type":"object","required":["type","endpoint","entity_id","entity_type"],"properties":{"type":{"type":"string","const":"ngsi"},"endpoint":{"type":"string","format":"uri"},"entity_id":{"type":"string","description":"ID of NGSI entity."},"entity_type":{"type":"string","description":"Type of NGSI entity."},"ssl_verify":{"type":"boolean","default":true,"description":"Verify SSL certificate against local trust store."},"timeout":{"description":"Timeout in seconds for HTTP requests.","type":"number","default":1},"rate":{"description":"Polling rate in Hz for requesting entity updates from broker.","type":"number","default":1},"access_token":{"type":"string","description":"Send 'Auth-Token' header with every HTTP request."},"create":{"type":"boolean","default":true,"description":"Create NGSI entities during startup of node."},"delete":{"type":"boolean","default":true,"description":"Remove NGSI entities during shutdown of node."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-ngsi-signal":{"type":"object","properties":{"ngsi_attribute_name":{"type":"string","description":"Name of the NGSI attribute this signal is mapped to.\nDefaults to the signal name.\n"},"ngsi_attribute_type":{"type":"string","description":"Type of the NGSI attribute this signal is mapped to.\nDefaults to the signal unit.\n"},"ngsi_metadatas":{"type":"array","items":{"type":"object","required":["name","type","value"],"properties":{"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"additionalProperties":false}},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-opal_async":{"title":"OPAL-RT Asynchronous Process","type":"object","required":["type","id"],"properties":{"type":{"type":"string","const":"opal.async"},"id":{"description":"The Send/Recv ID of the RT-Lab OpAsyncSend/Recv blocks.","minimum":1,"default":1,"type":"integer"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"reply":{"description":"Send a confirmation to the Simulink model that signals have been received and processed.","default":false,"type":"boolean"}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"opal-orchestra-connection-local":{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},"opal-orchestra-connection-remote":{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},"opal-orchestra-connection-dolphin":{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false},"opal-orchestra-connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"node-opal_orchestra-signal":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-opal_orchestra":{"title":"OPAL-RT Orchestra","type":"object","required":["type","domain"],"properties":{"type":{"type":"string","const":"opal.orchestra"},"domain":{"type":"string","description":"The name of the domain to which the connection is requested. This domain must exist in the DDF read by an RT-LAB subsystem."},"synchronous":{"type":"boolean","description":"Determines whether domain participants exchange simulation data synchronously or asynchronously."},"states":{"type":"boolean"},"connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"ddf":{"type":"string","description":"The path to the DDF file that describes the data exchanged in the specified domain."},"connect_timeout":{"default":"5s","description":"The duration after which a failed connection attempt times out.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"flag_delay":{"default":"0s","description":"Forces the local Orchestra communication to be made with flags instead of semaphores when using an external communication process. Flags are recommended for better performance: they are faster but also more CPU-consuming.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"flag_delay_tool":{"description":"Forces the local Orchestra communication to be made with flags instead of semaphores when using an external communication process. Flags are recommended for better performance: they are faster but also more CPU-consuming.","oneOf":[{"type":"string","description":"Duration as a string, e.g., \"1h30m\", \"45s\", \"200ms\".\n","pattern":"^(\\d+(d|h|ms|us|ns|m|s))+$","examples":["6d23h30m50s40ms","45s","2d200ms"]},{"type":"integer","description":"Duration as integer.\n","minimum":0,"examples":[5400000,45000,200]}]},"skip_wait_to_go":{"type":"boolean","default":false,"description":"Sets the WaitToGo setting of the model. When true, VILLASnode ignores the WaitToGo during the connection step. When false, VILLASnode performs the WaitToGo during the connection step."},"ddf_overwrite":{"type":"boolean","default":false,"description":"If true, the DDF file provided in the 'dff' setting will be overwriting with settings and signals from the VILLASnode configuration."},"ddf_overwrite_only":{"type":"boolean","default":false,"description":"If true, VILLASnode will overwrite the file provided in the 'ddf' setting, and terminate immediately afterwards."},"rate":{"type":"number","default":1,"description":"In asynchronous mode (see 'synchronous' setting), this rate defines how often per second the data exchange with the Orchestra domain takes place."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"opal-orchestra-connection":{"type":"object","description":"Configuration of the connection to the OPAL-RT Orchestra framework.\n","required":["type"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"}},"discriminator":{"propertyName":"type","mapping":{"local":"#/components/schemas/opal-orchestra-connection-local","remote":"#/components/schemas/opal-orchestra-connection-remote","dolphin":"#/components/schemas/opal-orchestra-connection-dolphin"}},"oneOf":[{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false}],"additionalProperties":true},"opal-orchestra-connection-local":{"type":"object","properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"extcomm":{"type":"string","default":"none","enum":["udp","tcp","none"],"description":"Type of external communication protocol helper which should be started."},"addr_framework":{"type":"string","description":"The IP address of the target on which the framework is running."},"port_framework":{"type":"integer","minimum":0,"maximum":65535,"description":"The port on which the framework will be reachable."},"nic_framework":{"type":"string","description":"The network interface that the framework will use to communicate with the client."},"nic_client":{"type":"string","description":"The network interface that the client will use to communicate with the framework."},"core_framework":{"type":"integer","minimum":0,"description":"The core on which the tool of the framework is running. The index starts at 0."},"core_client":{"type":"integer","minimum":0,"description":"The core on which the tool of the client is running. The index starts at 0."}},"additionalProperties":false},"opal-orchestra-connection-remote":{"type":"object","required":["card","pci_index"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"card":{"type":"string","example":"VMIPCI5565-64M","description":"Type of reflective memory card used for a remote connection."},"pci_index":{"type":"integer","minimum":1,"description":"PCI index that corresponds to the communication card used for remote connection."}},"additionalProperties":false},"opal-orchestra-connection-dolphin":{"type":"object","required":["node_id_framework","segment_id"],"properties":{"type":{"description":"The type of connection to the OPAL-RT Orchestra framework.","type":"string"},"node_id_framework":{"type":"integer","minimum":4,"maximum":4096,"description":"Node ID for Dolphin node which hosts the Orchestra framework."},"segment_id":{"type":"integer","minimum":1,"maximum":65535,"description":"Segment ID used to uniquely identify the framework domain. Note that another segment ID is automatically calculated outside of this range to identify the client segment."}},"additionalProperties":false},"node-opal_orchestra-signal":{"type":"object","properties":{"orchestra_name":{"type":"string","description":"Name of the corresponding Orchestra data item. Defaults to the VILLAS signal name."},"orchestra_type":{"type":"string","enum":["boolean","unsigned int8","unsigned int16","unsigned int32","unsigned int64","int8","int16","int32","int64","float32","float64","bus"],"description":"Type of the corresponding Orchestra data item. Defaults to a type derived from the VILLAS signal type."},"orchestra_index":{"type":"integer","minimum":0,"description":"Index of this signal within the Orchestra data item (for bus/array items)."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-opendss":{"title":"Interface to OpenDSS, EPRI's Distribution System Simulator","type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"opendss"},"file_path":{"type":"string","description":"Specifies the URI to a OpenDSS file.\n"},"in":{"type":"object","required":["list"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"list":{"type":"array","items":{"type":"object","required":["name","type","data"],"properties":{"name":{"type":"string","description":"Name of the element.\n"},"type":{"type":"string","description":"Type of the element.\n"},"data":{"type":"array","description":"Data to be input. Possible options depend on the element type.\n","items":{"type":"string"}}},"oneOf":[{"title":"Load or generator","properties":{"type":{"type":"string","enum":["load","generator"]},"data":{"type":"array","items":{"enum":["kV","kW","kVar","Pf"]}}},"additionalProperties":true},{"title":"Current source","properties":{"type":{"type":"string","const":"isource"},"data":{"type":"array","items":{"enum":["Amps","AngleDeg","Frequency"]}}},"additionalProperties":true}],"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["list"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"list":{"description":"Names of the monitors to be read.\n","type":"array","items":{"type":"string"}}},"additionalProperties":false}},"additionalProperties":false},"node-redis":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"redis"},"format":{"default":"json","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"mode":{"type":"string","enum":["key","set-get","hash","hset-hget","channel","pub-sub"],"default":"key","description":"- `key`: [Get](https://redis.io/commands/get)/[Set](https://redis.io/commands/set) of [Redis strings](https://redis.io/topics/data-types#strings)\n - The implementation uses the Redis `MSET` and `MGET` commands.\n- `hash`: Hashtables using [hash data-type](https://redis.io/topics/data-types#hashes)\n - The implementation uses the Redis `HMSET` and `HGETALL` commands.\n- `channel`: [Publish/subscribe](https://redis.io/topics/pubsub)\n - The implementation uses the Redis `PUBLISH` and `SUBSCRIBE` commands.\n"},"uri":{"type":"string","format":"uri","description":"A Redis connection URI in the form of: `redis://:@:/`.\n"},"host":{"type":"string","default":"localhost","description":"The hostname or IP address of the Redis server.\n\nYou can also connect to Redis server with a URI:\n\n- `tcp://[[username:]password@]host[:port][/db]`\n- `unix://[[username:]password@]path-to-unix-domain-socket[/db]`\n"},"port":{"type":"integer","description":"The port number of the Redis server to connect to.","default":6379},"path":{"type":"string","description":"A path of a Unix socket which should be used for the connection."},"user":{"type":"string","default":"default","description":"The username which should be used for authentication.\n\nSee: https://redis.io/commands/auth\n"},"password":{"type":"string","description":"The password which should be used for authentication.\n\nSee: https://redis.io/commands/auth\n"},"db":{"type":"integer","default":0,"description":"The logical database which should be used by the Redis client.\n\nSee: https://redis.io/commands/select\n"},"timeout":{"type":"object","properties":{"connect":{"type":"number","description":"The timeout in seconds for the initial connection establishment."},"socket":{"type":"number","description":"The timeout in seconds for executing commands against the Redis server."}},"additionalProperties":false},"keepalive":{"type":"boolean","default":false,"description":"Enable periodic keepalive packets."},"rate":{"type":"number","description":"The rate in Hertz at which this node polls the Redis server for new values."},"key":{"type":"string","default":"","description":"The key which this node will use in the Redis keyspace."},"channel":{"type":"string","default":"","description":"The channel which this node will use when `mode` setting is `channel`."},"notify":{"type":"boolean","default":true,"description":"Use [Redis keyspace notifications](https://redis.io/topics/notifications) to listen for new updates.\nThis setting is only used if setting `mode` is set to `key` or `hash`.\n"},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"If enabled the connection to the Redis server will be encrypted via SSL/TLS."},"cacert":{"type":"string","description":"A path to a CA certificate file."},"cacertdir":{"type":"string","description":"A path to a directory containing CA certificates."},"cert":{"type":"string","description":"A path to a client certificate file."},"key":{"type":"string","description":"A path to the private key file."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-rtp":{"type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"rtp"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"rtcp":{"type":"boolean","description":"Enable Real-time Control Protocol (RTCP)"},"aimd":{"type":"object","properties":{"a":{"type":"number","default":10},"b":{"type":"number","default":0.5},"Kp":{"type":"number","default":1},"Ki":{"type":"number","default":0},"Kd":{"type":"number","default":0},"rate_min":{"type":"number","default":1},"rate_source":{"type":"number","default":2000},"rate_init":{"type":"number"},"log":{"type":"string"},"hook_type":{"type":"string","default":"disabled","enum":["decimate","limit_rate","disabled"]}},"additionalProperties":false},"in":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The local address and port number this node should listen for incoming packets.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The remote address and port number to which this node will send data.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-shmem":{"title":"Shared Memory","type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"shmem"},"queuelen":{"type":"integer","default":"","description":"Length of the input and output queues in elements."},"mode":{"type":"string","default":"pthread","enum":["pthread","polling"],"description":"If set to `pthread`, POSIX condition variables (CV) are used to signal writes between processes.\nIf set to `polling`, no CV's are used, meaning that blocking writes have to be implemented using polling, leading to performance improvements at a cost of unnecessary CPU usage.\n"},"exec":{"description":"Optional name and command-line arguments (as passed to `execve`) of a command to be executed during node startup.\nThis can be used to start the external program directly from VILLASNode. If unset, no command is executed.\n","type":"array","items":{"type":"string"}},"in":{"type":"object","required":["name"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"name":{"type":"string","description":"Name of the POSIX shared memory object.\nMust start with a forward slash (/).\nThe same name should be passed to the external program somehow in its configuration or command-line arguments.\n"}},"additionalProperties":false},"out":{"type":"object","required":["name"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}},"name":{"type":"string","description":"Name of the POSIX shared memory object.\nMust start with a forward slash (/).\nThe same name should be passed to the external program somehow in its configuration or command-line arguments.\n"}},"additionalProperties":false}},"additionalProperties":false},"node-signal-type":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},"node-signal-value":{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"node-signal":{"title":"Signal Generator","type":"object","required":["type","signal"],"properties":{"type":{"type":"string","const":"signal"},"signal":{"description":"The type of signal which should be generated.\n\nA single value is applied to all generated signals, or an array with one\nentry per signal may be given (its length must then match `values`).\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n","oneOf":[{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},{"type":"array","items":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]}}]},"values":{"type":"integer","default":1,"description":"The number of signals which each of the generated samples should contain."},"rate":{"type":"number","description":"The rate at which sample should be generated by the node.","default":10},"amplitude":{"default":1,"description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"frequency":{"default":1,"description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"phase":{"default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_width":{"default":1,"description":"The width of the pulse, with respect to the rate","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_low":{"default":0,"description":"The low value of the pulse signal.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"pulse_high":{"default":1,"description":"The high value of the pulse signal.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"stddev":{"default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"offset":{"default":0,"description":"Adds a constant offset to each of the generated signals.","allOf":[{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}]},"limit":{"type":"integer","default":-1,"description":"Limit the number of generated output samples by this node-type.\nA negative number disables the limitation.\n"},"realtime":{"type":"boolean","default":true,"description":"Wait `1 / rate` seconds between emitting each sample."},"monitor_missed":{"type":"boolean","default":true,"description":"If `true`, the `signal` node-type will count missed steps and warn the user during every iteration about missed steps.\nEspecially at high rates, it can be beneficial for performance to set this flag to `false`.\nWarnings would namely cause system calls which will slow the node down even more, and thus cause even more missed steps.\n"},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-signal-type":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"]},"node-signal-value":{"description":"A single value which is applied to all generated signals, or an array\nwith one value per signal (its length must then match `values`).\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]}}},"node-signal_v2-signal":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-signal_v2":{"title":"Signal Generator (v2)","type":"object","required":["type","in"],"properties":{"type":{"type":"string","const":"signal.v2"},"realtime":{"type":"boolean","default":true,"description":"Pace the generation of samples by the `rate` setting."},"limit":{"type":"integer","default":-1,"description":"Stop the node after the provided number of samples."},"rate":{"type":"number","default":10,"description":"The rate at which the samples are generated if operating in real-time mode (See `realtime` option)."},"monitor_missed":{"type":"boolean","default":true,"description":"Raise warnings if the signal generator fails to operate in real-time due to missed deadlines."},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-signal_v2-signal":{"type":"object","required":["signal"],"properties":{"signal":{"type":"string","enum":["random","sine","square","triangle","ramp","counter","constant","mixed","pulse"],"description":"The type of signal which should be generated:\n\n- `random`: a random walk with normal distributed step sizes will be generated.\n- `sine`: a sine signal will be generated.\n- `square`: a square / rectangle wave will be generated.\n- `triangle`: a triangle wave will be generated.\n- `ramp`: the generator will produce a ramp signal in the interval `[ 0, 1 / f ]`.\n- `counter`: increasing integer counter is generated.\n- `constant`: a constant value generated.\n- `mixed`: the signals of of each sample are generated by cycling over all remaining signal types.\n- `pulse`: generates pulses with a set frequency, phase and width\n"},"amplitude":{"type":"number","description":"The amplitude of the signal when the `signal` setting is one of `sine`, `square` or `triangle`.","default":1},"frequency":{"type":"number","description":"The frequency of the signal when the `signal` setting is one of `sine`, `square`, `triangle`,`pulse` or `ramp`.","default":1},"phase":{"type":"number","default":0,"description":"Tha pase of the signal when the `signal` setting is one of `sine` or `pulse`."},"pulse_width":{"type":"number","default":1,"description":"The width of the pulse, with respect to the rate"},"pulse_low":{"type":"number","default":0,"description":"The low value of the pulse signal."},"pulse_high":{"type":"number","default":1,"description":"The high value of the pulse signal."},"stddev":{"type":"number","default":0.2,"description":"The standard deviation of the normal distributed steps if the `signal` setting is set to `random`."},"offset":{"type":"number","default":0,"description":"Adds a constant offset to each of the generated signals."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-socket":{"type":"object","required":["type","in","out"],"properties":{"type":{"type":"string","const":"socket"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"layer":{"type":"string","enum":["udp","ip","eth","unix","local","tcp-client","tcp-server"],"default":"udp","description":"Select the network layer which should be used for the socket. Please note that `eth` can only be used locally in a LAN as it contains no routing information for the internet.\n"},"in":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The local address and port number this node should listen for incoming packets.\n\nUse `*` to listen on all interfaces: `local = \"*:12000\"`.\n"},"verify_source":{"type":"boolean","default":false,"description":"Check if source address of incoming packets matches the remote address.\n"},"multicast":{"type":"object","required":["group"],"properties":{"enabled":{"type":"boolean","default":true,"description":"Weather or not multicast group subscription is active.\n"},"group":{"type":"string","description":"The multicast group. Must be within 224.0.0.0/4\n"},"interface":{"type":"string","description":"The address of the interface which should join the multicast group.\n"},"ttl":{"type":"integer","minimum":0,"default":255,"description":"The time to live for outgoing multicast packets.\n"},"loop":{"type":"boolean","default":false,"description":"Whether or not sent multicast packets should be looped back to the local socket.\n"}},"additionalProperties":false},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","required":["address"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"address":{"type":"string","description":"The remote address and port number to which this node will send data.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-stats-signal":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-stats":{"title":"Statistics","type":"object","required":["type","rate","in"],"properties":{"type":{"type":"string","const":"stats"},"rate":{"type":"number","description":"A rate in Hz at which the statistics are generated by this node."},"in":{"type":"object","required":["signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-stats-signal":{"type":"object","required":["stats"],"properties":{"stats":{"type":"string","description":"The statistic to expose as a signal, given as `..`\n(for example `node1.owd.mean`).\n"},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-temper":{"title":"PCSensor / TEMPer USB temperature sensors","type":"object","required":["type"],"properties":{"type":{"type":"string","const":"temper"},"calibration":{"type":"object","properties":{"scale":{"type":"number","default":1,"description":"A scaling factor for calibrating the sensor."},"offset":{"type":"number","default":0,"description":"An offset for calibrating the sensor."}},"additionalProperties":false},"bus":{"type":"integer","description":"A filter applied to the USB bus number for selecting a specific sensor if multiple are available."},"port":{"type":"integer","description":"A filter applied to the USB port number for selecting a specific sensor if multiple are available."},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-test_rtt":{"title":"Round-trip Time Test","type":"object","required":["type","cases"],"properties":{"type":{"type":"string","const":"test_rtt"},"format":{"default":"villas.human","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"prefix":{"type":"string","description":"A prefix which is prepended to the output file name of the RTT test result file.","example":"test_1"},"output":{"type":"string","default":".","description":"A directory path at which the RTT test result files be placed."},"shutdown":{"type":"boolean","description":"If set, the node will shut down VILLASnode after all test cases have finished."},"cooldown":{"type":"number","default":0,"description":"A default cool-down time between consecutive test cases.\nThe node will insert a pause between the tests to avoid any network effects of the previous test-case to influence the upcoming test-case.\n"},"warmup":{"type":"number","default":0,"description":"A default warm-up time in seconds before the measurement of each test-case is started.\n"},"rates":{"description":"The default list of sending rates in Hz used by test-cases which do not specify their own `rates`.\n","oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"values":{"description":"The default list of sample lengths used by test-cases which do not specify their own `values`.\n","oneOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"count":{"type":"integer","default":1000,"description":"The default number of samples used by test-cases which do not specify their own `count`.\n"},"duration":{"type":"number","default":300,"description":"The default duration in seconds used by test-cases which do not specify their own `duration`.\n"},"mode":{"type":"string","enum":["min","max","at_least_count","at_least_duration","stop_after_count","stop_after_duration"],"description":"The default mode used by test-cases which do not specify their own `mode`."},"cases":{"type":"array","description":"A list of test-case specifications.\n\nThe values from the `rates` and `values` settings of each test-case specification will be used to form a cross-product.\n","items":{"type":"object","properties":{"rates":{"description":"A list of sending rates in Hz.\nThe resulting test-case will generate samples at the given rate.\n","example":[10,100,1000,10000],"oneOf":[{"type":"number"},{"type":"array","items":{"type":"number"}}]},"values":{"description":"A list of sample length.\nThe resulting test-case will generate samples with the given number of signals.\n","example":[10,100],"oneOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}}]},"count":{"description":"The resulting test-case will send the number of samples specified by this setting.\nThis setting is exclusive with the `duration` setting.\n","type":"integer","example":10000},"duration":{"description":"The resulting test-case will be stopped after the configured duration in seconds.\nThis setting is exclusive with the `count` setting.\n","type":"number","example":60},"mode":{"type":"string","enum":["min","max","at_least_count","at_least_duration","stop_after_count","stop_after_duration"]}},"additionalProperties":false}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-uldaq-signal":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false},"node-uldaq":{"title":"Measurement Computing DAQ devices (uldaq)","type":"object","required":["type","in"],"properties":{"type":{"type":"string","const":"uldaq"},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"interface_type":{"type":"string","enum":["usb","bluetooth","ethernet","any"],"description":"The interface to which the ADC is connected. Check manual for your device."},"device_id":{"type":"string","example":"10000","description":"The used device type. If empty it is auto detected."},"in":{"type":"object","description":"Configuration for the ul201","required":["sample_rate","signals"],"properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"sample_rate":{"type":"number","minimum":0,"default":1000,"example":10000,"description":"The default sampling rate of the input signals."},"range":{"type":"string","enum":["bipolar-60","bipolar-30","bipolar-15","bipolar-20","bipolar-10","bipolar-5","bipolar-4","bipolar-2.5","bipolar-2","bipolar-1.25","bipolar-1","bipolar-0.625","bipolar-0.5","bipolar-0.25","bipolar-0.125","bipolar-0.2","bipolar-0.1","bipolar-0.078","bipolar-0.05","bipolar-0.01","bipolar-0.005","unipolar-60","unipolar-30","unipolar-15","unipolar-20","unipolar-10","unipolar-5","unipolar-4","unipolar-2.5","unipolar-2","unipolar-1.25","unipolar-1","unipolar-0.625","unipolar-0.5","unipolar-0.25","unipolar-0.125","unipolar-0.2","unipolar-0.1","unipolar-0.078","unipolar-0.05","unipolar-0.01","unipolar-0.005"],"description":"The default input range for signals. Check manual for your device.\n\n## Supported ranges\n\n| Value | Min | Max |\n| :--------------- | :------ | :----- |\n| `bipolar-60` | -60.0 | +60.0 |\n| `bipolar-60` | -60.0 | +60.0 |\n| `bipolar-30` | -30.0 | +30.0 |\n| `bipolar-15` | -15.0 | +15.0 |\n| `bipolar-20` | -20.0 | +20.0 |\n| `bipolar-10` | -10.0 | +10.0 |\n| `bipolar-5` | -5.0 | +5.0 |\n| `bipolar-4` | -4.0 | +4.0 |\n| `bipolar-2.5` | -2.5 | +2.5 |\n| `bipolar-2` | -2.0 | +2.0 |\n| `bipolar-1.25` | -1.25 | +1.25 |\n| `bipolar-1` | -1.0 | +1.0 |\n| `bipolar-0.625` | -0.625 | +0.625 |\n| `bipolar-0.5` | -0.5 | +0.5 |\n| `bipolar-0.25` | -0.25 | +0.25 |\n| `bipolar-0.125` | -0.125 | +0.125 |\n| `bipolar-0.2` | -0.2 | +0.2 |\n| `bipolar-0.1` | -0.1 | +0.1 |\n| `bipolar-0.078` | -0.078 | +0.078 |\n| `bipolar-0.05` | -0.05 | +0.05 |\n| `bipolar-0.01` | -0.01 | +0.01 |\n| `bipolar-0.005` | -0.005 | +0.005 |\n| `unipolar-60` | 0.0 | +60.0 |\n| `unipolar-30` | 0.0 | +30.0 |\n| `unipolar-15` | 0.0 | +15.0 |\n| `unipolar-20` | 0.0 | +20.0 |\n| `unipolar-10` | 0.0 | +10.0 |\n| `unipolar-5` | 0.0 | +5.0 |\n| `unipolar-4` | 0.0 | +4.0 |\n| `unipolar-2.5` | 0.0 | +2.5 |\n| `unipolar-2` | 0.0 | +2.0 |\n| `unipolar-1.25` | 0.0 | +1.25 |\n| `unipolar-1` | 0.0 | +1.0 |\n| `unipolar-0.625` | 0.0 | +0.625 |\n| `unipolar-0.5` | 0.0 | +0.5 |\n| `unipolar-0.25` | 0.0 | +0.25 |\n| `unipolar-0.125` | 0.0 | +0.125 |\n| `unipolar-0.2` | 0.0 | +0.2 |\n| `unipolar-0.1` | 0.0 | +0.1 |\n| `unipolar-0.078` | 0.0 | +0.078 |\n| `unipolar-0.05` | 0.0 | +0.05 |\n| `unipolar-0.005` | 0.0 | +0.00 |\n"},"input_mode":{"type":"string","enum":["differential","single-ended","pseudo-differential"],"description":"The default sampling type. Check manual for you device."},"sample_clock_source":{"type":"string","enum":["internal","external"],"description":"The clock source used for sampling."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"type":"array","items":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false,"definitions":{"node-uldaq-signal":{"type":"object","properties":{"range":{"type":"string","description":"The range for a specific channel. See `range` for allowed values"},"input_mode":{"type":"string","description":"The input mode for a specific channel. See `input_mode` for allowed values"},"channel":{"type":"integer","example":5,"description":"The channel input number of the device."},"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"node-webrtc":{"type":"object","required":["type","session"],"properties":{"type":{"type":"string","const":"webrtc"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"wait_seconds":{"type":"integer","default":0,"description":"Suspend start-up of VILLASnode for some seconds until the connection with the remote peer has been established.\n"},"ordered":{"type":"boolean","default":false,"description":"Indicates if data is allowed to be delivered out of order.\nThe default value of false, does not make guarantees that data will be delivered in order.\n"},"max_retransmits":{"type":"integer","default":0,"description":"Limit the number of times a channel will retransmit data if not successfully delivered.\nThis value may be clamped if it exceeds the maximum value supported.\n"},"session":{"type":"string","title":"Session identifier","description":"A unique session identifier which must be shared between two nodes"},"peer":{"type":"string","title":"Peer identifier","description":"A unique peer identifier within the session. Defaults to the node UUID."},"server":{"type":"string","title":"Signaling Server Address","description":"Address to the websocket signaling server","default":"wss://villas.k8s.eonerc.rwth-aachen.de/ws/signaling"},"ice":{"type":"object","title":"ICE configuration settings","properties":{"servers":{"title":"ICE Servers","description":"A list of ICE servers used for connection establishment","type":"array","items":{"type":"string","format":"uri","title":"STUN & TURN server URI","description":"A valid Uniform Resource Identifier (URI) identifying a STUN or TURN server.\n\nSee [RFC7064](https://datatracker.ietf.org/doc/html/rfc7064) and [RFC7065](https://datatracker.ietf.org/doc/html/rfc7065) for details.\n\nAs an extension to the URI format specified additional username & password can be specified as shown in the examples\n"}},"tcp":{"type":"boolean","title":"Enable ICE over TCP","description":"Whether or not ICE candidates using the TCP transport should be gathered."}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-websocket":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"websocket"},"wait_connected":{"default":false,"type":"boolean"},"destinations":{"description":"During startup connect to those WebSocket servers as a client.\n\nEach URI must use the following scheme:\n\n```\nprotocol://host:port/nodename\n```\n\nIt starts with a protocol which must be one of `ws` (unencrypted) or `wss` (SSL).\nThe host name or IP address is separated by `://`.\nThe optional port number is separated by a colon `:`.\nThe node name is separated by a slash `/`.\n","type":"array","items":{"type":"string","format":"uri","description":"A WebSocket URI"}},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node-zeromq":{"type":"object","required":["type"],"properties":{"type":{"type":"string","const":"zeromq"},"format":{"default":"villas.binary","$schema":"http://json-schema.org/draft-07/schema","description":"The payload format which is used to encode and decode exchanged messages.\n","example":"villas.human","type":["object","string"],"discriminator":{"x-villas-plugin":"format","propertyName":"type","mapping":{"csv":"#/components/schemas/format-csv","gtnet":"#/components/schemas/format-gtnet","iotagent_ul":"#/components/schemas/format-iotagent_ul","json":"#/components/schemas/format-json","json.edgeflex":"#/components/schemas/format-json_edgeflex","json.kafka":"#/components/schemas/format-json_kafka","json.reserve":"#/components/schemas/format-json_reserve","opal.asyncip":"#/components/schemas/format-opal_asyncip","protobuf":"#/components/schemas/format-protobuf","raw":"#/components/schemas/format-raw","tsv":"#/components/schemas/format-tsv","value":"#/components/schemas/format-value","villas.binary":"#/components/schemas/format-villas_binary","villas.human":"#/components/schemas/format-villas_human","villas.web":"#/components/schemas/format-villas_web"}}},"pattern":{"type":"string","enum":["pubsub","radiodish"],"description":"The ZeroMQ messaging pattern which is used by this node."},"ipv6":{"type":"boolean","default":false},"curve":{"title":"CurveZMQ cryptography","description":"**Note:** This feature is currently broken.\n\nYou can use the [`villas zmq-keygen`](../usage/villas-zmq-keygen.md) command to create a new keypair for the following configuration options:\n","type":"object","required":["public_key","secret_key"],"properties":{"enabled":{"type":"boolean","description":"Whether or not the encryption is enabled."},"public_key":{"type":"string","description":"The public key of the server.\n"},"secret_key":{"type":"string","description":"The secret key of the server.\n"}},"additionalProperties":false},"in":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"subscribe":{"description":"A single endpoint URI or list of URIs to which this node should connect as a subscriber.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"filter":{"type":"string","description":"A filter which is used to select messages to receive."},"bind":{"type":"boolean","description":"Whether this node binds to the endpoint instead of connecting to it."},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false},"out":{"type":"object","properties":{"enabled":{"default":true,"type":"boolean","description":"Whether or not this direction of the node is used.\n"},"publish":{"description":"A single endpoint URI or list of URIs on which this node should publish messages.","oneOf":[{"type":"string","format":"uri"},{"type":"array","items":{"type":"string","format":"uri"}}]},"filter":{"type":"string","description":"A filter which is prepended to published messages."},"bind":{"type":"boolean","description":"Whether this node binds to the endpoint instead of connecting to it."},"netem":{"description":"The netem configuration allows the user to apply network impairments to packets send out by the nodes.\n\nPlease note, that the network emulation feature is currently supported by the following node-types:\n- [`socket`](/docs/node/nodes/socket)\n- [`nanomsg`](/docs/node/nodes/nanomsg)\n- [`zeromq`](/docs/node/nodes/zeromq)\n- [`rtp`](/docs/node/nodes/rtp)\n","type":"object","properties":{"enabled":{"type":"boolean","default":true,"description":"Enable or disable the network emulation for this node.\n"},"distribution":{"description":"One of the delay distributions supported by the `tc` command (see [tc-netem(8)](https://man7.org/linux/man-pages/man8/tc-netem.8.html)).\n","oneOf":[{"type":"string","enum":["uniform","normal","pareto","paretonormal"]},{"type":"array","items":{"type":"integer"}}]},"correlation":{"type":"number","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1},"delay":{"description":"Delay packets in microseconds.\n","type":"integer","minimum":1},"jitter":{"title":"Jitter","description":"Apply a jitter to the packet delay (in microseconds).\n","type":"integer","minimum":1},"loss":{"title":"Packet Loss Percentage","description":"Percentage of packets which will be dropped.\n","type":"number","minimum":0,"maximum":100},"duplicate":{"title":"Packet Duplication Percentage","description":"Percentage of packets which will be duplicated.\n","type":"number","minimum":0,"maximum":100},"corruption":{"title":"Packet Corruption Percentage","description":"Percentage of packets which will be corrupted.\n","type":"number","minimum":0,"maximum":100}},"additionalProperties":false},"fwmark":{"type":"integer","minimum":1,"description":"Firewall mark (fwmark) which is applied to all outgoing packets of this node.\n\nThis can be used together with the `tc` traffic control subsystem (see also `netem`)\nto classify and shape the traffic emitted by this node.\n"},"builtin":{"default":true,"type":"boolean","title":"Builtin hook functions","description":"By default, each node and paths has a couple of default hooks attached to them. With this setting the attachment of built-in hooks can be disabled.\n"},"vectorize":{"default":1,"type":"integer","minimum":1,"description":"This setting allows to send multiple samples in a single message to the destination nodes.\n\nThe value of this setting determines how many samples will be combined into one packet.\n"},"hooks":{"default":[],"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"signals":{"description":"List of signal definition objects","type":"array","example":[{"name":"tap_position","type":"integer","init":0},{"name":"voltage","type":"float","unit":"V","init":230}],"items":{"type":"object","properties":{"name":{"type":"string","title":"Signal name","description":"A name which describes the signal.\n","example":"Bus123_U"},"unit":{"type":"string","title":"Signal unit","description":"The unit of the signal.","example":"V"},"type":{"type":"string","title":"Signal data-type","description":"The data-type of the signal.\n","default":"float","enum":["integer","float","boolean","complex"]},"init":{"title":"Initial signal value.","description":"The initial value of the signal.\n","oneOf":[{"type":"number"},{"type":"boolean"},{"type":"object","required":["real","imag"],"additionalProperties":false,"properties":{"real":{"type":"number"},"imag":{"type":"number"}}}]},"enabled":{"type":"boolean","default":true,"description":"Signals can be disabled which causes them to be ignored.\n"}},"additionalProperties":false}}},"additionalProperties":false}},"additionalProperties":false},"node":{"$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","fmu":"#/components/schemas/node-fmu","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}},"path":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}},"config-http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP/WebSocket server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":8080,"title":"Listening port","description":"The TCP port number on which the HTTP & WebSocket server listens.\nDefaults to 80 when running as root, otherwise 8080.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"config-logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"config":{"$schema":"http://json-schema.org/draft-07/schema","title":"VILLASnode configuration file","description":"Schema of the VILLASnode configuration file.","type":"object","additionalProperties":false,"properties":{"ethercat":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global EtherCAT master configuration","type":"object","properties":{"master":{"type":"integer"},"alias":{"type":"integer"},"coupler":{"type":"object","properties":{"position":{"type":"integer"},"product_code":{"type":"integer"},"vendor_id":{"type":"integer"}},"additionalProperties":false}},"additionalProperties":false},"fpgas":{"$schema":"http://json-schema.org/draft-07/schema","description":"Global FPGA configuration","type":"object","additionalProperties":{"allOf":[{"description":"FPGA Card configuration","type":"object","required":["interface"],"properties":{"interface":{"type":"string","enum":["pcie","platform"]},"name":{"type":"string"},"ips":{"type":"string"},"affinity":{"type":"integer"},"do_reset":{"type":"boolean"},"slot":{"type":"string"},"id":{"type":"string"},"polling":{"type":"boolean"},"paths":{"type":"array","items":{"type":"object","required":["from","to"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"reverse":{"type":"boolean"}},"additionalProperties":false}},"ignore_ips":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"not":{"required":["name"]}}]}},"nodes":{"title":"Node Objects","description":"A mapping from unique identifiers to node configurations.\n","type":"object","additionalProperties":{"x-additionalPropertiesName":"Node Name","$schema":"http://json-schema.org/draft-07/schema","type":"object","discriminator":{"x-villas-plugin":"node","propertyName":"type","mapping":{"amqp":"#/components/schemas/node-amqp","c37.118":"#/components/schemas/node-c37_118","can":"#/components/schemas/node-can","comedi":"#/components/schemas/node-comedi","ethercat":"#/components/schemas/node-ethercat","example":"#/components/schemas/node-example","exec":"#/components/schemas/node-exec","fmu":"#/components/schemas/node-fmu","file":"#/components/schemas/node-file","fpga":"#/components/schemas/node-fpga","iec60870-5-104":"#/components/schemas/node-iec60870-5-104","iec61850-8-1":"#/components/schemas/node-iec61850-8-1","iec61850-9-2":"#/components/schemas/node-iec61850-9-2","infiniband":"#/components/schemas/node-infiniband","influxdb":"#/components/schemas/node-influxdb","kafka":"#/components/schemas/node-kafka","loopback":"#/components/schemas/node-loopback","modbus":"#/components/schemas/node-modbus","mqtt":"#/components/schemas/node-mqtt","nanomsg":"#/components/schemas/node-nanomsg","ngsi":"#/components/schemas/node-ngsi","opal.async":"#/components/schemas/node-opal_async","opal.orchestra":"#/components/schemas/node-opal_orchestra","opendss":"#/components/schemas/node-opendss","redis":"#/components/schemas/node-redis","rtp":"#/components/schemas/node-rtp","shmem":"#/components/schemas/node-shmem","signal":"#/components/schemas/node-signal","signal.v2":"#/components/schemas/node-signal_v2","socket":"#/components/schemas/node-socket","stats":"#/components/schemas/node-stats","temper":"#/components/schemas/node-temper","test_rtt":"#/components/schemas/node-test_rtt","uldaq":"#/components/schemas/node-uldaq","webrtc":"#/components/schemas/node-webrtc","websocket":"#/components/schemas/node-websocket","zeromq":"#/components/schemas/node-zeromq"}}}},"paths":{"title":"Path list","description":"A list of uni-directional paths which connect the nodes defined in the `nodes` list.\n","type":"array","default":[],"items":{"type":"object","required":["in"],"additionalProperties":false,"properties":{"in":{"description":"The in settings expects the name of one or more source nodes or mapping expressions.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"out":{"description":"The out setting expects the name of one or more destination nodes. Each sample which is processed by the path will be sent to each of the destination nodes.\n","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"enabled":{"type":"boolean","default":true,"description":"Whether this path is enabled.\nA disabled path is loaded from the configuration but not started.\n"},"mode":{"type":"string","default":"any","enum":["any","all"],"description":"The mode setting specifies under which condition a path is triggered.\nA triggered path will multiplex / merge samples from its input nodes and run the configured hook functions on them.\nAfterwards the processed and merged samples will be send to all output nodes.\n\nTwo modes are currently supported:\n\n- `any`: The path will trigger the path as soon as any of the masked (see `mask`) input nodes received new samples.\n- `all`: The path will trigger the path as soon as all input nodes received at least one new sample.\n"},"mask":{"description":"This setting allows masking the input nodes which can trigger the path.\n\nSee also `mode` setting.\n","type":"array","items":{"type":"string","description":"A node-name"}},"rate":{"type":"number","minimum":0,"default":0,"description":"A non-zero value will periodically trigger the path and resend the last sample again.\n\nA value of zero will disable this feature.\n"},"original_sequence_no":{"type":"boolean","default":false,"description":"When this flag is set, the original sequence number from the source node will be used when multiplexing the nodes.\n"},"hooks":{"type":"array","title":"Hook List","example":["print",{"type":"limit_rate","rate":1000}],"items":{"description":"Hooks form a pipeline of steps which process, filter or alter sample data.\n","example":"print","type":["object","string"],"discriminator":{"x-villas-expand":"hook","propertyName":"type","mapping":{"average":"#/components/schemas/hook-average","cast":"#/components/schemas/hook-cast","decimate":"#/components/schemas/hook-decimate","digest":"#/components/schemas/hook-digest","dp":"#/components/schemas/hook-dp","drop":"#/components/schemas/hook-drop","dump":"#/components/schemas/hook-dump","ebm":"#/components/schemas/hook-ebm","fix":"#/components/schemas/hook-fix","frame":"#/components/schemas/hook-frame","gate":"#/components/schemas/hook-gate","jitter_calc":"#/components/schemas/hook-jitter_calc","limit_rate":"#/components/schemas/hook-limit_rate","limit_value":"#/components/schemas/hook-limit_value","lua":"#/components/schemas/hook-lua","ma":"#/components/schemas/hook-ma","pmu_dft":"#/components/schemas/hook-pmu_dft","pps_ts":"#/components/schemas/hook-pps_ts","print":"#/components/schemas/hook-print","reorder_ts":"#/components/schemas/hook-reorder_ts","restart":"#/components/schemas/hook-restart","rms":"#/components/schemas/hook-rms","round":"#/components/schemas/hook-round","scale":"#/components/schemas/hook-scale","shift_seq":"#/components/schemas/hook-shift_seq","shift_ts":"#/components/schemas/hook-shift_ts","skip_first":"#/components/schemas/hook-skip_first","stats":"#/components/schemas/hook-stats","ts":"#/components/schemas/hook-ts"}}}},"uuid":{"description":"A globally unique ID which identifies the path for the use via the API.\n","type":"string","format":"uuid"},"affinity":{"type":"integer","description":"A mask which pins the execution of this path to a set of CPU cores.\n"},"poll":{"description":"A boolean flag which enables the poll-based mode for reading samples from multiple path sources.\n\n**Note:** This is an advanced setting.\nMost users should use the default value which will always do the right thing based on the number and type of input nodes for this path.\n","type":"boolean"},"builtin":{"description":"If enabled, the path will start with a set of default and builtin hook functions.\n","type":"boolean","default":true},"queuelen":{"description":"The length of the path queue. It limits how many samples can be _in flight_ at any point in time.\nIf you see queue or pool underrun warnings, try to increase this value.\n","type":"integer"}}}},"http":{"type":"object","properties":{"enabled":{"type":"boolean","default":true,"title":"Enable HTTP/WebSocket server","description":"When set to `false`, the built-in HTTP & WebSocket server is disabled and will not listen on any port.\n"},"port":{"type":"integer","default":8080,"title":"Listening port","description":"The TCP port number on which the HTTP & WebSocket server listens.\nDefaults to 80 when running as root, otherwise 8080.\n"},"ssl_cert":{"type":"string","title":"SSL Certificate Path","description":"The public x509 certificate used for server-side SSL encryption.\n","example":"/etc/ssl/certs/mycert.pem"},"ssl_private_key":{"type":"string","title":"SSL Private Key Path","description":"The private x509 key used for server-side SSL encryption.\n","example":"/etc/ssl/private/mykey.pem"}},"additionalProperties":false},"logging":{"type":"object","title":"Logging configuration","properties":{"level":{"title":"The log level","description":"This setting expects one of the allowed strings to adjust the logging level.\nUse this with care! Producing a lot of IO by enabling the debug output might decrease the performance of the server.\n","type":"string","default":"info","enum":["trace","debug","info","warning","error","critical","off"]},"file":{"type":"string","title":"Log file name","description":"Write all log messages to a file.\n"},"syslog":{"type":"boolean","default":false,"title":"Enable syslog logging","description":"If enabled VILLASnode will log to the [system log](https://en.wikipedia.org/wiki/Syslog).\n"},"expressions":{"title":"Logging expressions","description":"The logging expression allow for a fine grained control of log levels per individual logger instance.\nExpressions are provided as a list of logger name pattern and the desired level.\n\n**Note:** The expressions are evaluated in the order of their appearance in the list.\n","type":"array","items":{"type":"object","required":["name","level"],"properties":{"name":{"type":"string","title":"Logger name filter","description":"The [glob](https://man7.org/linux/man-pages/man7/glob.7.html)-style pattern to match the names of the loggers for which the level should be adjusted."},"level":{"type":"string","title":"Log level","description":"The level which should be used for the matched loggers.\n","enum":["trace","debug","info","warning","error","critical","off"]}},"additionalProperties":false}}},"additionalProperties":false},"hugepages":{"type":"integer","default":100,"title":"Number of reserved hugepages","description":"The number of hugepages which will be reservered by the system.\n\nSee: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt\n\nA value of zero will disable the use of huge pages.\n"},"stats":{"type":"number","default":1,"title":"Statistics interval","description":"Specifies the rate at which statistics about the active paths will be periodically printed to the screen.\n\nSetting this value to 5, will print 5 lines per second.\n\nA line includes information such as:\n\n- Source and Destination of path\n- Messages received\n- Messages sent\n- Messages dropped\n"},"affinity":{"type":"integer","default":0,"title":"Task/Process affinity mask","description":"Restricts the exeuction of the daemon to certain CPU cores.\nThis technique, also called 'pinning', improves the determinism of the server by isolating the daemon processes on exclusive cores.\n\nA value of `0` will not change the affinity of the process.\n"},"priority":{"type":"integer","default":0,"description":"Adjusts the scheduling priority of the deamon processes.\nBy default, the daemon uses a real-time optimized FIFO scheduling algorithm.\n\nA value of `0` will not change the priority of the process.\n"},"idle_stop":{"type":"boolean","default":false},"uuid":{"type":["string","null"],"format":"uuid","title":"Super-node UUID","default":null,"description":"Each VILLASnode instance is identified by a globally unique indentifier / UUID.\n\nThis UUID can be queried by the API.\n\nIf the setting is not provided, a UUID will be generated by hashing the active VILLASnode configuration.\nThis ensures that restarting the VILLASnode instance with the identical configuration will yield always the same UUID.\n"},"seed":{"type":"integer","default":0,"title":"Random number generator seed","description":"The seed for the random number generator used by the VILLASnode instance.\n"}}},"edgeflex":{"title":"PMU measurements as used in the EdgeFlex project by Manuel","description":"VILLASnode does not support deseralization (yet).\n","type":"object","required":["created"],"properties":{"created":{"title":"Sampling timestamp","description":"A timestamps in miliseconds since 1970-01-01 00:00:00","type":"number","minimum":0}},"additionalProperties":{"description":"Key-value pairs of measurements","anyOf":[{"type":"number"},{"type":"integer"},{"type":"boolean"},{"type":"object","description":"A complex number represented in real and imaginary components","properties":{"real":{"type":"number"},"imag":{"type":"number"}},"additionalProperties":false}]},"example":{"created":1633791645123,"signal0":123.456,"signal1":true,"signal2":1234,"signal3":{"real":1234.4556,"imag":23232.12312}}},"igor":{"title":"PMU format used by Igor","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"channel":"BUS1-VA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IA","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IB","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IC","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-VN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11},{"channel":"BUS1-IN","magnitude":9.171,"phase":0.8305,"frequency":50.1,"rocof":0.11}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","description":"Name of the monitored bus"},"magnitude":{"type":"number","description":"Amplitude of the measured signal [V]"},"phase":{"type":"number","description":"Phase of the measured signal [radian]"},"frequency":{"type":"number","description":"Frequency of the line signal [Hz]"},"rocof":{"type":"number","description":"Rate of change of frequency [Hz/s]"}},"additionalProperties":false}}},"additionalProperties":false},"sogno-old":{"title":"Original PMU sensor data format as used in the SOGNO EU project","type":"object","required":["device","timestamp","component","measurand","phase","data"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false,"example":{"device":"pmu-abc0","timestamp":"2021-10-07T10:11:12.1231241+02:00","component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123124}},"sogno":{"title":"PMU format used in SOGNO LF project","example":{"device":"device1","timestamp":"2020-05-20T10:27:57.980802+00:00","readings":[{"component":"7a30b61a-2913-11ec-9621-0242ac130002","measurand":"voltmagnitude","phase":"A","data":123}]},"type":"object","required":["device","timestamp","readings"],"properties":{"device":{"description":"ID for measurement device","type":"string"},"timestamp":{"description":"Timestamp of measurement in ISO 8601 format","type":"string","pattern":"^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$"},"readings":{"type":"array","items":{"type":"object","properties":{"component":{"description":"ID (uuid) from CIM document","type":"string","format":"uuid"},"measurand":{"type":"string","enum":["voltmagnitude","voltangle","currmagnitude","currangle","activepower","reactivepower","apparentpower","frequency"]},"phase":{"type":"string","enum":["A","B","C"]},"data":{"type":"number","description":"Measurement value as in the following format depending on value of measurand:\n - voltmagnitude: phase-to-ground RMS value, unit volts\n - voltangle: unit radian\n - currmagnitude: RMS value, unit ampere\n - currangle: unit radian\n - activepower: single phase power, unit watts\n - reactivepower: single phase power, unit voltampere reactive\n - apparentpower: single phase power, unit voltampere\n - frequency: unit hertz\n"}},"additionalProperties":false}}},"additionalProperties":false}},"parameters":{"node-uuid-name":{"name":"uuid-or-name","description":"Either a UUID or node-name","in":"path","required":true,"schema":{"oneOf":[{"type":"string","format":"uuid"},{"type":"string","pattern":"[a-z0-9_-]{2,32}"}]}},"path-uuid":{"name":"uuid","description":"A globally unique identifier for each path.","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}}},"x-tagGroups":[{"name":"VILLASnode APIs","tags":["super-node","nodes","paths"]},{"name":"Configuration Files","tags":["config"]},{"name":"Format Schemas","tags":["format-edgeflex","format-igor","format-sogno","format-sogno-old"]}]})BUNDLED_SCHEMA"); // clang-format on return schema; From 85ecab65c882eeeff8c53fbc979e54ed4413ee9d Mon Sep 17 00:00:00 2001 From: Alexandra Date: Thu, 10 Sep 2026 08:29:51 +0000 Subject: [PATCH 11/12] fix(node-fmu): Fix typo in config and schema Signed-off-by: Alexandra --- doc/openapi/components/schemas/node-fmu.yaml | 4 +++- tests/integration/node-fmu.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/openapi/components/schemas/node-fmu.yaml b/doc/openapi/components/schemas/node-fmu.yaml index 5086c435f..af444f888 100644 --- a/doc/openapi/components/schemas/node-fmu.yaml +++ b/doc/openapi/components/schemas/node-fmu.yaml @@ -62,6 +62,8 @@ properties: signals: $ref: ./shared-signal-list.yaml + additionalProperties: false + out: type: object properties: @@ -90,6 +92,6 @@ properties: signals: $ref: ./shared-signal-list.yaml - additionalProperties: false + additionalProperties: false additionalProperties: false diff --git a/tests/integration/node-fmu.sh b/tests/integration/node-fmu.sh index ddf56f513..c6f057623 100755 --- a/tests/integration/node-fmu.sh +++ b/tests/integration/node-fmu.sh @@ -47,7 +47,7 @@ cat > config.json < Date: Sat, 12 Sep 2026 06:27:34 +0000 Subject: [PATCH 12/12] fix(node-fmu): Fix writing_turn in exp config Signed-off-by: Alexandra --- etc/examples/nodes/fmu.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/examples/nodes/fmu.conf b/etc/examples/nodes/fmu.conf index 98e75d921..143a27cbf 100644 --- a/etc/examples/nodes/fmu.conf +++ b/etc/examples/nodes/fmu.conf @@ -5,9 +5,9 @@ nodes = { fmu_node = { type = "fmu" # Path to FMU file (.fmu) - fmu_path = "/workspaces/node/fmu_temp/asine.fmu" - fmu_unpack_path = "/workspaces/node/fmu_temp/fmu_asine" - fmu_write_first = true + fmu_path = "/workspaces/node/tests/integration/Dahlquist.fmu" + fmu_unpack_path = "/workspaces/node/tests/integration/fmu_dahl" + fmu_writing_turn = true stop_time = 10.0 start_time = 0.0 step_size = 0.2