# Filen app.json

# Användning

Filen app.json används i Edge-appar för att informera användarens gränssnitt om vilka parametrar som behöver sättas samt vilken typ av parameter det är. Filen informerar även gränssnittet om olika sidor som bör öppnas och vad varje sida skall innehålla. Förutsättningen för detta är att användaren i ett steg innan också har valt vilken installation som just denna instans ska köras på samt vad för namn som instansen skall ha. Det är upp till det specifika användargränssnittet att implementera de olika komponenterna beskrivna i detta dokument.

# Fält (inputs)

De olika fälten som användaren kan fylla i definieras här med en kort beskrivning av vad man skall kunna välja på. Resultatet av konfigurationen fylls sedan i config delen i JSON requesten för att skapa instansen.

All fält har följande variabler:

Namn Standard Beskrivning
required false Sätts till true om användaren måste fylla i fältet.
name Vilket namn som skall visas för användaren.
type Vilken typ av fält användaren ska fylla i, som beskrivet nedan.
description Hjälptext för att beskriva hur detta fält kommer användas i appen.

# single_function_selector

Låt användaren välja en funktion i en lista av funktioner. Det går även att låta användaren välja ett värde för vald funktion, till exempel om appen styr en dimmer och den skall slås på till 50%. Vid val av värdet bör användargränssnittet hantera olika funktionstyper.

Namn Standard Beskrivning
filter {} Ett JSON-objekt med metadata nyckel-värde för att filtrera ut funktionerna som går att välja på.
value false Sätt till true om användaren förväntas fylla i ett värde.

# Konfigurationsresultat

Med värden:

{
  "input-name": {
    "<function-id>": <value>
  }
}

Utan värden:

{
  "input-name": <function-id>
}

# multi_function_selector

Samma som föregående men användaren kan välja flera funktioner.

Namn Standard Beskrivning
filter {} Ett JSON-objekt med metadata nyckel-värde för att filtrera ut funktionerna som går att välja på.
value false Sätt till true om användaren förväntas fylla i ett värde.

# Konfigurationsresultat

Med värden:

{
  "input-name": {
    "<function-id-1>": <value>,
    "<function-id-2>": <value>
  }
}

Utan värden:

{
  "input-name": [
    <function-id-1>,
    <function-id-2>
  ]
}

# single_device_selector and multi_device_selector

Samma som funktions-väljaren men med enheter i stället.

# single_notification_output_selector

Gör att användaren kan välja på existerande notifikationsutskick på installationen. Det kan också finnas möjlighet för användaren att lämna den aktuella konfigurationen för att skapa ett nytt utskick i en separat flöde. Om detta är fallet bör användaren komma tillbaka till detta flöde (med alla inställningar kvar) och sedan kunna välja den nyss skapade notifikationen.

Namn Standard Beskrivning
allow_add true Om användaren tillåts lägga till nya utskick.

# Konfigurationsresultat

{
  "input-name": <notification-output-id>
}

# multi_notification_output_selector

Samma som oven, men användaren kan välja på flera utskick.

Namn Standard Beskrivning
allow_add true Om användaren tillåts lägga till nya utskick.

# Konfigurationsresultat

{
  "input-name": [
    <notification-output-id-1>,
    <notification-output-id-2>
  ]
}

# text

Låt användaren välja en text. Användaren kan tvingas mata in en text som uppfyller specifierad regex.

Namn Standard Beskrivning
default Vilket värde som skall stå i fältet om det är tomt.
multiline false Om användaren kan kan mata in en eller flera rader text.
validator Valbart Regexp som fältet valideras med, tom betyder ingen validering.
on_error Valbart felmeddelande som visas om texten inte matchar valideringen ovan.

# Konfigurationsresultat

{
  "input-name": "<value>"
}

# number

Namn Standard Beskrivning
default Vilket värde som skall stå i fältet om det är tomt.

# Konfigurationsresultat

{
  "input-name": <value>
}

# option

Låt användaren välja en av flera värden.

Namn Standard Beskrivning
default Vilket värde som är valt från början.
values { } En mappning mellan värde och namn på värdet som ett JSON-objekt.

# Konfigurationsresultat

{
  "input-name": <value>
}

