{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "multilingual": {
      "type": "object",
      "required": [
        "en"
      ],
      "patternProperties": {
        "en|de|ru|pt|nl|fr|it|es|pl|uk|zh-cn": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "iobrokerObject": {
      "type": "object",
      "required": [
        "_id",
        "type"
      ],
      "properties": {
        "_id": {
          "type": "string"
        },
        "type": {
          "type": "string"
        },
        "common": {
          "type": "object"
        }
      }
    },
    "isCompactTrue": {
      "properties": {
        "compact": {
          "const": true
        }
      },
      "required": [
        "compact"
      ]
    },
    "disallowNodeProcessParams": {
      "not": {
        "required": [
          "nodeProcessParams"
        ]
      }
    }
  },
  "type": "object",
  "required": [
    "common"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "description": "JSON schema for validation",
      "type": "string"
    },
    "common": {
      "required": [
        "name",
        "version",
        "platform",
        "titleLang",
        "news",
        "desc",
        "mode"
      ],
      "additionalProperties": false,
      "description": "Contains all common instance attributes",
      "type": "object",
      "properties": {
        "name": {
          "description": "Name of the adapter without ioBroker",
          "type": "string",
          "pattern": "^(?![i|I][o|O][b|B][r|R][o|O][k|K][e|E][r|R])"
        },
        "version": {
          "description": "Current adapter version",
          "type": "string",
          "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"
        },
        "platform": {
          "description": "Platform, normally Javascript/Node.js",
          "type": "string",
          "enum": [
            "Javascript/Node.js"
          ]
        },
        "title": {
          "description": "Longer name of adapter DEPRECATED: For admin version >= 5 this property is no longer required",
          "type": "string"
        },
        "titleLang": {
          "description": "Longer name of adapter in all supported languages like {en: 'Adapter', de: 'adapter', ru: 'Драйвер'}",
          "$ref": "#/definitions/multilingual"
        },
        "news": {
          "description": "Short form of changelog in all supported languages",
          "type": "object",
          "minProperties": 1,
          "maxProperties": 20,
          "patternProperties": {
            "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$": {
              "$ref": "#/definitions/multilingual"
            }
          },
          "additionalProperties": false
        },
        "desc": {
          "description": "Description, object for multilingual description",
          "$ref": "#/definitions/multilingual"
        },
        "messagebox": {
          "description": "true if messagebox supported. Hence, the adapter can receive sendTo messages. Up from controller v5, please use common.supportedMessages.notifications.custom = true",
          "type": "boolean"
        },
        "supportedMessages": {
          "description": "Object which defines, if the adapter supports receiving messages via sendTo. Additionally, it defines if specific messages are supported.",
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "custom": {
              "description": "If custom messages are supported (same as legacy messagebox)",
              "type": "boolean"
            },
            "notifications": {
              "description": "If notification handling is supported, for information, see https://github.com/foxriver76/ioBroker.notification-manager#requirements-for-messaging-adapters",
              "type": "boolean"
            },
            "stopInstance": {
              "description": "If adapter supports signal stopInstance. Use number if you need more than 1000 ms for stop routine. The signal will be sent before stop to the adapter. (used if problems occurred with SIGTERM). (Same as legacy `supportStopInstance`)",
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "number",
                  "multipleOf": 1,
                  "minimum": 1000
                }
              ]
            },
            "getHistory": {
              "description": "If adapter supports getHistory message. (Same as legacy `getHistory`, to avoid problems, set both flags in parallel for now)",
              "type": "boolean"
            }
          }
        },
        "readme": {
          "description": "Url of the ReadMe file",
          "type": "string"
        },
        "adminUI": {
          "description": "Type of the admin UI",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "config"
          ],
          "properties": {
            "custom": {
              "description": "UI type of custom tab inside admin UI",
              "type": "string",
              "const": "json"
            },
            "config": {
              "description": "UI type of config page inside admin UI",
              "type": "string",
              "enum": [
                "html",
                "json",
                "materialize",
                "none"
              ]
            },
            "tab": {
              "description": "UI type of tab inside admin UI",
              "type": "string",
              "enum": [
                "html",
                "materialize"
              ]
            }
          }
        },
        "docs": {
          "description": "The structure like {\"en\": \"docs/en/README.md\", \"de\": [\"docs/de/README.md\", \"docs/de/README1.md\"]} that describes the documentation if not in README.md",
          "type": "object",
          "required": [
            "en"
          ],
          "patternProperties": {
            "en|de|ru|pt|nl|fr|it|es|pl|uk|zh-cn": {
              "type": [
                "string",
                "array"
              ],
              "minItems": 1,
              "items": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        },
        "authors": {
          "description": "Array of authors as string",
          "type": "array",
          "minItems": 1,
          "items": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string"
                  }
                }
              }
            ]
          }
        },
        "license": {
          "description": "License of the software",
          "type": "string",
          "enum": [
            "LPL-1.02",
            "NTP",
            "OFL-1.1",
            "Bahyph",
            "Hippocratic-2.1",
            "VOSTROM",
            "CC-BY-3.0-AT",
            "CC-BY-NC-SA-2.5",
            "W3C-20150513",
            "LGPL-3.0-only",
            "GFDL-1.1-only",
            "CDL-1.0",
            "CC-BY-ND-2.5",
            "CC-BY-NC-SA-3.0-IGO",
            "OGC-1.0",
            "RPL-1.1",
            "GPL-2.0-or-later",
            "Sendmail",
            "LGPL-2.0-only",
            "OSL-3.0",
            "Libpng",
            "MS-RL",
            "MIT-CMU",
            "Linux-OpenIB",
            "Latex2e-translated-notice",
            "psutils",
            "Clips",
            "CC-BY-NC-SA-2.0-FR",
            "EUDatagrid",
            "CC-BY-ND-3.0",
            "w3m",
            "OLDAP-2.3",
            "AGPL-3.0-only",
            "AGPL-1.0-or-later",
            "TMate",
            "GFDL-1.3-invariants-only",
            "SchemeReport",
            "NAIST-2003",
            "BSD-4-Clause-Shortened",
            "PDDL-1.0",
            "XSkat",
            "CC-BY-ND-4.0",
            "BSD-3-Clause-LBNL",
            "MIT-open-group",
            "UnixCrypt",
            "LiLiQ-P-1.1",
            "Eurosym",
            "JPNIC",
            "NPL-1.1",
            "NLOD-2.0",
            "NPL-1.0",
            "CC-BY-SA-2.1-JP",
            "LGPLLR",
            "PHP-3.01",
            "Ruby",
            "CC-BY-2.0",
            "QPL-1.0-INRIA-2004",
            "Aladdin",
            "ODC-By-1.0",
            "Intel-ACPI",
            "LGPL-2.1-or-later",
            "MPL-2.0-no-copyleft-exception",
            "Parity-6.0.0",
            "Zlib",
            "CC-BY-SA-1.0",
            "CC-BY-SA-2.0-UK",
            "ADSL",
            "Net-SNMP",
            "YPL-1.0",
            "Baekmuk",
            "BitTorrent-1.1",
            "Arphic-1999",
            "BSD-3-Clause-No-Nuclear-Warranty",
            "MTLL",
            "JPL-image",
            "ZPL-2.0",
            "TCP-wrappers",
            "GPL-1.0-or-later",
            "PSF-2.0",
            "Nokia",
            "Entessa",
            "AMPAS",
            "TU-Berlin-1.0",
            "Adobe-Glyph",
            "DL-DE-BY-2.0",
            "MPL-1.0",
            "Dotseqn",
            "IBM-pibs",
            "Plexus",
            "HP-1986",
            "LPPL-1.1",
            "OLDAP-1.2",
            "ZPL-2.1",
            "LPL-1.0",
            "HPND-sell-variant-MIT-disclaimer",
            "OFFIS",
            "CrystalStacker",
            "Adobe-2006",
            "Zimbra-1.3",
            "CUA-OPL-1.0",
            "EUPL-1.1",
            "IJG",
            "Afmparse",
            "PolyForm-Noncommercial-1.0.0",
            "NCGL-UK-2.0",
            "EPL-2.0",
            "CC-BY-ND-1.0",
            "CC-BY-ND-2.0",
            "OFL-1.1-no-RFN",
            "HPND-Markus-Kuhn",
            "Xnet",
            "CNRI-Python",
            "Zimbra-1.4",
            "SGI-B-1.0",
            "MakeIndex",
            "GFDL-1.1-no-invariants-only",
            "TCL",
            "BSD-Protection",
            "Xdebug-1.03",
            "CC-BY-2.5-AU",
            "CECILL-C",
            "BSD-4.3RENO",
            "Brian-Gladman-3-Clause",
            "CC-BY-NC-SA-1.0",
            "OGTSL",
            "OLDAP-2.7",
            "HaskellReport",
            "RPL-1.5",
            "Unlicense",
            "XFree86-1.1",
            "CC-BY-SA-3.0",
            "OLDAP-2.2.2",
            "CC-BY-3.0-IGO",
            "snprintf",
            "CC-BY-NC-2.0",
            "dtoa",
            "MITNFA",
            "AML",
            "Artistic-2.0",
            "CECILL-2.0",
            "App-s2p",
            "SSH-short",
            "AAL",
            "VSL-1.0",
            "AFL-2.0",
            "OML",
            "CC-BY-3.0-US",
            "mplus",
            "Qhull",
            "FDK-AAC",
            "BSD-4-Clause-UC",
            "PolyForm-Small-Business-1.0.0",
            "Sleepycat",
            "OLDAP-2.2",
            "Spencer-99",
            "OGL-UK-1.0",
            "EUPL-1.2",
            "Linux-man-pages-copyleft-2-para",
            "FreeBSD-DOC",
            "RSCPL",
            "eGenix",
            "CC-BY-2.5",
            "HPND",
            "SCEA",
            "GPL-3.0-only",
            "Bitstream-Charter",
            "LAL-1.2",
            "APSL-1.0",
            "Caldera",
            "Xerox",
            "SWL",
            "MS-LPL",
            "Cube",
            "APSL-2.0",
            "APAFML",
            "Watcom-1.0",
            "SISSL",
            "CDDL-1.0",
            "CC-BY-SA-3.0-AT",
            "psfrag",
            "C-UDA-1.0",
            "MPL-1.1",
            "CC-BY-3.0-NL",
            "GFDL-1.2-invariants-only",
            "BSD-3-Clause-Attribution",
            "CC-BY-NC-3.0-DE",
            "GFDL-1.1-or-later",
            "NCSA",
            "BSD-1-Clause",
            "ANTLR-PD-fallback",
            "BSD-3-Clause-Modification",
            "COIL-1.0",
            "UPL-1.0",
            "CC-BY-1.0",
            "Leptonica",
            "Frameworx-1.0",
            "OLDAP-1.1",
            "FTL",
            "Artistic-1.0-cl8",
            "CC-BY-NC-ND-3.0-IGO",
            "CC-BY-SA-3.0-IGO",
            "OGL-Canada-2.0",
            "YPL-1.1",
            "CC-BY-NC-3.0",
            "AGPL-3.0-or-later",
            "SSPL-1.0",
            "IPL-1.0",
            "TPL-1.0",
            "Knuth-CTAN",
            "MIT",
            "Rdisc",
            "Abstyles",
            "CECILL-2.1",
            "libtiff",
            "ErlPL-1.1",
            "Kazlib",
            "RPSL-1.0",
            "BSD-3-Clause-Clear",
            "MIT-feh",
            "GPL-1.0-only",
            "MPL-2.0",
            "LPPL-1.3c",
            "CDLA-Permissive-1.0",
            "Xfig",
            "CC-PDDC",
            "Inner-Net-2.0",
            "ECL-1.0",
            "SMLNJ",
            "GFDL-1.2-only",
            "ECL-2.0",
            "Multics",
            "CC-BY-NC-4.0",
            "GFDL-1.3-no-invariants-only",
            "OFL-1.0-RFN",
            "OSL-2.1",
            "CC-BY-SA-2.0",
            "CATOSL-1.1",
            "ICU",
            "BUSL-1.1",
            "OPL-UK-3.0",
            "copyleft-next-0.3.0",
            "Symlinks",
            "Crossword",
            "DOC",
            "ISC",
            "Apache-2.0",
            "copyleft-next-0.3.1",
            "ASWF-Digital-Assets-1.1",
            "SISSL-1.2",
            "Unicode-TOU",
            "BSD-2-Clause",
            "CDLA-Permissive-2.0",
            "CC-BY-NC-SA-3.0",
            "HPND-export-US",
            "etalab-2.0",
            "OSET-PL-2.1",
            "GFDL-1.1-invariants-or-later",
            "OpenSSL",
            "ASWF-Digital-Assets-1.0",
            "SGI-B-2.0",
            "CC0-1.0",
            "BSD-Attribution-HPND-disclaimer",
            "mpich2",
            "Artistic-1.0",
            "GFDL-1.3-only",
            "OGDL-Taiwan-1.0",
            "GFDL-1.2-no-invariants-or-later",
            "LiLiQ-Rplus-1.1",
            "ImageMagick",
            "X11-distribute-modifications-variant",
            "dvipdfm",
            "MulanPSL-1.0",
            "Unicode-DFS-2015",
            "CC-BY-NC-1.0",
            "LGPL-3.0-or-later",
            "GD",
            "mpi-permissive",
            "OLDAP-2.6",
            "Minpack",
            "NGPL",
            "diffmark",
            "Latex2e",
            "OGL-UK-2.0",
            "AFL-2.1",
            "AFL-1.2",
            "Python-2.0.1",
            "CECILL-B",
            "OCCT-PL",
            "OSL-1.1",
            "Spencer-86",
            "xinetd",
            "GFDL-1.2-invariants-or-later",
            "Boehm-GC",
            "Graphics-Gems",
            "CAL-1.0-Combined-Work-Exception",
            "CC-BY-3.0-DE",
            "GLWTPL",
            "NIST-PD-fallback",
            "BSD-3-Clause",
            "NetCDF",
            "CC-BY-ND-3.0-DE",
            "Parity-7.0.0",
            "OLDAP-2.0.1",
            "DRL-1.0",
            "TU-Berlin-2.0",
            "Borceux",
            "OLDAP-1.3",
            "Giftware",
            "SGI-B-1.1",
            "BSD-3-Clause-No-Nuclear-License",
            "curl",
            "OLDAP-1.4",
            "SNIA",
            "W3C",
            "GFDL-1.3-or-later",
            "D-FSL-1.0",
            "CC-BY-NC-SA-4.0",
            "Naumen",
            "FSFAP",
            "BSD-3-Clause-No-Military-License",
            "CC-BY-SA-4.0",
            "xlock",
            "Sendmail-8.23",
            "MS-PL",
            "NIST-PD",
            "Community-Spec-1.0",
            "CERN-OHL-1.1",
            "GFDL-1.2-or-later",
            "LGPL-2.0-or-later",
            "Condor-1.1",
            "CDDL-1.1",
            "Glide",
            "OFL-1.0-no-RFN",
            "CMU-Mach",
            "ODbL-1.0",
            "LOOP",
            "Motosoto",
            "LGPL-2.1-only",
            "NASA-1.3",
            "EUPL-1.0",
            "zlib-acknowledgement",
            "SugarCRM-1.1.3",
            "Widget-Workshop",
            "Info-ZIP",
            "BSD-Advertising-Acknowledgement",
            "CC-BY-NC-ND-1.0",
            "MIT-0",
            "OCLC-2.0",
            "OSL-1.0",
            "Saxpath",
            "IJG-short",
            "Zend-2.0",
            "Cornell-Lossless-JPEG",
            "CECILL-1.0",
            "OpenPBS-2.3",
            "CC-BY-SA-2.5",
            "DSDP",
            "Martin-Birgmeier",
            "CPOL-1.02",
            "MIT-advertising",
            "IPA",
            "CC-BY-NC-ND-3.0-DE",
            "CC-BY-SA-3.0-DE",
            "AMDPLPA",
            "SimPL-2.0",
            "EPL-1.0",
            "AGPL-1.0-only",
            "SAX-PD",
            "GFDL-1.1-no-invariants-or-later",
            "bzip2-1.0.6",
            "FSFUL",
            "Spencer-94",
            "CFITSIO",
            "AdaCore-doc",
            "BSD-Source-Code",
            "Noweb",
            "SMPPL",
            "Linux-man-pages-copyleft-var",
            "Barr",
            "OLDAP-2.1",
            "TTWL",
            "CNRI-Python-GPL-Compatible",
            "OSL-2.0",
            "GFDL-1.3-invariants-or-later",
            "xpp",
            "W3C-19980720",
            "Linux-man-pages-1-para",
            "APL-1.0",
            "CPAL-1.0",
            "ClArtistic",
            "NIST-Software",
            "UCL-1.0",
            "OGL-UK-3.0",
            "TORQUE-1.1",
            "NOSL",
            "LiLiQ-R-1.1",
            "OFL-1.0",
            "CC-BY-NC-SA-2.0",
            "MIT-Wu",
            "RHeCos-1.1",
            "MIT-Festival",
            "HPND-sell-variant",
            "GPL-3.0-or-later",
            "TOSL",
            "GFDL-1.2-no-invariants-only",
            "BlueOak-1.0.0",
            "LPPL-1.2",
            "iMatix",
            "LZMA-SDK-9.11-to-9.20",
            "TPDL",
            "CC-BY-3.0",
            "Apache-1.0",
            "Fair",
            "EFL-2.0",
            "GPL-2.0-only",
            "CERN-OHL-P-2.0",
            "Wsuipa",
            "SPL-1.0",
            "BSD-3-Clause-No-Nuclear-License-2014",
            "MirOS",
            "blessing",
            "Jam",
            "OLDAP-2.4",
            "ANTLR-PD",
            "LZMA-SDK-9.22",
            "PHP-3.0",
            "OLDAP-2.2.1",
            "CC-BY-NC-SA-2.0-DE",
            "libpng-2.0",
            "UCAR",
            "gnuplot",
            "CC-BY-NC-2.5",
            "NRL",
            "Python-2.0",
            "CC-BY-NC-SA-2.0-UK",
            "GL2PS",
            "CC-BY-NC-ND-2.0",
            "AFL-1.1",
            "CC-BY-NC-ND-2.5",
            "MIT-enna",
            "CC-BY-NC-ND-4.0",
            "BSL-1.0",
            "Linux-man-pages-copyleft",
            "BSD-4-Clause",
            "QPL-1.0",
            "CERN-OHL-1.2",
            "metamail",
            "checkmk",
            "NTP-0",
            "Imlib2",
            "CC-BY-NC-ND-3.0",
            "APSL-1.2",
            "Mup",
            "SSH-OpenSSH",
            "OLFL-1.3",
            "BSD-3-Clause-Open-MPI",
            "EFL-1.0",
            "Intel",
            "Beerware",
            "CPL-1.0",
            "TermReadKey",
            "MulanPSL-2.0",
            "CNRI-Jython",
            "SHL-0.51",
            "CERN-OHL-W-2.0",
            "BSD-2-Clause-Patent",
            "SunPro",
            "TAPR-OHL-1.0",
            "CERN-OHL-S-2.0",
            "ZPL-1.1",
            "CC-BY-4.0",
            "BitTorrent-1.0",
            "libselinux-1.0",
            "AFL-3.0",
            "X11",
            "CC-BY-NC-SA-3.0-DE",
            "Bitstream-Vera",
            "RSA-MD",
            "BSD-4.3TAHOE",
            "EPICS",
            "OPL-1.0",
            "SHL-0.5",
            "FSFULLRWD",
            "WTFPL",
            "OPUBL-1.0",
            "LAL-1.3",
            "LPPL-1.3a",
            "NBPL-1.0",
            "OFL-1.1-RFN",
            "OLDAP-2.0",
            "SGP4",
            "GFDL-1.1-invariants-only",
            "CECILL-1.1",
            "GFDL-1.3-no-invariants-or-later",
            "Apache-1.1",
            "NLOD-1.0",
            "Vim",
            "PostgreSQL",
            "FSFULLR",
            "NLPL",
            "Glulxe",
            "libutil-David-Nugent",
            "Zed",
            "FreeImage",
            "0BSD",
            "CDLA-Sharing-1.0",
            "APSL-1.1",
            "JasPer-2.0",
            "HTMLTIDY",
            "Newsletr",
            "OLDAP-2.8",
            "LPPL-1.0",
            "O-UDA-1.0",
            "JSON",
            "Unicode-DFS-2016",
            "NICTA-1.0",
            "IEC-Code-Components-EULA",
            "Elastic-2.0",
            "MIT-Modern-Variant",
            "OLDAP-2.5",
            "Artistic-1.0-Perl",
            "CAL-1.0",
            "BSD-2-Clause-Views",
            "Interbase-1.0",
            "NPOSL-3.0",
            "gSOAP-1.3b"
          ]
        },
        "type": {
          "description": "Type of the adapter",
          "type": "string",
          "enum": [
            "alarm",
            "climate-control",
            "communication",
            "date-and-time",
            "energy",
            "metering",
            "garden",
            "general",
            "geoposition",
            "hardware",
            "health",
            "household",
            "infrastructure",
            "iot-systems",
            "lighting",
            "logic",
            "messaging",
            "misc-data",
            "multimedia",
            "network",
            "protocols",
            "storage",
            "utility",
            "vehicle",
            "visualization",
            "visualization-icons",
            "visualization-widgets",
            "weather"
          ]
        },
        "unsafePerm": {
          "description": "if the package must be installed with \"npm --unsafe-perm\" parameter",
          "type": "boolean"
        },
        "plugins": {
          "description": "ioBroker plugins to be used",
          "type": "object"
        },
        "adminColumns": {
          "description": "Custom attributes, that must be shown in admin in the object browser. Like: [{\"name\": {\"en\": \"KNX address\"}, \"path\": \"native.address\", \"width\": 100, \"align\": \"left\"}, {\"name\": \"DPT\", \"path\": \"native.dpt\", \"width\": 100, \"align\": \"right\", \"type\": \"number\", \"edit\": true, \"objTypes\": [\"state\", \"channel\"]}]. type is a type of the attribute (e.g. string, number, boolean) and only needed if edit is enabled. objTypes is a list of the object types, that could have such attribute. Used only in edit mode too.",
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "name",
              "path",
              "width",
              "align"
            ],
            "properties": {
              "name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "$ref": "#/definitions/multilingual"
                  }
                ]
              },
              "path": {
                "type": "string"
              },
              "width": {
                "type": "number",
                "minimum": 0
              },
              "align": {
                "type": "string",
                "enum": [
                  "left",
                  "right",
                  "center",
                  "justify"
                ]
              },
              "type": {
                "type": "string"
              },
              "edit": {
                "type": "boolean"
              },
              "objTypes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "adminTab": {
          "description": "Adds a Tab which can be shown in admin adapter",
          "type": "object",
          "required": [
            "fa-icon",
            "link",
            "name"
          ],
          "additionalProperties": false,
          "properties": {
            "fa-icon": {
              "description": "Font-Awesome icon name for TAB",
              "type": "string"
            },
            "ignoreConfigUpdate": {
              "description": "Do not update config TAB if configuration changed (to enable configure settings in TAB)",
              "type": "boolean"
            },
            "link": {
              "description": "Link for iframe in the TAB. You can use parameters replacement like this: \"https://%ip%:%port%\". IP will be replaced with host IP. \"port\" will be extracted from native.port.",
              "type": "string"
            },
            "name": {
              "description": "Name of TAB (multilingual object) in admin",
              "$ref": "#/definitions/multilingual"
            },
            "singleton": {
              "description": "If true, only one TAB for all instances will be shown.",
              "type": "boolean"
            }
          }
        },
        "controller": {
          "description": "Only used by js-controller",
          "type": "boolean"
        },
        "allowInit": {
          "description": "allow for \"scheduled\" adapter to be called \"not in the time schedule\", if settings changed or adapter started. Or allow scheduled adapter start once after configuration changed and then by schedule.",
          "type": "boolean"
        },
        "availableModes": {
          "description": "values for common.mode if more than one mode is possible",
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "enum": [
              "none",
              "daemon",
              "subscribe",
              "schedule",
              "once",
              "extension"
            ]
          }
        },
        "blockly": {
          "description": "if adapter has custom blocks for blockly (admin/blockly.js required)",
          "type": "boolean"
        },
        "connectionType": {
          "description": "Type of connection to device",
          "type": "string",
          "enum": [
            "none",
            "local",
            "cloud"
          ]
        },
        "compact": {
          "description": "If compact mode supported",
          "type": "boolean"
        },
        "dataFolder": {
          "description": "Folder relative to iobroker-data where the adapter stores the data. This folder will be backed up and restored automatically. You can use variable '%INSTANCE%' in it",
          "type": "string"
        },
        "dataSource": {
          "description": "How the data will be received from device",
          "type": "string",
          "enum": [
            "none",
            "poll",
            "push",
            "assumption"
          ]
        },
        "dependencies": {
          "description": "Array like [{\"js-controller\": \">=2.0.0\"}] that describes which ioBroker modules are required for this adapter on the same host",
          "type": "array",
          "items": {
            "type": [
              "object",
              "string"
            ]
          }
        },
        "enabled": {
          "description": "Value should be false so new instances are disabled by default",
          "type": "boolean"
        },
        "eraseOnUpload": {
          "description": "erase all previous data in the directory before upload",
          "type": "boolean",
          "default": true
        },
        "extIcon": {
          "description": "Link to external icon for uninstalled adapters. Normally on GitHub",
          "type": "string"
        },
        "getHistory": {
          "description": "if adapter supports getHistory message. (Up from controller v5, please use `common.supportedMessages.getHistory`)",
          "type": "boolean"
        },
        "globalDependencies": {
          "description": "Array like [{\"admin\": \">=2.0.0\"}] that describes which ioBroker modules are required for this adapter on one of the hosts",
          "type": "array",
          "items": {
            "type": [
              "object",
              "string"
            ]
          }
        },
        "icon": {
          "description": "name of the local icon (should be located in subdirectory \"admin\")",
          "type": "string"
        },
        "keywords": {
          "description": "Similar to keywords in package.json, but can be defined in many languages.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "localLinks": {
          "description": "Link to the web service of this adapter. E.g {\"_default\": \"http://localhost:5984/_utils\"} for button in admin",
          "type": "object",
          "patternProperties": {
            ".+": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "properties": {
                    "link": {
                      "type": "string"
                    },
                    "color": {
                      "type": "string"
                    },
                    "pro": {
                      "type": "boolean"
                    },
                    "icon": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": false,
                  "required": [
                    "link"
                  ]
                }
              ]
            }
          }
        },
        "loglevel": {
          "description": "Default Loglevel after instance creation",
          "type": "string",
          "enum": [
            "silly",
            "debug",
            "info",
            "warn",
            "error"
          ]
        },
        "logTransporter": {
          "description": "If this adapter receives logs from other hosts and adapters (e.g. to store them somewhere)",
          "type": "boolean"
        },
        "main": {
          "description": "Name of the start file. DEPRECATED: For controller >= 3.3 please use package.json main.",
          "type": "string"
        },
        "materialize": {
          "description": "If adapter supports > admin3 (materialize style) DEPRECATED: For admin version >= 5 please use the property 'adminUI'",
          "type": "boolean"
        },
        "materializeTab": {
          "description": "If adapter supports > admin3 for tab (materialize style) DEPRECATED: For admin version >= 5 please use the property 'adminUI'",
          "type": "boolean"
        },
        "mode": {
          "description": "Execution mode of the adapter",
          "type": "string",
          "enum": [
            "none",
            "daemon",
            "subscribe",
            "schedule",
            "once",
            "extension"
          ]
        },
        "noConfig": {
          "description": "Do not show configuration dialog for instance DEPRECATED: For admin version >= 5 please use adminUI.config = \"none\"",
          "type": "boolean"
        },
        "noIntro": {
          "description": "never show instances of this adapter on Intro/Overview screen in admin (like icons, widgets)",
          "type": "boolean"
        },
        "noRepository": {
          "description": "If adapter delivered with initial installation or has own repository",
          "type": "boolean"
        },
        "nogit": {
          "description": "If true, no install from github directly is possible",
          "type": "boolean"
        },
        "nondeletable": {
          "description": "This adapter cannot be deleted or updated. It will be updated together with controller.",
          "type": "boolean"
        },
        "onlyWWW": {
          "description": "Say to controller, that adapter has only html files and no main.js, like rickshaw",
          "type": "boolean"
        },
        "osDependencies": {
          "description": "OS packages which should be installed on adapter installation",
          "type": "object",
          "additionalProperties": false,
          "patternProperties": {
            "linux|darwin|win32": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "os": {
          "description": "String or array of supported operation systems, e.g [\"linux\", \"darwin\"]",
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "linux",
                "darwin",
                "win32"
              ]
            },
            {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string",
                "enum": [
                  "linux",
                  "darwin",
                  "win32"
                ]
              }
            }
          ]
        },
        "preserveSettings": {
          "description": "String (or array) with names of attributes in common of instance, which will not be deleted. E.g. \"history\", so by setState('system.adapter.mqtt.0\", {..}) the field common.history will not be deleted even if new object does not have this field. To delete the attribute it must be explicitly done with common:{history: null}.",
          "type": [
            "string",
            "array"
          ],
          "items": {
            "type": "string"
          }
        },
        "restartAdapters": {
          "description": "Array with names of adapter that must be restarted after this adapter is installed, e.g. [\"vis\"]",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "restartSchedule": {
          "description": "CRON schedule to restart mode daemon adapters",
          "type": "string"
        },
        "schedule": {
          "description": "CRON schedule if adapter runs in mode schedule",
          "type": "string"
        },
        "serviceStates": {
          "description": "If adapter can deliver additional states. If true, the path adapter/lib/states.js (or given path as string) will be called and it give following parameters function (objects, states, instance, config, callback). The function must deliver the array of points with values like function (err, result) { result = [{id: 'id1', val: 1}, {id: 'id2', val: 2}]}",
          "type": [
            "boolean",
            "string"
          ]
        },
        "singletonHost": {
          "description": "Adapter can be installed only once on one host",
          "type": "boolean"
        },
        "singleton": {
          "description": "Adapter can be installed only once in whole system",
          "type": "boolean"
        },
        "stopBeforeUpdate": {
          "description": "If adapter must be stopped before update",
          "type": "boolean"
        },
        "stopTimeout": {
          "description": "timeout in ms to wait, till adapter shut down",
          "type": "number",
          "default": 500,
          "minimum": 0,
          "multipleOf": 1
        },
        "subscribable": {
          "description": "Variables of this adapter must be subscribed with sendTo to enable updates",
          "type": "boolean"
        },
        "subscribe": {
          "description": "Name of variable, that is subscribed automatically",
          "type": "string"
        },
        "supportCustoms": {
          "description": "If the adapter support settings for every state. It has to have custom.html file in admin. Sample can be found in ioBroker.history",
          "type": "boolean"
        },
        "supportStopInstance": {
          "description": "If adapter supports signal stopInstance (messagebox required). Use number if you need more than 1000 ms for stop routine. The signal will be sent before stop to the adapter. (used if problems occurred with SIGTERM). (Up from controller v5, please use `common.supportedMessages.stopInstance`)",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "number",
              "multipleOf": 1,
              "minimum": 1000
            }
          ]
        },
        "visWidgets": {
          "description": "Overview of vis 2 widgets provided by the adapter, define the name of the provided sets as keys",
          "minProperties": 1,
          "type": "object",
          "patternProperties": {
            ".+": {
              "description": "The key represents the name of a provided widget set",
              "required": [
                "url",
                "components",
                "i18n"
              ],
              "type": "object",
              "properties": {
                "i18n": {
                  "description": "Translation for the widget",
                  "anyOf": [
                    {
                      "description": "Translations will be loaded from visWidgets.<SET_NAME>.url and i18n/<LANG>.json",
                      "const": true
                    },
                    {
                      "description": "Translations will be loaded from customComponent.js with name ./translations",
                      "const": "component"
                    },
                    {
                      "description": "Define translations here",
                      "type": "object",
                      "patternProperties": {
                        ".+": {
                          "$ref": "#/definitions/multilingual"
                        }
                      }
                    }
                  ]
                },
                "url": {
                  "description": "Relative path ('http://ip:port/vis/widgets/' + url) or full url to load component from",
                  "type": "string"
                },
                "components": {
                  "description": "Names of widgets which have to be shown, normally equal to the content of 'modulefederation.config.js'",
                  "type": "array",
                  "minItems": 1,
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "wakeup": {
          "description": "Adapter will be started if some value is written into system.adapter.NAME.x.wakeup. Normally the adapter should stop after processing of event.",
          "type": "boolean"
        },
        "webByVersion": {
          "description": "Show version as prefix in web adapter (usually - ip:port/material, webByVersion - ip:port/1.2.3/material)",
          "type": "boolean"
        },
        "webExtendable": {
          "description": "If web server in this adapter can be extended with plugin/extensions like proxy, simple-api",
          "type": "boolean"
        },
        "webExtension": {
          "description": "Relative filename to connect the web extension. E.g. in simple-api \"lib/simpleapi.js\" relative to the adapter root directory. Additionally is native.webInstance required to say where this extension will be included. Empty means, it must run as own web service. \"*\" means every web server must include it.",
          "type": "string"
        },
        "webPreSettings": {
          "description": "Object of parameters that must be included into info.js by webServer adapter. (Example material)",
          "type": "object"
        },
        "webservers": {
          "description": "Array of web server's instances that should serve content from the adapters www folder",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "welcomeScreen": {
          "description": "Array of pages, that should be shown on the \"web\" index.html page. [\"vis/edit.html\", \"vis/index.html\"] or [{\"link\": \"vis/edit.html\", \"name\": \"Vis editor\", \"img\": \"vis/img/edit.png\", \"color\": \"blue\"}, \"vis/index.html\"]",
          "type": "array",
          "items": {
            "type": [
              "string",
              "object"
            ]
          }
        },
        "welcomeScreenPro": {
          "description": "Array of pages used on access via ioBroker cloud, that should be shown on the \"web\" index.html page. [\"vis/edit.html\", \"vis/index.html\"] or [{\"link\": \"vis/edit.html\", \"name\": \"Vis editor\", \"img\": \"vis/img/edit.png\", \"color\": \"blue\"}, \"vis/index.html\"]",
          "type": "array",
          "items": {
            "type": [
              "string",
              "object"
            ]
          }
        },
        "wwwDontUpload": {
          "description": "Do not upload the www directory into DB. Used only for admin.",
          "type": "boolean"
        },
        "tier": {
          "description": "Lower tiers are started before higher tiers instances, TIER 1: LOGIC, TIER 2: APIs & other data, TIER 3: not fastly needed data, like BackItUp, Visualization, etc.",
          "type": "number",
          "minimum": 1,
          "maximum": 3,
          "default": 3
        },
        "messages": {
          "description": "Messages can be shown on adapter installation, update and instance creation",
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "title",
              "text",
              "buttons"
            ],
            "properties": {
              "condition": {
                "description": "Message will only be shown if condition matches",
                "additionalProperties": false,
                "type": "object",
                "properties": {
                  "operand": {
                    "description": "Operand to connect multiple rules",
                    "enum": [
                      "or",
                      "and"
                    ],
                    "default": "and"
                  },
                  "rules": {
                    "description": "Rules which need to be true, e.g. [\"oldVersion<2.0.0\", \"newVersion>=2.0.0\"]",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "title": {
                "description": "Title of the shown message",
                "$ref": "#/definitions/multilingual"
              },
              "text": {
                "description": "Text of the shown message",
                "$ref": "#/definitions/multilingual"
              },
              "link": {
                "description": "You can define a hyperlink, which will be shown, define its text with `linkText`",
                "type": "string"
              },
              "level": {
                "description": "The importance of the message",
                "enum": [
                  "info",
                  "warn",
                  "error"
                ],
                "default": "warn"
              },
              "linkText": {
                "description": "If a link is defined and should be embedded in text, you can define the text here",
                "$ref": "#/definitions/multilingual"
              },
              "buttons": {
                "description": "Predefined buttons of the message window",
                "type": "array",
                "items": {
                  "enum": [
                    "ok",
                    "agree",
                    "cancel"
                  ]
                }
              }
            }
          }
        },
        "nodeProcessParams": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "allOf": [
        {
          "if": {
            "$ref": "#/definitions/isCompactTrue"
          },
          "then": {
            "$ref": "#/definitions/disallowNodeProcessParams"
          }
        }
      ]
    },
    "objects": {
      "description": "Objects which will be created for the adapter",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iobrokerObject"
      }
    },
    "instanceObjects": {
      "description": "Objects which will be created for each instance",
      "type": "array",
      "items": {
        "$ref": "#/definitions/iobrokerObject"
      }
    },
    "notifications": {
      "description": "Register notifications for the built-in notification system",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "scope",
          "name",
          "description",
          "categories"
        ],
        "additionalProperties": false,
        "properties": {
          "scope": {
            "type": "string"
          },
          "name": {
            "description": "Name which will be shown to the user",
            "$ref": "#/definitions/multilingual"
          },
          "description": {
            "description": "Description which will be shown to the user",
            "$ref": "#/definitions/multilingual"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "category",
                "name",
                "severity",
                "description",
                "regex",
                "limit"
              ],
              "properties": {
                "category": {
                  "type": "string"
                },
                "name": {
                  "$ref": "#/definitions/multilingual"
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "info",
                    "notify",
                    "alert"
                  ],
                  "description": "`info` will only be shown by admin, while `notify` might also be used by messaging adapters, `alert` ensures both"
                },
                "description": {
                  "$ref": "#/definitions/multilingual"
                },
                "regex": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "limit": {
                  "type": "number",
                  "description": "Maximum amount of notifications to collect of this type"
                }
              }
            }
          }
        }
      }
    },
    "native": {
      "description": "Predefined attributes which are accessible in index_m.html and at runtime via adapter.config.<attribute>, e.g. {\"port\": 1234, \"password\": \"secret\"}",
      "type": "object"
    },
    "protectedNative": {
      "description": "Array of config attributes which will only be accessible by the own adapter, e.g. [\"password\"]",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "encryptedNative": {
      "description": "Array of config attributes which will be automatically encrypted when stored via Admin configuration page and automatically decrypted at adapter runtime, e.g. [\"password\", \"token\"]",
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}