[
  {
    "id": 0,
    "name": "",
    "desc": "Not configured",
    "param": [ ]
  },
  {
    "id": 22,
    "name": "Static image",
    "desc": "Shows a static image, from file system or painter. Make sure to resize the image to the correct resolution.",
    "param": [
      {
        "key": "filename",
        "name": "Filename",
        "desc": "Local filename on the littlefs drive",
        "type": "jpgfile"
      },
      {
        "key": "dither",
        "name": "Dithering",
        "desc": "Turn halftone dithering on or off. Turn it on when displaying photos. For texts, you better leave if off",
        "type": "select",
        "options": {
          "0": "off",
          "1": "floyd-steinberg dithering",
          "2": "ordered dithering"
        }
      }
    ]
  },
  {
    "id": 24,
    "name": "External image",
    "desc": "Image from external source",
    "param": [ ]
  },
  {
    "id": 25,
    "name": "Home Assistant",
    "desc": "Image from Home Assistant",
    "param": [ ]
  },
  {
    "id": 1,
    "name": "Current date",
    "desc": "Shows the current date",
    "param": [ ]
  },
  {
    "id": 2,
    "name": "Count days",
    "desc": "Counts days, starting with the value below. If the count value gets higher than the threshold, the number is displayed in red, otherwise it's black",
    "param": [
      {
        "key": "counter",
        "name": "Counter value",
        "desc": "Current value",
        "type": "int"
      },
      {
        "key": "thresholdred",
        "name": "Threshold",
        "desc": "Value is displayed in red if higher than the threshold",
        "type": "int"
      }
    ]
  },
  {
    "id": 3,
    "name": "Count hours",
    "desc": "Counts hours, starting with the value below. If the count value gets higher than the threshold, the number is displayed in red, otherwise it's black",
    "param": [
      {
        "key": "counter",
        "name": "Counter",
        "desc": "Current value",
        "type": "int"
      },
      {
        "key": "thresholdred",
        "name": "Threshold",
        "desc": "Value is displayed in red if higher than the threshold",
        "type": "int"
      }
    ]
  },
  {
    "id": 4,
    "name": "Current weather",
    "desc": "Current weather. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, choose from the drop down list.",
    "param": [
      {
        "key": "location",
        "name": "Location",
        "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title",
        "type": "geoselect"
      },
      {
        "key": "units",
        "name": "Units",
        "desc": "Celcius or Fahrenheit?",
        "type": "select",
        "options": {
          "0": "-Celcius / Beaufort / millimeters",
          "1": "Fahrenheit / mph / inches"
        }
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "How often the info is being refreshed.",
        "type": "select",
        "options": {
          "30": "-Every 30 minutes",
          "60": "Every hour",
          "180": "Every three hours"
        }
      },
      {
        "key": "#lat",
        "name": "Lat",
        "desc": "Latitude (set automatic when generating image)",
        "type": "ro"
      },
      {
        "key": "#lon",
        "name": "Lon",
        "desc": "Longitude (set automatic when generating image)",
        "type": "ro"
      },
      {
        "key": "#tz",
        "name": "Time zone",
        "desc": "Time zone (set automatic when generating image)",
        "type": "ro"
      }
    ]
  },
  {
    "id": 8,
    "name": "Weather forecast",
    "desc": "Weather forecast for the next five days. Weather data by Open-Meteo.com. Parameters Lat, Lon and Time Zone are filled automatically from the entered location. In case of an ambiguous location, you can alter those manually.",
    "param": [
      {
        "key": "location",
        "name": "Location",
        "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title",
        "type": "geoselect"
      },
      {
        "key": "units",
        "name": "Units",
        "desc": "Celcius or Fahrenheit?",
        "type": "select",
        "options": {
          "0": "-Celcius / Beaufort / millimeters",
          "1": "Fahrenheit / mph / inches"
        }
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "How often the forecast is being refreshed.",
        "type": "select",
        "options": {
          "60": "Every hour",
          "180": "-Every three hours",
          "-1440": "At midnight"
        }
      },
      {
        "key": "#lat",
        "name": "Lat",
        "desc": "Latitude (set automatic when generating image)",
        "type": "ro"
      },
      {
        "key": "#lon",
        "name": "Lon",
        "desc": "Longitude (set automatic when generating image)",
        "type": "ro"
      },
      {
        "key": "#tz",
        "name": "Time zone",
        "desc": "Time zone (set automatic when generating image)",
        "type": "ro"
      }
    ]
  },
  {
    "id": 16,
    "name": "Buienradar",
    "desc": "Dutch rain predictions for the next two hours. Only works for locations in the Netherlands and Belgium.",
    "param": [
      {
        "key": "location",
        "name": "Location",
        "desc": "Name of the city. This is used to lookup the lat/long data, and to display as the title",
        "type": "geoselect"
      },
      {
        "key": "#lat",
        "name": "Lat",
        "desc": "Latitude (set automatic when generating image)",
        "type": "ro"
      },
      {
        "key": "#lon",
        "name": "Lon",
        "desc": "Longitude (set automatic when generating image)",
        "type": "ro"
      }
    ]
  },
  {
    "id": 9,
    "name": "RSS feed",
    "desc": "Gets an RSS feed, and display the first few lines of it",
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "title",
        "name": "Title",
        "desc": "Displayed title",
        "type": "text"
      },
      {
        "key": "url",
        "name": "URL",
        "desc": "Full URL of the RSS feed",
        "type": "text"
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "How often (in minutes) the feed is being refreshed. Negative value to align the interval (-60 is 'on the whole hour')",
        "type": "int"
      }
    ]
  },
  {
    "id": 7,
    "name": "Image URL",
    "desc": "Gets an external image and displays it",
    "param": [
      {
        "key": "url",
        "name": "URL",
        "desc": "Full URL of the image. Image should be in jpeg format (non-progressive), and with exactly the right resolution for the screen (eg 128x296 or 152x152). Will be auto-rotated. Colors will be dithered",
        "type": "text"
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "How often (in minutes) the image is being fetched. Minimum is 3 minutes. Negative value to align the interval (-60 is 'on the whole hour')",
        "type": "int"
      }
    ]
  },
  {
    "id": 10,
    "name": "QR code",
    "desc": "Displayes a full screen QR code",
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "title",
        "name": "Title",
        "desc": "Displayed title",
        "type": "text"
      },
      {
        "key": "qr-content",
        "name": "QR content",
        "desc": "Any content that can be coded into a QR code",
        "type": "text"
      }
    ]
  },
  {
    "id": 11,
    "name": "Google calendar",
    "desc": "Displays the current and upcoming appointments (next 24 hours) from a Google calendar. To let this work, you need a small Google Apps Script to interface with your calendar. See documentation on github how to do that",
    "param": [
      {
        "key": "title",
        "name": "Title",
        "desc": "Displayed title",
        "type": "text"
      },
      {
        "key": "apps_script_url",
        "name": "Apps Script URL",
        "desc": "URL given by Google Apps Script",
        "type": "text"
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "How often (in minutes) the calendar is being refreshed. Negative value to align the interval (-60 is 'on the whole hour')",
        "type": "int"
      }
    ]
  },
  {
    "id": 26,
    "name": "Time Stamp",
    "desc": "Displays the last date and time when a button press took place. For example, to keep track of the last time somebody let the dog out, or when you last watered the plants, or change the bed sheets.",
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "title",
        "name": "Title",
        "desc": "Displayed title",
        "type": "text"
      },
      {
        "key": "button1",
        "name": "Name for Button 1",
        "desc": "Text displayed for button 1 (for example, a name or activity)",
        "type": "text"
      },
      {
        "key": "button2",
        "name": "Name for Button 2",
        "desc": "Text displayed for button 2 (for example, a name or activity)",
        "type": "text"
      },
      {
        "key": "mode",
        "name": "Working mode",
        "desc": "With 'keep one time', both buttons reset the same timestamp, recording which button is pressed last. The option for seperate date/time, records two different timestamps, one for each button.",
        "type": "select",
        "options": {
          "0": "keep one timestamp",
          "1": "seperate timestamp per button"
        }
      },
      {
        "key": "nextaction",
        "name": "Frequency (days)",
        "desc": "When is the next action expected to take place (in days after a timestamp). Leave 0 to disable.",
        "type": "text"
      },
      {
        "key": "last1",
        "name": "Timestamp 1",
        "desc": "The date/time the last event took place",
        "type": "ro"
      },
      {
        "key": "last2",
        "name": "Name, or timestamp 2",
        "desc": "The name of the button that was pressed, or in case of seperate timestamp, the date/time of the second button press",
        "type": "ro"
      }
    ]
  },
  {
    "id": 27,
    "name": "Dayahead prices",
    "desc": "Dayahead dynamic electricity tariffs. Source: transparency.entsoe.eu",
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "country",
        "name": "Country",
        "desc": "Select your country. If your country is not in the list, we couldn't find the right region for it on transparency.entsoe.eu . Add an issue on the OEPL github to add it",
        "type": "select",
        "options": {
          "AT": "Austria",
          "BE": "Belgium",
          "CZ": "Czech Republic",
          "DK1": "Denmark DK1",
          "DK2": "Denmark DK2",
          "EE": "Estonia",
          "FI": "Finland",
          "FR": "France",
          "DE": "Germany",
          "LV": "Latvia",
          "LT": "Lithuania",
          "LU": "Luxembourg",
          "NL": "Netherlands",
          "NO1": "Norway NO1",
          "NO2": "Norway NO2",
          "NO3": "Norway NO3",
          "NO4": "Norway NO4",
          "NO5": "Norway NO5",
          "PL": "Poland",
          "RO": "Romania",
          "SK": "Slovakia",
          "SI": "Slovenia",
          "ES": "Spain",
          "SE1": "Sweden SE1",
          "SE2": "Sweden SE2",
          "SE3": "Sweden SE3",
          "SE4": "Sweden SE4",
          "CH": "Switzerland"
        }
      },
      {
        "key": "tariffkwh",
        "name": "Fixed surcharge",
        "desc": "Fixed surcharge per kWh, in 1/100 units (cents/öre/øre). Enter one value, or an array of exactly 24 elements for each hour in the form of '[n,n,...,n]'",
        "type": "text"
      },
      {
        "key": "tarifftax",
        "name": "Tax percentage",
        "desc": "Percentage to add to the total (for example, 21, for 21% VAT)",
        "type": "text"
      },
      {
        "key": "units",
        "name": "Price units",
        "desc": "Display whole units (EUR/NOK/DKK) or cents",
        "type": "select",
        "options": {
          "100": "1/1 units (EUR/NOK/DKK)",
          "1": "1/100 units (cents/öre/øre)"
        }
      },
      {
        "key": "showcurr",
        "name": "Show current",
        "desc": "Hourly refresh to show current price (less battery friendly)",
        "type": "select",
        "options": {
          "0": "No",
          "1": "-Yes"
        }
      }
    ]
  },
  {
    "id": 19,
    "name": "Json template",
    "desc": "Gets an external json template and displays it",
    "param": [
      {
        "key": "url",
        "name": "URL",
        "desc": "Full URL of the json template. See OpenEpaperLink wiki for the right json format. Specify a url OR a filename",
        "type": "text"
      },
      {
        "key": "filename",
        "name": "Filename",
        "desc": "Filename of the json template. See OpenEpaperLink wiki for the right json format. Specify a url OR a filename",
        "type": "jsonfile"
      },
      {
        "key": "interval",
        "name": "Interval",
        "desc": "In case of an url, how often (in minutes) the template is being fetched. Minimum is 3 minutes. Negative value to align the interval (-60 is 'on the whole hour')",
        "type": "int"
      }
    ]
  },
  {
    "id": 20,
    "name": "Display a copy",
    "desc": "Mirror the contents of a source tag to this destination tag, regardless of the content. The two tags should be of the same type. Ideally, the destination tag is local to the AP.",
    "param": [
      {
        "key": "mac",
        "name": "Mac-address",
        "desc": "Mac-address of the tag you want to use as content source. The source tag should either be associated with this access point, or this access point should be the content source.",
        "type": "text"
      }
    ]
  },
  {
    "id": 21,
    "name": "Access point info",
    "desc": "Displays information about the currently connected access point"
  },
  {
    "id": 23,
    "name": "Image preload",
    "desc": "Preloads an image to be shown at different situations. Make sure to resize the image to the correct resolution.",
    "param": [
      {
        "key": "filename",
        "name": "Filename",
        "desc": "Local filename on the littlefs drive",
        "type": "jpgfile"
      },
      {
        "key": "timetolive",
        "name": "TimeToLive",
        "desc": "Amount (minutes) that this image will stay valid. The tag might not respond meanwhile",
        "type": "int"
      },
      {
        "key": "dither",
        "name": "Dithering",
        "desc": "Turn halftone dithering on or off. Turn it on when displaying photos. For texts, you better leave if off",
        "type": "select",
        "options": {
          "0": "off",
          "1": "floyd-steinberg dithering",
          "2": "ordered dithering"
        }
      },
      {
        "key": "preload",
        "name": "Display or Preload",
        "desc": "Display now or preload for later use",
        "type": "select",
        "options": {
          "0": "Display",
          "1": "Preload"
        }
      },
      {
        "key": "preload_lut",
        "name": "Preload LUT",
        "desc": "Triggered preload images will display with this LUT",
        "type": "select",
        "options": {
          "0": "Default",
          "1": "No Repeats",
          "2": "Fast No Reds",
          "3": "Fast"
        }
      },
      {
        "key": "preload_type",
        "name": "Preload Image type",
        "desc": "Preload type to send to tag, for later recall, or special use",
        "type": "select",
        "options": {
          "0": "Normal",
          "1": "UI: Splash Screen",
          "2": "UI: Lost connection",
          "3": "UI: AP Found",
          "4": "UI: No AP Found",
          "5": "UI: Long Term Sleep",
          "15": "Slideshow image",
          "16": "Wake: Button 1",
          "17": "Wake: Button 2",
          "29": "Wake: GPIO",
          "30": "Wake: NFC"
        }
      }
    ]
  },
  {
    "id": 12,
    "name": "Remote content",
    "desc": "Content is generated by a different Access Point"
  },
  {
    "id": 13,
    "name": "Set segments",
    "desc": "Used for debugging. Work in progress",
    "param": [
      {
        "key": "line1",
        "name": "line 1",
        "desc": "8888",
        "type": "text"
      },
      {
        "key": "line2",
        "name": "line 2",
        "desc": "88",
        "type": "text"
      },
      {
        "key": "line3",
        "name": "line 3",
        "desc": "8888",
        "type": "text"
      }
    ]
  },
  {
    "id": 14,
    "name": "Set NFC URL",
    "desc": "Send the URL to the NFC chip. The URL is transmitted to a NFC reader (like your phone) if you hold it next to the tag",
    "capabilities": 64,
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "url",
        "name": "URL",
        "desc": "Full URL",
        "type": "text"
      }
    ]
  },
  {
    "id": 15,
    "name": "Send custom LUT",
    "desc": "EXPERIMENTAL. Don't use. YOU RISK DAMAGING YOUR SCREEN.",
    "capabilities": 4,
    "properties": [ "savespace" ],
    "param": [
      {
        "key": "bytes",
        "name": "bytes",
        "desc": "76 bytes, formatted as 0x00,0x00,...",
        "type": "text"
      }
    ]
  },
  {
    "id": 17,
    "name": "Send Command",
    "desc": "Send a command to a tag to execute; only to be used for tests during development",
    "param": [
      {
        "key": "cmd",
        "name": "CMD id",
        "desc": "Action",
        "type": "int"
      }
    ]
  },
  {
    "id": 18,
    "name": "Set Tag Config",
    "desc": "Sets tag options. The options you see below are the default options. This may or may not match current tag settings",
    "param": [
      {
        "key": "fastboot",
        "name": "Boot method",
        "desc": "How the tag should boot, fast or normal",
        "type": "select",
        "options": {
          "0": "-Normal boot",
          "1": "Fast boot"
        }
      },
      {
        "key": "rfwake",
        "name": "RF Wake",
        "desc": "If the tag should support RF wake or not. This adds a 0.9µA current draw",
        "type": "select",
        "options": {
          "0": "-Disabled",
          "1": "Enabled"
        }
      },
      {
        "key": "tagroaming",
        "name": "Tag Roaming",
        "desc": "If enabled, the tag will periodically scan for AP's and will switch to a different channel if a stronger signal is found",
        "type": "select",
        "options": {
          "0": "-Disabled",
          "1": "Enabled"
        }
      },
      {
        "key": "tagscanontimeout",
        "name": "Scan for AP on timeout",
        "desc": "If a tag hasn't found an AP for an hour, should it rescan the channels for another AP?",
        "type": "select",
        "options": {
          "1": "-Enabled",
          "0": "Disabled"
        }
      },
      {
        "key": "showlowbat",
        "name": "Low Battery symbol",
        "desc": "Should the tag display the 'low battery' symbol if the battery a voltage threshold has been reached?",
        "type": "select",
        "options": {
          "1": "-Enabled",
          "0": "Disabled"
        }
      },
      {
        "key": "shownorf",
        "name": "No AP symbol",
        "desc": "Should the tag display the 'No-signal/AP' symbol if it hasn't been able to contact an AP?",
        "type": "select",
        "options": {
          "1": "-Enabled",
          "0": "Disabled"
        }
      },
      {
        "key": "lowvoltage",
        "name": "Low voltage threshold",
        "desc": "Below what voltage should the tag display the 'low bat' symbol?",
        "type": "select",
        "options": {
          "2600": "-2.6v",
          "2500": "2.5v",
          "2400": "2.4v",
          "2300": "2.3v",
          "2200": "2.2v"
        }
      },
      {
        "key": "fixedchannel",
        "name": "Fixed Channel",
        "desc": "What channel should the tag initially join?",
        "type": "chanselect",
        "chans": {
          "0": "-Auto",
          "11": "11",
          "15": "15",
          "20": "20",
          "25": "25",
          "26": "26",
          "27": "27"
        },
        "subchans": {
          "0": "-Auto",
          "100": "100",
          "101": "101",
          "102": "102",
          "103": "103",
          "104": "104",
          "105": "105",
          "200": "200",
          "201": "201",
          "202": "202",
          "203": "203",
          "204": "204",
          "205": "205"
        }
      }
    ]
  },
  {
    "id": 5,
    "name": "Firmware update",
    "desc": "To update tag firmware. This is for developers only! Instead, please use the 'auto update' button (click the little triangle below) to auto download and flash the latest firmware. If you proceed in here anyway: make sure you send the right .bin file. You can brick your tag if you send a wrong file (in that case, you can only revive it using a tag flasher). There is NO protection against a wrongly uploaded file.",
    "param": [
      {
        "key": "filename",
        "name": "Filename",
        "desc": "Local file on littlefs partition",
        "type": "binfile"
      }
    ]
  }
]