# checkbox

Låt användaren välja en eller flera värden som checkboxar.

Namn Standard Beskrivning
default Vilket värde som är valt från början.
values { } En mappning mellan värde och namn på värdet som ett JSON-objekt.

# Konfigurationsresultat

{
  "input-name": [
    <value-1>,
    <value-2>
  ]
}

# toggle

Låt användaren välja mellan två värden som antingen eller.

Namn Standard Beskrivning
default false Vilket värde som är valt från början.
false_value Värdet som sätts om knappen är "av".
true_value Värde som sätts om knappen är "på".

# Konfigurationsresultat

{
  "input-name": <value>
}

# repeat

Låt användaren välja samma variabel flera gånger vilket resulterar i en lista av objekt i konfigurationen.

Namn Standard Beskrivning
min 0 Minsta antal gånger som fältet skall repeteras.
max obegränsad Max antal gånger som fältet skall repeteras.
input_fields Namn på de fält som skall repeteras.

# Konfigurationsresultat

{
  "input-name": [
    {
      "input-name-1": <config-object>,
      "input-name-2": <config-object>
    },
    {
      "input-name-1": <config-object>,
      "input-name-2": <config-object>
    }
  ]
}

# Guide

Guide-delen av filen beskriver olika sidor med inställningar som användaren måste gå igenom för att konfigurera appen. Varje sida består av en eller flera fält. Varje fält renderas enligt beskrivningen ovan. Sidorna renderas i samma ordning som denna array.

Varje sida kan ha en titel och en beskrivning för att förklara för användaren vilket område som fylls i här. Sidan innehåller också en lista med de fält som skall visas på just denna sida. Namnen på fälten motsvarar JSON-nyckeln i input_fields.

# Exempel

Detta är en exempelkonfiguration med två functions-val och ett textfält.

{
  "author": "IoT Open",
  "licence": "MIT",
  "input": {
    "actuator_function": {
      "type": "single_function_selector",
      "name": "Controlled functions",
      "description": "This function that is turned to on when app is triggered."
    },
    "trigger_function": {
      "type": "single_function_selector",
      "name": "Trigger function",
      "description": "The door that will trigger the light to turn on.",
      "value": true
    },
    "timeout": {
      "type": "number",
      "name": "Light on time",
      "description": "The time that the control function will be on before turning off again in minutes.",
      "default": "10"
    },
    "trigger_value": {
      "type": "single_function_selector",
      "name": "Function",
      "description": "Select function",
      "value": true,
      "filter": {
        "type": "temperature"
      }
    },
    "temp": {
      "type": "repeat",
      "name": "Temperature triggers",
      "description": "Select a function and the value that should trigger the app to run.",
      "min": 2,
      "max": 4,
      "input_fields": [
        "trigger_value"
      ]
    },
    "notification": {
      "type": "single_notification_output_selector",
      "name": "Notification",
      "description": "Select how you should be notified if the app have to send an alarm."
    },
    "text_example": {
      "type": "text",
      "multiline": false,
      "default": "Example text",
      "validator": "[a-zA-Z]*",
      "on_error": "The text can only contain letters"
    }
  },
  "guide": [
    {
      "id": "stage_1",
      "title": "Function selection",
      "description": "Set the functions you want to use.",
      "input_fields": [
        "trigger_function",
        "actuator_function"
      ]
    },
    {
      "id": "stage_2",
      "title": "Timeout settings",
      "description": "",
      "input_fields": [
        "timeout",
        "temp",
        "notification",
        "example_text"
      ]
    }
  ]
}

Resultatet av beskrivningen ovan är en konfiguration som kan skickas till API:et och ser ut såhär:

{
  "app_id": 5,
  "installation_id": 12,
  "version": "1.0.0",
  "config": {
    "timeout": 10,
    "trigger_function": 123,
    "actuator_function": {
      "4456": 255
    },
    "temp": [
      {
        "trigger_value": {
          "9": 26
        }
      },
      {
        "trigger_value": {
          "9": 35
        }
      },
      {
        "trigger_value": {
          "12": 10
        }
      }
    ],
    "notification": 456,
    "example_text": "HelloWorld"
  },
  "name": "My app instance"
}