{"id":19002327,"url":"https://github.com/rainu/launchpad-super-trigger","last_synced_at":"2026-05-15T08:02:33.560Z","repository":{"id":57616697,"uuid":"279614272","full_name":"rainu/launchpad-super-trigger","owner":"rainu","description":"Trigger application for the Novation Launchpad S","archived":false,"fork":false,"pushed_at":"2020-10-25T21:04:55.000Z","size":289,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-01T18:42:41.540Z","etag":null,"topics":["go","golang","launchpad","mqtt","trigger"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rainu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-14T14:52:14.000Z","updated_at":"2021-02-24T15:42:36.000Z","dependencies_parsed_at":"2022-08-27T09:40:15.057Z","dependency_job_id":null,"html_url":"https://github.com/rainu/launchpad-super-trigger","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainu%2Flaunchpad-super-trigger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainu%2Flaunchpad-super-trigger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainu%2Flaunchpad-super-trigger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainu%2Flaunchpad-super-trigger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rainu","download_url":"https://codeload.github.com/rainu/launchpad-super-trigger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240026574,"owners_count":19736202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","launchpad","mqtt","trigger"],"created_at":"2024-11-08T18:14:39.574Z","updated_at":"2026-04-20T10:30:19.609Z","avatar_url":"https://github.com/rainu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# launchpad-super-trigger\nTrigger application for the Novation \"Launchpad S\" and \"Launchpad MK2\"\n\n# Get the Binary\n\nBefore you can build the binary, you have to install the **rtmidi** library on your machine:\n```bash\napt-get install librtmidi-dev\n```\n\nNow you can build it on your own (you will need [golang](https://golang.org/) installed):\n```bash\ngo build -a -installsuffix cgo ./cmd/lst/\n```\n\nThen start the application:\n```bash\n./launchpad-super-trigger -config config.yaml\n```\n\n# ConfigFile\n\n```yaml\nconnections:\n mqtt:\n  test-broker:\n   broker: tcp://broker-host:1883\n   clientId: launchpad\nactors:\n rest:\n  rest-test:\n   url: \"http://localhost:1312\"\n mqtt:\n  mqtt-test:\n   connection: test-broker\n   topic: my/topic\n   body: Hello!\nlayout:\n pages:\n  0:\n   trigger:\n    0,1:\n     actor: rest-test\n     color:\n      ready: 0,0\n      progress: 1,1\n      success: 2,2\n      failed: 3,3\n    1,0:\n     actor: mqtt-test\n```\n\n## Config documentation\n\n| config key | default | mandatory | description |\n|---|---|---|---|\n| general | - | false | Contains all general settings. |\n| general.startPage | 0 | false | The page which should active when the application starts. |\n| general.startBrightness | 100 | false | The brightness which should be used at start the application. It is only effective when the Launchpad MK2 with RGB-Colors is used. |\n| general.navigationMode | 0 | false | The page navigation mode: 0 =\u003e binary mode; 1 =\u003e toggle mode |\n| general.sensorStore | - | false | If the sensor data should be persisted, here you can set the file path to the [bolt-db](https://github.com/boltdb/bolt). Otherwise the sensor date will only keep in memory. |\n| general.compressSensorData | false | false | Should the received sensor data be (gzip) compressed? This will work with all store types (memory or bolt). |\n| actors | - | false | Contains all available actors. |\n| actors.command | - | false | Contains all available command actors. A command actor will runs a command on the local machine. |\n| actors.command[*name*].name | - | **true** | The name/path of the command to execute. |\n| actors.command[*name*].args | - | false | A list of arguments which will be send to the command. |\n| actors.command[*name*].appendContext | false | false | Should the trigger context append in the command args? |\n| actors.rest | - | false | Contains all available rest actors. An rest actor will call an rest service. |\n| actors.rest[*name*].method | GET | false | The http method which should be used. |\n| actors.rest[*name*].url | - | **true** | The target url. |\n| actors.rest[*name*].header[*name*][]*value* | - | false | The http headers which should be used. |\n| actors.rest[*name*].body | - | false | The body content for the http request. |\n| actors.rest[*name*].bodyBase64 | - | false | The body content for the http request encoded in base64. |\n| actors.rest[*name*].bodyPath | - | false | The body file for the http request. |\n| actors.rest[*name*].bodyTemplate | - | false | The *body template* for the http request. |\n| actors.mqtt | - | false | Contains all available mqtt actors. An mqtt actor will send a message to a given topic. |\n| actors.mqtt[*name*].connection | - | false | The name of to mqtt connection which should be used for this mqtt actor. |\n| actors.mqtt[*name*].topic | - | **true** | The topic name. |\n| actors.mqtt[*name*].qos | 0 | false | The QualityOfService for the published message. |\n| actors.mqtt[*name*].retained | false | false | Should the message be retained? |\n| actors.mqtt[*name*].body | - | false | The body content for the mqtt message. |\n| actors.mqtt[*name*].bodyBase64 | - | false | The body content for the mqtt message encoded in base64. |\n| actors.mqtt[*name*].bodyPath | - | false | The body file for the mqtt message. |\n| actors.mqtt[*name*].bodyTemplate | - | false | The *body template* for the mqtt message. |\n| actors.combined | - | false | Contains all available combined actors. An combined actor will call other actors (sequential or in parallel). |\n| actors.combined[*name*].actors | - | **true** | The list of underlying actor names. Must be greater or equal than 2! |\n| actors.combined[*name*].parallel | false | false | How should the underlying actors be called. If true they will be called parallel. Otherwise the will be called sequential. |\n| actors.conditional | - | false | Contains all available conditional actors. An conditional actor will call other actors depends on the given conditions. |\n| actors.conditional[*name*].conditions | - | **true** | Contains the conditions. |\n| actors.conditional[*name*].conditions[].actor | - | **true** | The actor which should be called if the condition is met. |\n| actors.conditional[*name*].conditions[].datapoint | - | **true** | The reference for the underlying data point. |\n| actors.conditional[*name*].conditions[].expression | - | **true** | The reference for the underlying data point. |\n| actors.conditional[*name*].conditions[].expression.eq | - | false | This expression matches if the data point is *equal* than the given value. |\n| actors.conditional[*name*].conditions[].expression.ne | - | false | This expression matches if the data point is *not equal* than the given value. |\n| actors.conditional[*name*].conditions[].expression.lt | - | false | This expression matches if the data point is *less than* the given value. |\n| actors.conditional[*name*].conditions[].expression.lte | - | false | This expression matches if the data point is *less or equal* than the given value. |\n| actors.conditional[*name*].conditions[].expression.gt | - | false | This expression matches if the data point is *greater than* the given value. |\n| actors.conditional[*name*].conditions[].expression.gte | - | false | This expression matches if the data point is *greater or equal than* the given value. |\n| actors.conditional[*name*].conditions[].expression.match | - | false | This expression matches if the data point *matches* the given regular expression the given value. |\n| actors.conditional[*name*].conditions[].expression.nmatch | - | false | This expression matches if the data point *not matches* the given regular expression the given value. |\n| actors.conditional[*name*].conditions[].expression.contains | - | false | This expression matches if the data point *contains* the given value. |\n| actors.conditional[*name*].conditions[].expression.ncontains | - | false | This expression matches if the data point *contains not* the given value. |\n| actors.gfxBlink | - | false | Contains all available gfx blink actors. A blink actor will draw blinking pads. |\n| actors.gfxBlink[*name*].on | - | true | The on *color*. |\n| actors.gfxBlink[*name*].off | 0,0 | false | The off *color*. |\n| actors.gfxBlink[*name*].interval | 1s | false | The interval of blink animation. |\n| actors.gfxBlink[*name*].duration | until page leave | false | The duration of the blink interval. |\n| actors.gfxWave | - | false | Contains all available gfx wave actors. A wave actor will draw waves on the pads. |\n| actors.gfxWave[*name*].square | false | false | Should the waveform be square? |\n| actors.gfxWave[*name*].color | 0,3 | false | The color of the wave. |\n| actors.gfxWave[*name*].delay | 500ms | false | The delay between wave steps. |\n| actors.metaSwitchPage | - | false | Contains all available page switch actors. A page switch actor can switch to a given page. |\n| actors.metaSwitchPage[*name*].target | - | true | The page you want to switch to.  |\n| actors.metaSwitchNavigationMode | - | false | Contains all available navigation mode switch actors. A navigation mode switch actor can switch to a given navigation mode. |\n| actors.metaSwitchNavigationMode[*name*].mode | - | true | The page navigation mode: 0 =\u003e binary mode; 1 =\u003e toggle mode |\n| actors.metaSwitchLock | - | false | Contains all available lock switch actors. A lock switch actor can switch to a given lock state (arm and unarmed). |\n| actors.metaSwitchLock[*name*].lock | - | true | Should the launchpad be armed (true) or unarmed (false)? |\n| connections | - | false | Contains all available connections, which can be used by different actors. |\n| connections.mqtt | - | false | Contains all available MQTT connections. |\n| connections.mqtt[*name*].broker | - | **true** | The url of the MQTT-Broker. |\n| connections.mqtt[*name*].clientId | - | false | The client id which is send to the mqtt broker. |\n| connections.mqtt[*name*].username | - | false | The username. |\n| connections.mqtt[*name*].password | - | false | The password. |\n| sensors | - | false | Contains all available sensors. A sensor will listen for (incoming) data. |\n| sensors.command | - | false | Contains all available command actors. A command actor will runs a command on the local machine. |\n| sensors.command[*name*].name | - | **true** | The name/path of the command to execute. |\n| sensors.command[*name*].args | - | false | A list of arguments which will be send to the command. |\n| sensors.command[*name*].interval | - | **true** | The interval. |\n| sensors.command[*name*].data | - | false | Contains all data points. A data point is a part of the received message. |\n| sensors.command[*name*].data.complete | - | false | The name of the data point for the complete message. |\n| sensors.command[*name*].data.gjson | - | false | Contains all [gjson](https://github.com/tidwall/gjson) data points. |\n| sensors.command[*name*].data.gjson[*name*] | - | false | The gjson path to use to extract data point. |\n| sensors.command[*name*].data.split | - | false | Contains all split data points. |\n| sensors.command[*name*].data.split[*name*].separator | - | true | The separator which should be used to split the whole data. |\n| sensors.command[*name*].data.split[*name*].index | - | true | The index of the split element which should be used as data point. Must be greater or equal 0! |\n| sensors.command[*name*].data.gojq | - | false | Contains all [gojq](https://github.com/itchyny/gojq) data points. |\n| sensors.command[*name*].data.gojq[*name*] | - | true | The gojq query which should be used to extract the data point. |\n| sensors.mqtt | - | false | Contains all available mqtt sensors. A mqtt sensor will listen for mqtt topics. |\n| sensors.mqtt[*name*].connection | - | **true** | The name of to mqtt connection which should be used for this mqtt sensor. |\n| sensors.mqtt[*name*].topic | - | **true** | The topic name. |\n| sensors.mqtt[*name*].qos | 0 | false | The QualityOfService for the subscription message. |\n| sensors.mqtt[*name*].data | - | false | Contains all data points. A data point is a part of the received message. |\n| sensors.mqtt[*name*].data.complete | - | false | The name of the data point for the complete message. |\n| sensors.mqtt[*name*].data.gjson | - | false | Contains all [gjson](https://github.com/tidwall/gjson) data points. |\n| sensors.mqtt[*name*].data.gjson[*name*] | - | false | The gjson path to use to extract data point. |\n| sensors.mqtt[*name*].data.split | - | false | Contains all split data points. |\n| sensors.mqtt[*name*].data.split[*name*].separator | - | true | The separator which should be used to split the whole data. |\n| sensors.mqtt[*name*].data.split[*name*].index | - | true | The index of the split element which should be used as data point. Must be greater or equal 0! |\n| sensors.mqtt[*name*].data.gojq | - | false | Contains all [gojq](https://github.com/itchyny/gojq) data points. |\n| sensors.mqtt[*name*].data.gojq[*name*] | - | true | The gojq query which should be used to extract the data point. |\n| sensors.rest | - | false | Contains all available rest sensors. An rest sensor will call an rest service in an given interval. |\n| sensors.rest[*name*].method | GET | false | The http method which should be used. |\n| sensors.rest[*name*].url | - | **true** | The target url. |\n| sensors.rest[*name*].header[*name*][]*value* | - | false | The http headers which should be used. |\n| sensors.rest[*name*].body | - | false | The body content for the http request. |\n| sensors.rest[*name*].bodyBase64 | - | false | The body content for the http request encoded in base64. |\n| sensors.rest[*name*].bodyPath | - | false | The body file for the http request. |\n| sensors.rest[*name*].interval | - | **true** | The interval. |\n| sensors.rest[*name*].data | - | false | Contains all data points. A data point is a part of the received message. |\n| sensors.rest[*name*].data.complete | - | false | The name of the data point for the complete message. |\n| sensors.rest[*name*].data.gjson | - | false | Contains all [gjson](https://github.com/tidwall/gjson) data points. |\n| sensors.rest[*name*].data.gjson[*name*] | - | false | The gjson path to use to extract data point. |\n| sensors.rest[*name*].data.split | - | false | Contains all split data points. |\n| sensors.rest[*name*].data.split[*name*].separator | - | true | The separator which should be used to split the whole data. |\n| sensors.rest[*name*].data.split[*name*].index | - | true | The index of the split element which should be used as data point. Must be greater or equal 0! |\n| sensors.rest[*name*].data.gojq | - | false | Contains all [gojq](https://github.com/itchyny/gojq) data points. |\n| sensors.rest[*name*].data.gojq[*name*] | - | true | The gojq query which should be used to extract the data point. |\n| layout | - | false | Contains all layout settings. |\n| layout.pages | - | false | Contains all page settings. |\n| layout.pages[*pageNumber*] | - | false | Contains a page setting. |\n| layout.pages[*pageNumber*].trigger | - | false | Contains settings about the trigger on this page. |\n| layout.pages[*pageNumber*].trigger[*coordinates*] | - | false | Contains settings about the trigger which should be called if the given button at *coordinate* is hit. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].actor | - | **true** | The name of the actor (see actor config) which should be called if the trigger is hit. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color | - | false | Contains the *color* settings about the trigger. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color.disabled | false | false | Should color be used? |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color.ready | - | false | The color which should be used if the trigger is ready. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color.progress | - | false | The color which should be used as long as the actor is in progress. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color.success | - | false | The color which should be used if the actor work was done successfully. |\n| layout.pages[*pageNumber*].trigger[*coordinates*].color.failed | - | false | The color which should be used if the actor work was done wrong. |\n| layout.pages[*pageNumber*].plotter | - | false | Contains settings about the plotters on this page. |\n| layout.pages[*pageNumber*].plotter.progressbar | - | false | Contains all progressbar plotter for this page. |\n| layout.pages[*pageNumber*].plotter.progressbar[].datapoint | - | **true** | The reference for the underlying data point. |\n| layout.pages[*pageNumber*].plotter.progressbar[].min | 0 | false | The minimum value of the progressbar. |\n| layout.pages[*pageNumber*].plotter.progressbar[].max | 100 | false | The maximum value of the progressbar. |\n| layout.pages[*pageNumber*].plotter.progressbar[].vertical | false | false | Is the progressbar a vertical one? |\n| layout.pages[*pageNumber*].plotter.progressbar[].quadrant | *whole pad* | false | In which mathematical quadrant should the progressbar be plotted. |\n| layout.pages[*pageNumber*].plotter.progressbar[].x | - | false | If the progressbar *is vertical*, where should the progressbar be plotted. |\n| layout.pages[*pageNumber*].plotter.progressbar[].y | - | false | If the progressbar *is horizontal*, where should the progressbar be plotted. |\n| layout.pages[*pageNumber*].plotter.progressbar[].rtl | false | false | Should the progressbar be filled from right to left? |\n| layout.pages[*pageNumber*].plotter.progressbar[].fill | 0,0 | false | The filled **color** which should be used. |\n| layout.pages[*pageNumber*].plotter.progressbar[].empty | 0,3 | false | The empty **color** which should be used. |\n| layout.pages[*pageNumber*].plotter.static | - | false | Contains all static plotter for this page. A static plotter will color on button if an expression on the data point matches. |\n| layout.pages[*pageNumber*].plotter.static[].datapoint | - | **true** | The reference for the underlying data point. |\n| layout.pages[*pageNumber*].plotter.static[].pos | - | **true** | The *coordinate* where should plot. |\n| layout.pages[*pageNumber*].plotter.static[].defaultColor | - | false | The color which should be used if no expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.eq | - | false | This expression matches if the data point is *equal* than the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.eq[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.eq[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ne | - | false | This expression matches if the data point is *not equal* than the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ne[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ne[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lt | - | false | This expression matches if the data point is *less than* the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lt[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lt[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lte | - | false | This expression matches if the data point is *less or equal* than the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lte[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.lte[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gt | - | false | This expression matches if the data point is *greater than* the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gt[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gt[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gte | - | false | This expression matches if the data point is *greater or equal than* the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gte[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.gte[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.match | - | false | This expression matches if the data point *matches* the given regular expression the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.match[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.match[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.nmatch | - | false | This expression matches if the data point *not matches* the given regular expression the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.nmatch[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.nmatch[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.contains | - | false | This expression matches if the data point *contains* the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.contains[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.contains[].color | - | false | The *color* which should be used if the expression matches. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ncontains | - | false | This expression matches if the data point *contains not* the given value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ncontains[].value | - | false | This expression value. |\n| layout.pages[*pageNumber*].plotter.static[].expressions.ncontains[].color | - | false | The *color* which should be used if the expression matches. |\n\n* *pageNumber*\n    * The page number must be a number from **0** until **255**.\n    * or it can be a string representing the top page line, where each active button is a \"1\" nad the others \"0\"\n        * for example: 10000001    (the first an last page button must be active for this page)\n* *coordinate*\n    * \"X,Y\" -\u003e X and Y must have a value of 0-7.\n* *coordinates* (plural)\n    * represents a list of coordiantes\n        * \"X,Y\" -\u003e single coordinate\n        * \"0-7,Y\" -\u003e all X from 0 until 7 and given Y\n        * \"X,0-7\" -\u003e all Y from 0 until 7 and given X\n        * \"0-7,0-7\" -\u003e all X from 0 until 7 and all Y from 0 until 7\n* *color*\n    * \"r,g\" (Launchpad S) -\u003e **r** is the red value of the color and must be between 0 and 3. **g** is the green value of the color and must be between 0 and 3.\n    * \"r,g,b\" (Launchpad MK2) -\u003e **r** is the red value of the color and must be between 0 and 63. **g** is the green value of the color and must be between 0 and 63. **b** is the blue value of the color and must be between 0 and 63.\n* *datapoint reference*\n    * **sensorName**.**datapointName**\n* *body template*\n    * You can define a [go template](https://golang.org/pkg/text/template/) as body content. In this template there are helper functions available:\n        * **.DataPoint \"\u003csensor.datapoint\u003e\"**\n        * **.DataPointOr \"\u003csensor.datapoint\u003e\" \"\u003cdefaultValue\u003e\"**\n    * Example - print the data point **available** from sensor **notebook**:\n        ```\n        {{.DataPoint \"notebook.available\"}}  \n        ```\n    * Example - print the data point **available** from sensor **notebook** or \"offline\" if no data is available:\n        ```\n        {{.DataPointOr \"notebook.available\" \"offline\"}}  \n        ```\n    * The most public functions from go default lib are available: \n        * [strings](https://golang.org/pkg/strings/)\n            * prefix: **strings_**\n            * example: [ **strings_Count** ](https://golang.org/pkg/strings/#Count)\n        * [math](https://golang.org/pkg/math/)\n            * prefix: **math_**\n            * example: [ **math_Abs** ](https://golang.org/pkg/math/#Abs)\n        * [strconv](https://golang.org/pkg/strconv/)\n            * prefix: **strconv_**\n            * example: [ **strconv_ParseBool** ](https://golang.org/pkg/strconv/#ParseBool)\n        * [rand](https://golang.org/pkg/rand/)\n            * prefix: **rand_**\n            * example: [ **rand_Int63** ](https://golang.org/pkg/rand/#Int63)\n        * [time](https://golang.org/pkg/time/)\n            * prefix: **time_**\n            * example: [ **time_Now** ](https://golang.org/pkg/time/#Now)\n        * [fmt_Sprintf](https://golang.org/pkg/fmt/#Sprintf)\n    * Furthermore there exists functions for basic arithmetic:\n        * **add** - addition\n        * **sub** - subtraction\n        * **mul** - multiplication\n        * **div** - diversion\n    * Complex example - **add 13* to data point **ram** from sensor **notebook**:\n        ```\n        {{ $sr := .DataPointOr \"notebook.ram\" \"0\" }}\n        {{ $r := strconv_Atoi $sr }}\n        {{ add $r 13 }}\n        ```\n \n### Special sensors\n\nFor each connection there is a \"hidden\" sensor which holds the connection status. This sensor can be used such like other\nsensors. You can reference them and use there datapoint(s). The name of the sensor is **__connection[\u0026lt;connectionName\u0026gt;]**.\nThe name of the datapoint which holds the connection information is **status**. And it can have two states:\n* **Connected** -\u003e the corresponding connection is established\n* **Disconnected** -\u003e the corresponding connection is lost\n \nExample:\n\n```yaml\nconnections:\n mqtt:\n  test-broker:\n   broker: tcp://broker-host:1883\n   clientId: launchpad\nlayout:\n pages:\n  0:\n    plotter:\n      static:\n        - datapoint: __connection[test-broker].status\n          pos: 0,0\n            expressions:\n              eq:\n                - value: Connected\n                  color: 0,3\n                - value: Disconnected\n                  color: 3,0\n```\n\nYou will see a green light on the left top corner if the mqtt-connection \"test-broker\" is established, otherwise there is a red light!\n\n# Special keys\n\nIn the following you can read a description what do the special keys. The special keys are the round keys on the right side. \n\n## vol\n\nWith this key you can change the brightness. This feature is only available if you use a Launchpad MK2 with RGB-Colors.\n\n## pan\n\nWith this key you can switch between the different page navigation modes:\n\n|mode|color|description|\n|---|---|---|\n| Binary mode (default) | off | In this mode only the pressed page key is switched on/off. |\n| Toggle mode | green | In this mode all page keys are switched off except the pressed page key. |\n\n## arm\n\nWith this key you can switch between lock modes. \n\n|mode|color|description|\n|---|---|---|\n| Unlocked (default) | off | In this mode you can touch the pad keys and their underlying action will performed. |\n| Locked | red | In this mode you can only touch the special or page keys. If you touch the pad keys, no action will performed. |","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frainu%2Flaunchpad-super-trigger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frainu%2Flaunchpad-super-trigger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frainu%2Flaunchpad-super-trigger/lists"}