This section describes the necessary parameters and data types for REST connector calls.
Simplifier Academy
Courses & Documentation
PDF generated July 30, 2019
this.callBusinessObject(businessObjectName, method, payload, callback, showBusyIndicator, failOnError, failCallback, parametrized)
businessObjectName | the name of the business object |
method | name of the script template to be called |
payload | JSON object with parameters as required by the called script |
callback | function, which is called after the successful execution of the connector |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar (true) or not (false) |
failOnError | boolean value that indicates whether the connector should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector, if false “failOnError” is passed |
parametrized | boolean value that indicates whether the called parameters in the payload according to the rules in the script template are to be verified (true) or not (false) |
_______________________________________________
Navigation | UI Action | Mobile Action | Server Action
The Navigation element is used to trigger a navigation from one screen to another. By dragging it to the main screen, a list of screens to navigate to will appear in the right pane.
You can set that the navigation should navigate back, or choose between several transitions: Slide, Fade, Flip or None.
Example In most cases, a navigation will be used when clicking on a button, so by combining a clickable event (e.g. button press) with a navigation element this can easily be achieved. |
With the UI Action element, you can map different widgets, variables and auto fields to another.
Let’s say there is a very simple login screen with an input field for the name and a button to submit.
The button should not be responsive, as long as the login field is empty. This can be achieved with the UI Action in the Process Designer.
Step 1 At first, assign the input field “InputUsername” to the Event. |
|
Step 2 Next, a condition is needed. Check, if the value of the input field equals an empty string. |
|
Step 3 If the condition is true and there is nothing written in the input field, the button should not be responsive. Add a UI Action and set within the mapping dialog the constant (boolean, false) on the left side (source) and map it to the equivalent widget on the right side (target). Select the screen, widget and property (in this case “enabled”). |
|
For the other scenario, when there actually is an input written, you can connect the condition to a second UI Action and set the boolean via the constant on true. |
In this example, we have an application that writes the value of the first widget to the second input field and writes the value of the auto field (username) to the third widget after clicking on the corresponding buttons. | |
Now in the Process Designer, use 2 Events and 2 UI Actions for this. We’ve already added the press event on the first button and now we have to add the UI Action. By clicking on the mapping dialog, you can open the mapping. Connect the value of the widget Input1 with the widget Input2. Select the property that we’d like to connect by double-clicking on the widget. |
|
To connect the auto field with the third input field, add the auto field and select the one you need, also by double-clicking on it. | |
This is the result of the mapping: |
The Mobile Action element enables you to use mobile features within the application. Drag and drop the activity ‘Mobile Action’ underneath ‘Action’ into the drawing area. Currently, there are 14 different actions implemented in the Simplifier. Use the input/output mapping to define the source for the input (request) and the destination for its output (response). |
Determine how many pictures should be taken. |
Set the format of the code you want to scan, the orientation of the camera and write a text in the prompt property. |
Define how many milliseconds the mobile device should vibrate. |
Parameter | DataType | Valid Values | |
Meter appearance | String | See the table below | |
Number of counters | Integer | 1, 2 (from dropdown) | |
Integer digits | Integer/String | AUTO, 1-n | |
Fraction digits | Integer/String | AUTO, 1-n |
Key | Value |
mechanical_black | White text on black rollers |
mechanical_white | Black text on white rollers |
lcd | LCD Display |
lcd_edl21 | EDL21 and similar meters with LCD 7 (three-digit OBIS code to the left) |
For the output mapping you can use the following parameter:
Paramter | DataType | Description |
image | string | Image of the scanning process as data url |
line1 | string | Result of scanning the first counter (always set) |
line2 | string | Result of scanning the second counter (only set if 2 counters were scanned) |
line1ObisCode | string | Result of scanning the first counter’s OBIS code (only set if meter appearance was set to lcd_edl21) |
line2ObisCode | string | Result of scanning the second counter’s OBIS code (only set meter appearance was set to lcd_edl21 and 2 counters were scanned) |
This is a native feature for talking with a user via audio- or video live streaming. The user can be statically configured. Furthermore, you can set a fullscreen. |
By providing the mobile action a path to a video, it will play the video in a full-screen mode. |
The mobile action Play Audio just needs an audio file path. |
This mobile action will trigger a native notification. | |
So the Notification will be displayed on your mobile device. |
The mobile action GPS need to be initialized at first. It’s recommended to do this in a screen onInit function. | |
When it’s initialized, you can access the longitude and latitude by the Auto Field type Geolocation. For that, you need to open the mapping dialog of the UI Action. Then you can drag the auto field in the middle and by double clicking on it you can select the longitude/latitude/. Then connect it with the appropriate widget. |
This mobile action will show a native toast, with a constant or by using the input mapping. You can specify the duration how long the toast should be displayed (Short or Long) and the position (Top, Center or Bottom). |
You can set and lock the screen orientation of the mobile device. Possible values are Landscape, Portrait, Landscape (Primary), Landscape (Secondary), Portrait (Primary), Portrait (Secondary) and Unlock. | |
The current screen orientation can be accessed by a new characteristic of the Device Auto Field. |
With this mobile action, your mobile device can toggle light. |
If the background mode is enabled, JavaScript will be executed even if the app is running in the background or the display is locked. |
The Server Action enables you to configure the login or logout for an application, address a template or send an e-mail. |
After mapping the according parameters you can decide which port you’d like to connect.
Port | Description |
success | The process will be executed after a successful login or logout. |
error | The process will be executed after a failed login or logout. |
already logged in | The process will be executed if the user is already logged in. |
The Server Action needs two parameters as input if you want the user of the application to fill in his username and password. You can map the widgets in which the user fills in the information with the equivalent input parameter. (By double clicking on the widget, you can choose the exact property that you need). |
|
The Login screen of your application might look like this: |
You can use a Single Sign-on if you want to allow a user to use a single set of login credentials to access multiple applications. In difference to the first login method, you have to map an additional parameter, the authentication. Therefore you have to add this authentication method to the Simplifier in advance (this will be an admin task – take a look at “Settings for Admins“). The name that was given to the authentication is the one that is needed as an input parameter. |
|
This is what the input mapping should look like: | |
The login screen of your application might look like this: |
Select OAuth as login in the server action and open the mapping dialog. | |
Within the mapping dialog you have the opportunity to choose between two parameters:
|
It is possible to log into a business app via SAML 2.0. Within the mapping dialog, you have the opportunity to choose between two parameters:
The behavior is analogous to the OAuth login. |
For the Server Action Logout you don’t have to configure anything additionally. |
Use the Server Action Template to address templates. | |
With the help of parameters, it is possible to pass data to the template. Don’t forget to map the input and output. The complete template will be returned as a string. |
The Server Action can be configured to send e-mails. Enter the sender and receiver e-mail, optionally CC and Bcc. You can enter multiple e-mail addresses for the receiver, CC and Bcc – in this case, the e-mail addresses have to be separated with a semicolon. At least, enter the subject and the body in HTML. For better user experience, it is possible to maximize the editor. It is also possible to use the mapping dialog to this instead of using the settings panel. Important: If a mapping is set, the settings in the panel are not considered.
|
_______________________________________________
The Simplifier can sync users of Active Directories, like users from other LDAP sources.
Property | Description |
Name | The name of the authentication mechanism |
Mechanism | Active Directory |
Priority | Priority in which the authentication system will be executed (descending) |
Hose name | The address of the domain controller |
Port | The port of the domain controller (default 389) |
Base DN | Base distinguished name, the entry point (i.E. OU=area51,DC=simplifier,DC=io) |
Firstname attribute | The attribute in the user object for the first name |
Lastname attribute | The attribute in the user object for the last name |
Email attribute | The attribute in the user object for the email |
Mobile attribute | The attribute in the user object for the mobile number |
_______________________________________________
To add a new library click on the “+” in the right corner.
Now you can fill in the following parameter:
Parameter | Description | |
Name & Description | Name | The name of the library. NOTE: The combination of name and version number must be unique! |
Version | The version of the library. | |
Vendor | The vendor of the library. | |
Comment | A description of the library, or e.g. licence information. | |
Compatability | UI5 compatible | Controls the assignment to UI5 Apps. |
Angular JS compatible | Controls the assignment to Angular JS Apps. | |
Angular 2 compatible | Controls the assignment to Angular 2 Apps. | |
Default for UI5 | Assigns the library automatically when creating UI5 Apps. | |
Default for Angular JS | Assigns the library automatically when creating Angular JS Apps. | |
Default for Angular 2 | Assigns the library automatically when creating Angular 2 Apps. | |
Content | ZIP file | The ZIP file, that contains the library. |
JS code to include | Code snippet to integrate the library into Apps. | |
Dependencies | Dependencies | Dependencies to other libraries. |
If you mark a library as “Angular 2 compatible”, you have to fill in additional configuration data in the Content Area (you don’t need a file upload for Angular 2 libraries anymore).
In this additional configuration data field, you can configure npm dependencies of your Managed Library and import custom components. With this high level configuration it is possible to include any Angular 2 specific npm package and configure vanilla Angular 2 apps.
_______________________________________________
To add a template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateAdd | |
Input-Parameter | Name | Template name |
Data | Template content (Base64-coded) | |
Stylesheet | Content of the LESS Stylesheets (Base64-coded, optional) | |
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) | |
Output-Parameter | None |
Example for a call:
{
"name"
:
"templatename"
,
"data"
: "SGFsbG8gV2VsdA==\",
"stylesheet: "
SGFsbG8gV2VsdA==\",
"previewJson"
: "SGFsbG8gV2VsdA==\"
}
Output example:
{
"success"
:
true
}
_______________________________________________
Oracle as a DB backend for the Simplifier requires some additional server settings, which are listed below. The Simplifier is currently running with MySQL 5.7 and Oracle 11g.
Database Settings within the Oracle Database:
Parameter | Recommended Value |
OPEN_CURSORS | 3000 |
Supported Oracle version:
Oracle Database 11g Release 11.2 – 64bit
Desired/recommended instance names (Productive and Test):
simplifierp and simplified
Required tablespaces:
simplifier 5G, Temp 1G, Undo 512 MB, Users 5MB
Oracle user and required roles and permissions:
simplifier, simplifier_np (in Prod and Test) permissions to run DDL
Database Characterset:
AL32UTF8
National Characterset:
UTF8
Default language:
German, Germany
Processes and Sessions:
Value to 1000
_______________________________________________
Templates are HTML templates that allow you to create and consistently use patterns.
To create a new template, click on the plus icon in the template overview. Select the folder name and enter a template name, optionally a description. Now enter the HTML template content and click on Save.
In the Template Editor, you have several options in the toolbar:
In addition, it is possible to parameterize templates. To do this, switch to the tab ‘Parameters’. Via the plus icon you can add new input parameter.
For information about how to send the Templates go to: Business Object Script Template – Send Email.
_______________________________________________
Below is a description of the Simplifier Mobile Client for Android. After you have downloaded the Simplifier Mobile Client from the Play Store, start it on your mobile device.
First you have to authenticate yourself on the login screen with your Simplifier username and password. Enter the instance you want to access. If the device has a fingerprint reader, you can choose to restore your password with it. You can save your login so you don’t have to re-enter it every time.
Since it is uncomfortably to type the instance, you can also use the QR code login. Read here how to create a corresponding QR code in the Simplifier.
Once you have successfully authenticated yourself, you are in the overview of installed applications. At the beginning, this overview is empty. At any time, you can log out by clicking on the logout button in the top left corner. At the top right, on the Simplifier icon, various information will be displayed.
To now use apps on your mobile device, switch to the screen Browse Apps. You now see an overview of all applications that are on the specified instance. To install apps, simply click on them. When the apps are downloaded, Installed will display a notification with the number of newly installed apps. You can delete installed application by swiping to the left.
If an app, that you have already installed, has been newly deployed on the instance, you will be informed about updates of the application.
At the top right, you will find an overview of all settings.
_______________________________________________
If you want to access plugins, you can work with anonymous users. Therefore the PluginAPI works with AnonymousAppProfile.
So only the assigned role to your Application needs the permission to use the Plugin.
Read more about roles.
_______________________________________________
Through App Links you can launch specific Simplifier business applications via Deep Links / URL. Use this feature to crosslink different business applications on your mobile device.
App Links can be used with the following URL scheme:
Scheme:
simplifierclient:///<action>/<value>?<param>=<value>[&<paramN>=<valueN>]
Explanation:
simplifierclient:// – The url type, on that the simplifier client is registered. All uris with this link opens the client by default. If parameters or path components are missing, at least the client is always started.
/<action> – The action to take. For now only “appDirect” is available.
/<value> – The value for the action.
?<param>=<value> – The URL arguments are beeing passed to webview so business app can access them. So on the client the local href would be something like file:///some_very_long_ios_path/www/businessapps/Simplifier_Explored?foo=1&bar=2
Example:
simplifierclient:///appDirect/Simplifier_Explored?foo=1&bar=2
The example above launches the simplifier client if installed and runs the app “Simplifier_Explored”.
Restrictions:
_______________________________________________
The Simplifier transforms your business process into a configured business application for
Applications run on any device because it is generated on common open standard technology.
By clicking on the Applications tile, you will be lead to the overview. At default, there you will see a table with all created applications. Within this table, you’ll get information like the name of the app, created by, last edited by, version, customization ratio, framework, and several actions. | |
At the top, to the right of the plus icon, you can switch between the list and table view. By changing the view, all lists in the Simplifier are changed. There you will see all created applications with information like the name of the app, the description, created by, last edited by, and the framework. |
If you click on an application in the overview, further information and actions are displayed on the right side. On the one hand, you can edit the app name, switch directly to the application preview, or delete the application. On the other hand, you can customize the description, the app icon, look at the customization ratio and the version. Below this information, you then have various actions, in this case, Copy Application and Show Releases.
App | It’s the name of the application. |
Created | The name of the person who has created the application (with date and time). |
Last Edited | The name of the person who last edited the application (with date and time). |
Version | It’s the version number of the releases. |
Customization Ratio | After deploying an application, a code metric is available in the overview. It shows the generated lines of code and a comparison to the lines of code written by the customizer in events and script activities.
|
Framework | The framework – OpenUI5. |
Actions | Edit application, copy application, show releases, edit meta-resources, preview and delete the application. |
You can hide the details on the right with the button right of the search bar.
Read how to create a new application.
_______________________________________________
To upload files like documents, images, videos, 3D models or office documents to your application, click on the assets button.
You can choose between three different options:
To upload an image, choose it from your client via the upload button – a preview will be generated after uploading and also the path for referencing it later into an parameter of an image widget. In our screenshot the path is img/Wine.jpg.
By clicking on the red cross on the right side, you can delete the asset file.
To insert the assets into your user interface add, an image widget and write the path in the source field (src) in the Edit Area on the right.
_______________________________________________
Roles control who receives the messages. Any user who has the corresponding role and uses the Simplifier client at the time of sending a message will receive the message.
Enter the required roles in JSON notation as follows:
{ "roles": [ "<Role-1>", "<Role-2>", ... "<Role-n>" ] }
_______________________________________________
You can assign libraries to your application in the UI Designer. Click on “Libraries” in the upper menu bar to see an overview of all the libraries that are currently used in your app. |
_______________________________________________
This section contains the required request data Jsons for different connectors and the description of each individual field.
The following Connectors are described with an example:
_______________________________________________
The Authentication settings allow you to establish a connection to external Identity Providers in order to sync external user to the Simplifier.
The following Providers are supported:
![]() |
![]() |
![]() |
![]() |
![]() |
LDAP | Active Directory (AD) | SAML 2.0 | oAuth 2.0 | SAP Single-Sign-On (SSO) |
Note: if all authentication systems that are set have been run through and no result has been obtained, a login is executed against the Simplifier User database.
_______________________________________________
On application deployment, the app generator provides a basic self-test for the business application. The automated tests are based on the SAP OPA5 test framework.
The URL of the test page is relative to the deployed business application used under the subpath /test/integration/opaTests.qunit.html and can be opened with a browser.
As an admin, you can perform an automated test. Make sure you are already in the UI Designer for the testing application. Switch to the tab Testing.
To create a new test case, click on the plus icon. Enter a test case name and the testing code. Then click on show test page.
_______________________________________________
Every instance is backed up daily in the Simplifier Cloud.
Both files and a logical database backup (dump) are stored directly on the machine. These are held locally for 4 weeks. This is very useful when restoring a single Simplifier instance.
Furthermore, the Simplifier Cloud is image-based backed up every day. These backups are held for 14 days.
Should the system fail completely, we can initiate a complete restore at any time.
Type of backup | Backup interval | How long are the backups stored? |
tarball of files and a logical database backup | daily | 4 weeks |
image-based backup of the whole Simplifier Cloud | daily | 2 weeks |
_______________________________________________
All Simplifier applications are based on OpenUI5.
|
SAPUI5 and its open-source variant OpenUI5 help you build enterprise-ready Web apps that are responsive to all devices. The JavaScript UI library and development toolkit contains many feature-rich controls and implements the award-winning SAP Fiori user experience. It helps developers ease and speeds up the development of full-blown HTML5 Web applications. |
The Simplifier App Generator generates OpenUI5 Applications based on OpenUI5 Controls. Within Simplifier OpenUI5 Controls are represented by Widgets.
To create the user interface of Simplifier applications visually the UI Designer is used. In general, OpenUI5 uses pages to represent views within a single-page-app. Within Simplifier UI Designer, pages are represented by screens. Simplifier applications consist of one or more screens and every screen can be populated with widgets.
Within Simplifier application logic is separated by user stories within the Process Dashboard. Every user story contains an isolated part of the overall application logic and can be edited with the Process Designer. The Process Designer is a visual scripting environment to create application logic based on configuration elements. To find out how to use configuration elements see chapter Process Designer.
OpenUI5 |
Simplifier |
Description |
Pages (Views) |
Screens |
OpenUI5 pages are represented by screens within Simplifier. A screen collects several widgets in a specific order to represent the user interface. |
Controls |
Widgets |
OpenUI5 controls are represented by widgets within Simplifier. A widget represents a specific element in the user interface like buttons, checkboxes, tables and input fields. |
View Controller |
Screen Controller/User Story |
OpenUI5 view controllers are represented by screen controllers/user stories. There is an n:n relation between user stories and controllers. |
Models |
Screen Models and variableHolder Model |
Within Simplifier there is a global model named variableHolder and each screen has its own model named by the screenId. |
_______________________________________________
Call for BROWSE operations (the name TIA_BROWSE_ALL_VARIABLES is the arbitrarily chosen name for this call)
For the Browse connector call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameter: identifier and namespaceIndex). Furthermore, you need to define the operationTarget, a returnSet and filterSettings (optional).
operationType: Defines which operation you want to execute, in this case, “BROWSE”.
Parameter Name: operations/arrayItem[0]/operationType
Constant Value: BROWSE
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 parameter:
operationTarget: You can browse references forward, backward or in both directions. Choose between the basic attributes (simple) or further ones, depending on the class (extended).
Parameter Name: operations/arrayItem[0]/operationTarget
Data Type: String
Constant Value: Choose between
returnSet:
Parameter Name: operations[0]/returnSet
Data Type: String
Constant Value: LIST
filterSettings (optional):
NOTE: The specific commands are NOT defined here!
Output parameters
You can return all output parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected output parameter, use the following syntax:
Parameter Name: operationsResult/[0]/browseResult/children/nodes/
Data Type: depends on the parameter you want to be returned.
For now only the complete unformatted JSON will be returned.
_______________________________________________
To generate a PDF and manage templates, the role “pdfPlugin” has to be assigned to your user.
You can build a PDF Template by using HTML, CSS and JSON. A live preview is provided on the right, so you can see changes in real time.
The rendering is executed with wkhtmltopdf, therefore every HTML format and feature that supports the QT Webkit render engine is working.
With every template, a stylesheet in LESS format is generated and will be embedded automatically. You can maintain this stylesheet via the same interface as the HTML template.
The inclusion of graphics (<img src=”…”>) and additional stylesheets (<link rel=”stylesheet” href=”…”>) is also supported.
These external asserts are retrieved via the “assets” slot of the AppServer (they should be uploaded there in advance). You can refer to them in the template with a relative filename (no “http://” prefix, no path, etc.!).
Example: <img src=”image.jpg”> (if the file was uploaded as “image.jpg”)
Furthermore, you can add expressions in mustache format. These “variables” are later replaced by values from the update file to a session.
The dynamic data is retrieved as a JSON string in the key-value-store with the key: “sessiondata/$session“.
($session = the session ID that is specified for the generation)
You can combine your PDF document with other PDFs or images from the key-value store.
For this purpose, you can call the list of all the resources you want to merge with the key “merge/$session” in the key-value store. The list should correspond to a JSON-Array, where the entries of the JSON-Array are the keys of the resources to be merged. For example: [“document1.pdf”, “document2.pdf”, “image.jpg”].
The binary data of the corresponding documents should be filed in the key-value store under the keys “document2.pdf”, “document2.pdf” and “image.jpg”.
If the list of merge resources is not found for a session or if the list is empty, the merge is skipped.
After a PDF has been successfully generated, the binary data is stored in the Key-Value Store under the key “pdf/$jobid.pdf“. ($jobid = the job ID, that will be returned after the generation has started)
If the generation can not be executed successfully due to an error, a fault reporting is stored under the key “pdf/$jobid.log” in the key-value store.
_______________________________________________
The Simplifier allows you to create complex integrated applications up to a high degree solely through configuration. Nevertheless, at some point in time, advanced business logic might be required, which can’t be implemented merely by configuration. This is when Business Objects come into play.
Business objects are implemented via JavaScript. This way they integrate seamlessly into Simplifier applications. They enable you to write arbitrary business logic and interact with other Simplifier artifacts like connectors, plugins or other business objects. They can also be used among different applications.
To copy a business object, just click in the overview of business objects on the ‘Copy Business Object’ button on the right of the selected entry.
After you have clicked on it, a pop-up appears in which you can specify the new name of the business object. Then click on ‘Save’.
Now the business object has been copied. All included connectors, plugins and other business objects, as well as the script templates, are available in the copy.
Related Forum Topics:
Started by: yannick
in: Simplifier Forum
Started by: dcyborra
in: Simplifier Forum
Started by: dcyborra
in: Simplifier Forum
Viewing 3 topics – 1 through 3 (of 3 total)
_______________________________________________
For security reasons, it is always a good idea to update your password regularly.
In order to change your password, you have to switch to the ‘Users‘ tile in the Simplifier dashboard. After that, search for the user whose password you want to change and click on the edit icon underneath ‚Actions‘.
You will be lead to the user details of the selected user. Now click on the ‘Send Password Link‘. You will receive an email with a link to change your password.
If you need help, please contact an admin.
If you’re an admin and want to change someone’s password, click on the ‚Password‘ tab in the upper left corner. Now all you have to do is enter the new password, confirm it and finally click on ‚Change Password‘.
_______________________________________________
Here you will find a checklist for all On Premise installations. You can check off the points when you’ve finished them. During this time, please do not reload this page.
Have a FQDN (Fully-Qualified Domain Name) for each instance of the D (Development) Q (QA /Test System) P (Productive) System | |
Set the 3 DNS entries for the 3 FQDN
|
|
Make sure that the Simplifier server reaches the Internet and make sure that the clients have access to the required ports of the Simplifier: 80 (TCP), 443 (TCP), 8090 (TCP) | |
Install the latest version of docker engine | |
Create or specify the Simplifier workspace, set the environment variables, and ensure that enough space is available. Also for future updates. We recommend at least 60 GB Storage. | |
Use the image from the Docker Hub “docker pull itizzimo/simplifier” or use the image provided by our Infrastructure Team | |
Provide the SSL Certificate and Intermediate Certificate. Best practice is a globally valid certificate issued by a trusted certification authority. | |
Start the Simplifier Docker by “docker run…” with the Docker Hub command
$ docker run -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ -d ––name simplifier simplifierag/onpremise:latest |
|
Use the internal reverse proxy or your own external proxy. Take a look at the requirements | |
Contact your project manager or our sales team to get a license | |
To get Simplifier support the following requirements should be fulfilled:
|
|
The web socket should be checked on port 443 | |
Finally, you have to import the standard content |
_______________________________________________
login/accept_sso2_ticket | 1 |
login/create_sso2_ticket | 2 (without certificate) |
icm/host_name_full |
(e.g. hostname.example.com) |
Every user needs the following permission object:
S_SERVICE
Attributes | Values |
SRV_NAME | Name of Webservice |
SRV_TYPE | Type of Webservice (HS) |
The following section documents the most common errors with possible solutions.
Q: What should I do when HTTPS/SSL is not available?
A: If you have problems with the connection set it from SSL to None
Q: What if the WSDL Consumer has problems parsing the WSDL?
A: Manually replace the string ws_policy in the WSDL with standard
Q: How can I monitor the error log of SAP Web services?
A: The error log can be viewed with transaction “srt_util”.
Q: How can I change the SAP web service login language?
A: The standard login language is also via SAP Webservices in English. Thus, all data determinations according to e.g.: Status texts, material text ect. always return in English language.
To be able to change it to German, the following prefix must be appended to the SOAP Webservice operation URL: “?sap-language=DE”
This does NOT mean the WSDL URL!
Q: How can I call the web service from another SAP client?
A: The web service operation call must be done with the parameter?sap-client=[client] so that the system can recognize the client.
Q: What if the Simplifier does not have access to the SAP system?
A: Check the following points:
Please make sure that there is a physical connection between the Simplifer (host) instance and the system. Firewall/Ports may need to be enabled to allow communication in both directions.
The Simplifier Docker or host system must be maintained with the correct network settings for on premise installations. This includes, for example, the setting for DNS servers.
_______________________________________________
var lfx_success = function(data) {
console.log(data)
};
var lfx_error = function(data) {
console.log(data)
};
var lb_showBusyIndicator = true;
var lb_failOnError = true;
Simplifier.Connector.GIS.getGisDivision({}, lfx_success, lb_showBusyIndicator, lb_failOnError, lfx_error)
_______________________________________________
Simplifier.BusinessObject.ContentRepository.contentFolderEdit({}, lfx_success, lb_showBusyIndicator, lb_failOnError, lfx_error
Simplifier.ClientsideBusinessObject.ClientSideBO.getData({}, lfx_success, lb_showBusyIndicator, lb_failOnError, lfx_error)
_______________________________________________
var lfx_success = function(data) {
console.log(data)
};
var lfx_error = function(data) {
console.log(data)
};
var lb_showBusyIndicator = true;
var lb_failOnError = true;
Simplifier.Plugin.contentRepoPlugin.contentFileEdit({}, lfx_success, lb_showBusyIndicator, lb_failOnError, lfx_error)
_______________________________________________
You can access any methods of the Simplifier by using the Simplifier Object.
Simplifier.Connector.<ConnectorName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void Simplifier.Connector.<ConnectorName>.<CallName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {bindingName: "Binding", operationName: "MyOp", soap: {foo: "bar"}}; function onSuccess (data) { resolve(data); }; Simplifier.Connector.MySoap(payload, onSuccess, true, true); Simplifier.Connector.MySoap.myCall(payload, onSuccess, true, false, function () { console.log("something went wrong"); });
Simplifier.BusinessObject.<BOName>.<MethodName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function, parametrized?: boolean = true): void
var payload = {leftOperand: 3, operation: "add", rightOperand: 4}; function onSuccess (data) { resolve(data); }; Simplifier.BusinessObject.OtherBO.someMethod(payload, onSuccess, true, false, function () { console.log("something went wrong"); }, true);
Simplifier.ClientsideBusinessObject.<CSBOName>.<FunctionName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void Simplifier.CurrentClientsideBusinessObject.<FunctionName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {leftOperand: 3, operation: "add", rightOperand: 4}; function onSuccess (data) { resolve(data); }; Simplifier.ClientsideBusinessObject.OtherBO.someMethod(payload, onSuccess, true, false, function () { console.log("something went wrong"); }); Simplifier.CurrentClientsideBusinessObject.someMethod(null, onSuccess, true, false, function () { console.log("something went wrong"); });
Simplifier.Plugin.<PluginName>.<SlotName>(payload: object, successCallback: function, busyFlag?: boolean, failOnError?: boolean, errorCallback?: function): void
var payload = {name: ""}; function onSuccess (data) { resolve(data); }; Simplifier.Plugin.contentRepoPlugin.listRepos(null, onSuccess); Simplifier.Plugin.contentRepoPlugin.createRepo(payload, onSuccess);
var sMySecretKey = "secret"; var oCrypted = CryptoJS.AES.encrypt("dontStealMyData", sMySecretKey); output.result = CryptoJS.AES.decrypt(oCrypted, sMySecretKey).toString(CryptoJS.enc.Utf8)
Take also a look at crypto-js.
_______________________________________________
The Code Designer is a web-based development environment that can be used to write source code like in a normal IDE. Entered code will be highlighted according to the programming language used (e.g. JavaScript, HTML or CSS).
On the left side, there is a document tree view where all the files of an application are displayed in a structured hierarchy. New files can be created, uploaded or moved within the tree view. All opened files are displayed in tabs and can thus be edited easily by switching tabs. The search function is used to search through code by keyword. Changes can be undone or redone with the Undo / Redo Buttons. To get the code file, click on the “Download App” button. |
_______________________________________________
It is possible to see if another user is editing the screens within the application. The number on the top left of the screen tile represents the number of editors on each screen.
As soon as another user starts editing the same screen, the color of the button (in the upper right as well as in the content area) changes to red. To show all editors, click on the button to open a popover with the editing users.
The list of editors is always up to date, so you get an immediate response if someone else starts editing the screen.
Due to the autosave function, there are possibilities to make changes undo or redo. That means, that user actions within the screen content and properties can be undone by clicking on the undo-icon.
The undo-list offers the last actions on the current screen, starting with the last one. If you select an entry from the list, it will be undone including its subsequent actions.
An avatar screen of the corresponding user is displayed within the list. In the case of collaboration, it becomes obvious that the operation will eventually undo the work of another user.
The following actions are listed:
Please note:
The undo lists at the application level are only retained as long as a user is active in the UI Designer. When the last user leaves the application, the lists and all deleted screens are permanently deleted.
The redo-icon provides recently undone actions to redo. The list is cleared when regular editing takes place.
_______________________________________________
Collections represents multiple results of Structs. For example a databank request may deliver a list of addresses from numerous people.
To create a new Collection Type click on the “+” button.
You can define a unique collection name and a description.
By clicking on “Parenttype” a new pop up opens, where you can choose the parenttype from.
NOTE: A Collection can only reference to a Struct or single Domain Types.
After you have clicked on apply, the parenttype will be used.
_______________________________________________
The Cordova Conferencing provides WebRTC Conferencing functionality via Intel’s WebRTC SDK.
Intel WebRTC SDK Version: 4.1
Platforms:
Cordova: 8+
When the local user connects to a room, this plugin overlays the cordova webview to show local and/or remote media streams.
Actions triggered by local user
Actions triggered by server/remote user/network
Object | Field | Type | Possible Values | Default | Description |
connectionConfig (required) | username | String | Defines the username | ||
server | String | URL-Schema | signaling server url | ||
untrustedCertificate | boolean | Trust all certificates | |||
viewConfig (optional) | scalingFactor | float | <1.0 = downscaling – >1.0 upscaling | 0. | Scales CallUI width and height to given factor |
gravity | String | top_left, top_center, top_right, bottom_left, bottom_center, bottom_right, left_center, right_center | bottom_right | Aligns scaled UI to given value | |
mediaConfig (optional) | maxWidth | Integer | a resolution that makes sense | 640 | set maximum width of transmitted video to next (smaller) possible video resolution supported by device camera |
maxHeight | Integer | a resolution that makes sense | 480 | set maximum height of transmitted video to next (smaller) possible video resolution supported by device camera | |
cameraDialog | boolean | true/false | true | enable / disable camera picker dialog | |
preferFrontCamera | boolean | true/false | false | if camera dialog is turned off, front camera is prefered to be opened if device has such | |
maxFps | Integer | 30 | max transmitted frames | ||
maxVideoBandwidth | Integer | min 200 @ low resolution | 1500 | limits bandwidth of video channel to given value in mBit/s | |
maxAudioBandwidth | Integer | min ~30 | 100 | limits bandwidth of video channel to given value in mBit/s | |
videoCodec | String | VP8, VP9, H264, H265 | H264 | switches used hardware decoder. if h264 is not present on device, VP8 is used as fallback | |
iceConfig (Array – optional) | url | String | URL | Turn/Stun-URL | |
username | String | username for Stun/Turn authentication | |||
password | String | password – can be empty for anonymous access |
/** * Initializes native views and config properties. * * @param config JSONObject - The config data * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.init(config, success, error);
/** * Create a conferencing token and join the selected room * * @param data JSONObject - Username, roomId and role * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.joinRoom(data, token, success, error);
/** * Leave the current room and unpublish and unsubscribe all streams * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.leaveRoom(success, error);
/** * Get all participants or the selected participant of a room * * @param data JSONObject - RoomId and userId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.getParticipant(data, token, success, error);
/** * Update the participant properties * * @param data JSONObject - RoomId, userId and userProperties * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.editParticipant(data, token, success, error);
/** * Kick a participant * * @param data JSONObject - RoomId and userId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.kickParticipant(data, token, success, error);
/** * Create a room * * @param data JSONObject - Name and roomOptions * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.createRoom(data, token, success, error);
/** * Get all rooms or the selected room * * @param data JSONObject - RoomId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.getRoom(data, token, success, error);
/** * Update the room options * * @param data JSONObject - RoomId and roomOptions * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.editRoom(data, token, success, error);
/** * Delete a room * * @param data JSONObject - RoomId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.deleteRoom(data, token, success, error);
/** * Subscribe a remote stream * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.subscribe(success, error);
/** * Unsubscribe a remote stream * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.unsubscribe(success, error);
/** * Publish a local stream in a room * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.publish(success, error);
/** * Unpublish a local stream * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.unpublish(success, error);
/** * Start screen sharing * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.startScreenSharing(success, error);
/** * Stop screen sharing * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.stopScreenSharing(success, error);
/** * Send messages to the selected participants in a room * * @param message String - The config data * @param data JSONArray - Selected participants * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.sendMessage(message, participants, success, error);
/** * Action triggered by server when received a chat message * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.onReceivedChatMessage(success, error);
/** * Action triggered by server when participant changed his status (participant leave room) * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.onChangedParticipantStatus(success, error);
/** * Action triggered by server when server/room changed his connections status * * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.onChangedConnectionStatus(success, error);
/** * Resize the native view of a remote stream * * @param div HTML Object - The HTML remote stream view * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.resizeRemoteContainer(div, success, error);
/** * Resize the native view of a local stream * * @param div HTML Object - The HTML local stream view * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.resizePublishContainer(div, success, error);
/** * Get all streams or the selected stream of a room * * @param data JSONObject - RoomId and streamId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.getStream(data, token, success, error);
/** * Delete a stream * * @param data JSONObject - RoomId and streamId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.deleteStream(data, token, success, error);
/** * Update the stream properties * * @param data JSONObject - RoomId, streamId and streamProperties * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.editStream(data, token, success, error);
/** * Start recording a stream of a room * * @param data JSONObject - RoomId, container (mp4), media * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.startRecording(data, token, success, error);
/** * Update the recording options * * @param data JSONObject - RoomId, recordId, recordingOptions * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.editRecording(data, token, success, error);
/** * Stop recording of a stream * * @param data JSONObject - RoomId and recordId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.stopRecording(data, token, success, error);
/** * Get all or the selected recording of a room * * @param data JSONObject - RoomId and recordId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.getRecording(data, token, success, error);
/** * Add an external stream to a room * * @param data JSONObject - RoomId, url, transport (tcp), media (audio or video) * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.startStreamIn(data, token, success, error);
/** * Remove the external stream * * @param data JSONObject - RoomId and streamId * @param token String - The simplifier token * @param success The success callback is triggered when process is successful * @param error The error callback is triggered when process failed */ ConferencingPlugin.stopStreamIn(data, token, success, error);
{ "action": "<action>", //see "Possible Actions" "result": "<String>", //some results depending on action }
let successCallback = function(event){ console.log("Success: " + event); } let errorCallback = function(event){ console.warn("Error: " + event); } let token = "dk4dfanew30239naa12dk2323r90asdf=="
let config = { "connectionConfig": { "username": "paul", "server": window.serverUrl, "untrustedCertificate": true }, "iceConfig": [{ "url": "stun:turn.itizzimo.com:3478" }, { "url": "stun:turn.itizzimo.com:3479" }, { "url": "stun:turn.itizzimo.com:5349" }, { "url": "stun:turn.itizzimo.com:5350" }, { "url": "turn:turn.itizzimo.com:3478?transport=tcp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:3478?transport=udp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:3479?transport=tcp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:3479?transport=udp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:5349?transport=tcp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:5349?transport=udp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:5350?transport=tcp", "username": "admin", "password": "admin" }, { "url": "turn:turn.itizzimo.com:5350?transport=udp", "username": "admin", "password": "admin" } ], "viewConfig": { "scalingFactor": 0.3, "gravity": "bottom_right" }, "mediaConfig": { "maxWidth": 640, "maxHeight": 480, "cameraDialog": true, "preferFrontCamera": true, "maxFps": 60, "maxVideoBandwidth": 5000, "maxAudioBandwidth": 200, "videoCodec": "H264" }, "debug": { "local": { "fps": false, "bitrate": false, "audiolevels": false }, "remote": { "fps": false, "bitrate": false, "audiolevels": false } } }; ConferencingPlugin.init(config, successCallback, errorCallback);
let data = { "role": "presenter", "username": "specialUser28", "room": "3023dak23dka1" //roomId }; ConferencingPlugin.joinRoom(data, token, successCallback, errorCallback);
let data = { "room": "ksdfkfsdew3232", //roomId "userId": "9SN_jqHVelwHksjaAACf" //optional }; ConferencingPlugin.getParticipant(data, token, successCallback, errorCallback);
let data = { "room": "5c1b966d9869270cb9134328", "participantId": "HfwkX_3D1HYHjq-4AAEC", "items": [{ "op": "replace", "path": "/permission/publish", "value": { "audio": false, "video": false } }] }; ConferencingPlugin.editParticipant(data, token, successCallback, errorCallback);
let data = { "room": "5c1b966d9869270cb9134328", "participantId": "wRgmC31dz3hJHJzjAAEB" }; ConferencingPlugin.kickParticipant(data, token, successCallback, errorCallback);
let data = { "name": "Testroom", "options": { "views": [{ "video": { "parameters": { "resolution": { "height": 1080, "width": 1920 }, "framerate": 60 }, "format": { "codec": "h264" } } }], "participantLimit": 10, "inputLimit": -1 } }; ConferencingPlugin.createRoom(data, token, successCallback, errorCallback);
let data = { "room": "5c1b966d9869270cb9134328" //optional }; ConferencingPlugin.getRoom(data, token, successCallback, errorCallback);
let data = { "room": "5c1b966d9869270cb9134328", "options": { "name": "Testroom2", //required "views": [{ "video": { "parameters": { "resolution": { "height": 480, "width": 640 }, "framerate": 30 }, "format": { "codec": "h264" } } }], "participantLimit": 24 } }; ConferencingPlugin.editRoom(data, token, successCallback, errorCallback);
let data = { "room": "5c1b966d9869270cb9134328" }; ConferencingPlugin.deleteRoom(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "streamId": "519038650981614300" //optional }; ConferencingPlugin.getStream(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "streamId": "519038650981614300" }; ConferencingPlugin.deleteStream(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "streamId": "140827592383601540", "items": [{ "op": "replace", "path": "/media/video/status", "value": "inactive" }] }; ConferencingPlugin.editStream(data, token, successCallback, errorCallback);
let data = { "room": "5bbb5a846ee20b02aa9cf430", "container": "mp4", "media": { "audio": { "from": "764484888390779500", "format": { "codec": "opus", "sampleRate": 48000, "channelNum": 2 } }, "video": { "from": "764484888390779500", "format": { "codec": "h264" }, "parameters": { "resolution": { "width": 640, "height": 480 }, "framerate": 30, "bitrate": "x0.8", "keyFrameInterval": 30 } } } }; ConferencingPlugin.startRecording(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "recordId": "287103235454593920" //<optional> }; ConferencingPlugin.getRecording(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "recordId": "287103235454593920", "items": [ { "op": "replace", "path": "/media/video/parameters/framerate", "value": 60 } ] }; ConferencingPlugin.editRecording(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "recordId": "915058137572230700" }; ConferencingPlugin.stopRecording(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "url": "<video url>", "transport": "tcp", "media": { "audio": true, "video": true } }; ConferencingPlugin.startStreamIn(data, token, successCallback, errorCallback);
let data = { "room": "5c3c632f2686480cbf83e7e1", "streamId": "5c3c6313752307bf83e7d121" }; ConferencingPlugin.stopStreamIn(data, token, successCallback, errorCallback);
//initialization success Success: {"action":"init","result":"App initialized"} //get all rooms - Result: Name, id, options Success: {"action":"getRoom","result": JSONArray} //join room Success: {"action":"createToken","result":"asdj0dDK3kf239332=="} //get participant - Result: id, user, role, permissions Success: {"action":"getParticipant","result": JSONArray} //publish local stream to room Success: {"action":"publish","result":"Published stream"} //subscribe common stream of the selected room Success: {"action":"subscribe","result":"Subscribed stream"} //unsubscribe remotestream Success: {"action":"unsubscribe","result":"Unsubscribed stream"} //create room - Result: Name, id, options Success: {"action":"createRoom","result": JSONObject} //delete room Success: {"action":"deleteRoom","result":"Room deleted"} //start screen sharing Success: {"action":"startScreenSharing","result":"ScreenSharing started"} //stop screen sharing Success: {"action":"stopScreenSharing","result":"ScreenSharing stopped"} //start stream recording - Result: id, storagePath, mediaOptions Success: {"action":"startRecording","result": JSONObject} //stop stream recording Success: {"action":"stopRecording","result": ""} //add external stream to room - Result: id, info, options Success: {"action":"startStreamIn","result": JSONObject} //remove external stream Success: {"action":"stopStreamIn","result":""} //leave room Success: {"action":"leaveRoom","result":"Room left"}
Intel WebRTC SDK: https://software.intel.com/en-us/webrtc-sdk
_______________________________________________
this.callConnector(connectorName, payload, callback, showBusyIndicator, failOnError, failCallback)
connectorName | the name of the connector |
payload | a JSON object with the required parameters of the call |
callback | function, which is called after the successful execution of the connector |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar during the call (true) or not (false) |
failOnError | boolean value that indicates whether the connector should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector, if false “failOnError” is passed |
_______________________________________________
The user interface for configuring a connector call is generic, thus it looks the same for all kinds of underlying types of connectors. Having the same interface for all kinds of connector calls is very convenient. But one drawback of this approach is, that some connectors require fixed parameters to be set, in order to work properly. This section tells you more about these details.
You can declare parameters of Connectors as optional.
When declaring a parameter as non optional, the validation of the call will fail if the parameter is not provided.
If you click on the data type field, a selector opens.
Number | Description |
1 | The currently selected data type. |
2 | In this filtering list of all data types, you can find manually and automatically built data types. Custom data types are only manual data types. When the dialog opens in an automatically generated connector call, the data types of the connector can also be selected. |
3 | Prefilter of base and domain types, structs and collections. |
4 | You can always step deeper in the structure to select a data type. |
_______________________________________________
In order to execute a connector call please use this code snippet:
this.callConnectorCall(connectorName, connectorCallName, payload, callback, showBusyIndicator, failOnError, failCallback)
connectorName | the name of the connector |
connectorCallName | the name of the connector call name |
payload | a JSON object with the required parameters for the call |
callback | function, which is called after the successful execution of the connector call |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar during the call (true) or not (false) |
failOnError | boolean value that indicates whether the connector call should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the connector call, if false for “failOnError” is passed |
_______________________________________________
Connectors are used to retrieve data from backend systems and third-party sources and write back changed data into them. They can be used by a unique name within configured business applications or business objects. It represents the systems part of the simplifier.
Connector | Adresses a specific backend systems like SAP, Salesforce or a Database |
Connector Call | Brings a specific connector into action. It contains input and output parameters |
You can choose between different Connector Types. A Connector Type represents the technical protocol.
Connector Type |
Description |
Push Notification | Sends Push Notifications over Websockets directly to Simplifier Clients or Simplifier Browser Apps without using Google or Apple’s Cloud services to support data privacy and protection. |
oData | oData Proxy for using oData v2 Services . Open Data Protocol (OData) is an open protocol which allows the creation and consumption of queryable and interoperable RESTful APIs in a simple and standard way. |
SOAP | Simple Object Access Protocol based on HTTP and XML Format. |
CSV | Read and/or write comma separated files on a local file store. |
MQTT Client |
Message Queue Telemetry Transport (MQTT) is a lightweight messaging protocol for small sensors and mobile devices, optimized for high-latency or unreliable networks. This Connector acts as a client and can publish or subscribe messages from a mqtt broker. |
Logging Write | This Connector can transfer the Simplifier application logs to a central monitoring tool / logwatch server. |
REST | Connector for HTTP REST Services. Representational State Transfer (REST) architecture uses standardized operations (GET, PUT, POST, DELETE) on web services. |
SQL | Database Connector for executing SQL Statements on a database schema. |
Email Connector for sending Emails over SMTPS (Simple Mail Transfer Protocol) with or without SSL Encryption. | |
OPC-UA | Open Platform Communication – Unified Architecture Connector, it connects to an OPC-UA server and performs READ/WRITE/SUBSCRIBE operations. For now READ/WRITE operations are supported through connector calls, here and Live-Value Monitoring through websockets, here. |
SAP-RFC | Connector based on standard JCO SAP RFC Connector to call remote function blocks |
_______________________________________________
Slot | Description |
contentFileAdd | This function adds a new content file |
Key | Type | Description |
folderId | Integer | ID of the parent folder |
name | String | File name (also used to determine the MimeType) |
description | String (optional) | Description of the file |
securitySchemeID | String | ‘public’: file is public, ‘private’: file is not public |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
data | String (optional) | Base64 encoded content of the file |
uploadSession | String (optional) | Session of an AppServer Html5 Upload |
copyFrom | Integer (optional) | ID of the copied file |
Note:
The content of the file can be transferred in three different ways. Exactly one of the following parameters must be passed:
{ "folderId" : 5, "name" : "test.txt", "description" : "My file description", "securitySchemeID" : "public", "permissionObjectType" : "Session", "permissionObjectID" : "abc", "data" : "dGVzdA==" }
Key | Type | Description |
id | Integer | ID of the created content file |
name | String | Name of the created content file |
{ "id": 15, "name": "test.txt" }
Key | Type | Description |
contentId | Integer | ID of the content repository |
fileName | String | Name of the file |
folderPath | String | Path under which the file is to be stored |
data | String (optional) | Base64 encoded content of the file |
uploadSession | String (optional) | Session of an AppServer Html5 Upload |
copyFrom | String (optional) | ID of the copied file |
forceOverwrite | Boolean (optional) | If the flag has the value ‘true’, any existing file with the same name will be overwritten; If not set or ‘false’, the creation leads to an error if a file with the same name already exists |
Note:
The content of the file can be transferred in three different ways. Exactly one of the following parameters must be passed:
{ "contentId" : 5, "fileName" : "test.txt", "folderPath" : "MyParentFolder/MyChildFolder" "data" : "dGVzdA==" }
Slot | Description |
contentFileFind | This function lists the searched content file |
Key | Type | Description |
folderId | Integer | ID of the content folder in which the content is listed |
name | String | Name of the searched file |
{ "folderId": 3, "name": "test.txt" }
Key | Type | Description |
files | Array | Array of all files (max. 1 element) |
id | Integer | ID of the file |
name | String | Name of the file |
description | String | Description of the file |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
securitySchemeID | String | Security scheme (‘public’/’private’) |
statusSchemeID | String | Status scheme (not implemented yet; always ‘default’) |
statusID | String | Status scheme (not implemented yet; always ‘default’) |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "files": [ { "id": 3, "name": "test.txt", "description": "My file description 1", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "jpg", "mimeType": "image" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/ParentFolder/ChildFolder/file.jpg/", } ] }
Key | Type | Description |
contentId | Integer | ID of the content repository in which you want to search |
fileName | String | Name of the searched file |
folderPath | String (optional) | Path of the folder to search in |
{ "contentId": 3, "filename": "test.txt", "folderPath: "MyParentFolder/MyChildfolder" }
Key | Type | Description |
files | Array | Array of all files |
filePath | String | Path of the file |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "files": [ { "filePath": "MyParentFolder/MyChildFolder/test.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt/" }, { "filePath": "MyParentFolder/MyChildFolder/MyFolder/test.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/MyFolder/test.txt/" } ] }
Slot | Description |
contentFileList | This function lists a file |
Key | Type | Description |
folderId | Integer | ID of the listed content folder |
{ "folderId": 3 }
Key | Type | Description |
files | Array | Array of all files |
id | Integer | ID of the file |
name | String | Name of the file |
description | String | Description of the file |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
securitySchemeID | String | Security scheme (‘public’/’private’) |
statusSchemeID | String | Status scheme (not implemented yet; always ‘default’) |
statusID | String | Status scheme (not implemented yet; always ‘default’) |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "files": [ { "id": 3, "name": "test.txt", "description": "My file description 1", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt/" }, { "id": 4, "name": "test2.txt", "description": "My file description 2", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test2.txt/" } ] }
Key | Type | Description |
contentId | Integer | ID of the listed content repository |
folderPath | String (optional) | Path of the folder of the listed files |
{ "contentId": 3, "folderPath": "MyFolder" }
Key | Type | Description |
files | Array | Array of all files |
fileName | String | Name of the file |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "files": [ { "fileName": "test.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt/" }, { "name": "test2.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test2.txt/" } ] }
Slot | Description |
contentFileGet | This function queries |
Key | Type | Description |
id | Integer | Primary key |
{ "id": 3 }
Key | Type | Description |
id | Integer | ID of the file |
folderId | Integer | ID of the parent folder |
name | String | Name of the file |
description | String | Description of the file |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
securitySchemeID | String | Security scheme (‘public’/’private’) |
statusSchemeID | String | Status scheme (not implemented yet; always ‘default’) |
statusID | String | Status scheme (not implemented yet; always ‘default’) |
data | String | Base64 encoded content of the file |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "id": 3, "folderId": 5, "name": "test.txt", "description": "My file description", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "data": "dGVzdA==", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt/" }
Key | Type | Description |
contentId | Integer | ID of the listed content repository |
filePath | String | Path of the file |
{ "contentId": 3, "filePath": "MyFolder/test.txt" }
Key | Type | Description |
filePath | String | File name |
data | String | Base64 encoded content of the file |
length | Integer | Length of the file in bytes |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "filePath": "MyFolder/test.txt", "data": "dGVzdA==", "length": 59570, "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyFolder/test.txt/" }
Slot | Description |
contentFileGetMetadata | This function queries the metadata |
Key | Type | Description |
id | Integer | Primary key |
{ "id": 3 }
Key | Type | Description |
id | Integer | ID of the file |
folderId | Integer | ID of the parent folder |
name | String | File name |
description | String | Description of the file |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
securitySchemeID | String | Security scheme (‘public’/’private’) |
statusSchemeID | String | Status scheme (not implemented yet; always ‘default’) |
statusID | String | Status scheme (not implemented yet; always ‘default’) |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "id": 3, "folderId": 5, "name": "test.txt", "description": "My file description", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt" }
Key | Type | Description |
contentId | Integer | ID of the listed content repository |
filePath | String | Path of the file |
{ "contentId": 3, "filePath": "MyFolder/test.txt" }
Key | Type | Description |
filePath | String | File name |
mimeType | Object | MimeType information |
mimeType/extension | String | The file extension |
mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
url | String | The download URL of the file |
{ "filePath": "MyFolder/test.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyFolder/test.txt" }
Slot | Description |
contentFileGetMetadataBatched | This function queries the metadata batched |
Key | Type | Description |
contentId | Integer | ID of the repository in which the files are stored |
files | Array[Object] | A list of file objects |
files/id | Integer | ID of the file |
{ "contentId": 1, "files": [{ "id": 1 }, { "id": 2 }] }
Key | Type | Description |
fileMetadata | Array[Object] | A list of metadata objects |
fileMetadata/id | Integer | ID of the file |
fileMetadata/folderId | Integer | ID of the parent folder |
fileMetadata/name | String | Name of the file |
fileMetadata/description | String | Description of the file |
fileMetadata/permissionObjectType | String | Must be specified as ‘Session’ |
fileMetadata/permissionObjectID | String | The ID of the Object Type can be freely selected |
fileMetadata/securitySchemeID | String | Security scheme (‘public’/’private’) |
fileMetadata/statusSchemeID | String | Status scheme (not implemented yet; always ‘default’) |
fileMetadata/statusID | String | Status scheme (not implemented yet; always ‘default’) |
fileMetadata/mimeType | Object | MimeType information |
fileMetadata/mimeType/extension | String | The file extension |
fileMetadata/mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
fileMetadata/url | String | The download URL of the file |
{ fileMetadata: [{ "id": 1, "folderId": 5, "name": "test.txt", "description": "My file description", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder/test.txt" }, { "id": 2, "folderId": 3, "name": "picture.jpg", "description": "My file description", "statusSchemeID": "Default", "statusID": "Default", "securitySchemeID": "public", "permissionObjectType": "Session", "permissionObjectID": "abc", "mimeType": { "extension": "jpg", "mimeType": "picture" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/MyParentFolder/MyChildFolder2/picture.jpg" }] }
Key | Type | Description |
contentId | Integer | ID of the listed content repository |
files | Array[Object] | A list of file objects |
files/filePath | String | Path of the file |
{ "contentId": 6, "files": [{ "filePath": "Folder/picture.jpg" }, { "filePath": "Folder2/text.txt" }] }
Key | Type | Description |
fileMetadata | Array[Object] | A list of metadata object |
fileMetadata/filePath | String | File name |
fileMetadata/mimeType | Object | MimeType information |
fileMetadata/mimeType/extension | String | The file extension |
fileMetadata/mimeType/mimeType | String | The mimeType stored in the MimeMapping for the file extension |
fileMetadata/url | String | The download URL of the file |
{ fileMetadata: [{ "filePath": "Folder/picutre.jpg", "mimeType": { "extension": "jpg", "mimeType": "picture" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/Folder/picture.jpg" }, { "filePath": "Folder2/test.txt", "mimeType": { "extension": "txt", "mimeType": "text" }, "url": "http://localhost:8080/client/2.0/plugin/contentRepoPlugin/file/RepoName/Folder2/test.txt" }] }
Slot | Description |
contentFileEdit | This function edits a content file |
Key | Type | Description |
id | Integer | ID of the data to be processed |
name | String | File name (also used to determine the MimeType) |
description | String (Optional) | Description of the file |
securitySchemeID | String | ‘public’: file is public, ‘private’: file is not public |
permissionObjectType | String | Must be specified as ‘Session’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
data | String | Base64 encoded content of the file |
{ "id" : 5, "name" : "test.txt", "description": "My new file description", "securitySchemeID" : "public", "permissionObjectType" : "Session", "permissionObjectID" : "abc", "data" : "dGVzdA==" }
Key | Type | Description |
contentId | Integer | ID of the content repository in which the file is stored |
sourceFilePath | String | Path of the file to be edited |
destFilePath | String | Path incl. new name under which the file is to be stored |
forceOverwrite | Boolean (optional) | If the flag has the value ‘true’, any existing file with the same name will be overwritten; If not set or ‘false’, the creation leads to an error if a file with the same name already exists |
{ "contentId" : 5, "sourceFilePath" : "MyParentFolder/test.txt", "destFilePath": "MyParentFolder/MyChildFolder/myRenamedMovedFile.txt" }
Slot | Description |
contentFileDelete | This function deletes a content file |
Key | Type | Description |
id | Integer | Primary key |
{ "id": 15 }
Key | Type | Description |
contentId | Integer | ID of the content repository in which the file is stored |
filePath | String | Path of the file to be deleted |
{ "contentId": 10, "filePath" : "MyFolder/myFile.txt" }
_______________________________________________
The Content Repository Plugin is used to implement a persistence layer for data so that you can store images and videos using this plugin. It contains a repository, folders and files, so you create a repository (parent folder) in which subfolders can be stored in any hierarchy.
Example call of a Content Repository Plugin function via a server-side Business Object:
var payloadClearFileSystem = { slot: "contentRepositoryAdd", payload: { "provider": "ClearFileSystem", "name": input.name, "description": input.description } }; var result = JSON.parse(PLUGIN_contentRepoPlugin.run(JSON.stringify(payloadClearFileSystem)))
The payload configuration depends on the required slot.
The file system stores the received content repository data in a database.
The clear file system stores this data in an actual file system (compare Windows Explorer).
Slot | Description |
contentRepositoryAdd | This function adds a new content repository |
Key | Type | Description |
name | String | Name of the repository |
description | String (optional) | Description of the repository |
provider | String | Content provider (must be specified as ‘FileSystem’) |
permissionObjectType | String | Must be specified as ‘App’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
{ "permissionObjectType" : "App", "permissionObjectID": "DummyApp", "provider" : "FileSystem", "name": "MyTestRepo", "description": "MyTestRepoDescription" }
Key | Type | Description |
id | String | The ID of the created repository |
{ "id": 15 }
Key | Type | Description |
name | String | Name of the repository |
description | String (optional) | Description of the repository |
provider | String | Content provider (must be specified as ‘ClearFileSystem’) |
{ "name": "MyTestRepo", "provider" : "ClearFileSystem", "description": "MyTestRepoDescription" }
Key | Type | Description |
id | Integer | ID of the created ContentRepository |
description | String | Description of the repository |
{ "id": 15, "description": "MyTestRepoDescription" }
Slot | Description |
contentRepositoryFind | This function lists only repositories for which the user has authorizations |
Key | Type | Description |
name | String | Name of the searched repository |
{ "name": "MyRepo" }
Key | Type | Description |
repositories | Array | Array of all repositories (max. 1 element) |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
permissionObjectType | String | Must be specified as ‘App’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
provider | String | Content provider (must be specified as ‘FileSystem’) |
{ "repositories": [ { "id": 3, "name": "MyRepo", "description": "My repo description", "permissionObjectType": "App", "permissionObjectID": "DummyApp", "provider": "FileSystem", } ] }
Key | Type | Description |
name | String | Name of the searched repository |
{ "name": "MyRepo" }
Key | Type | Description |
repositories | Array | Array of all repositories (max. 1 element) |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
provider | String | Content provider (must be specified as ‘ClearFileSystem’) |
{ "repositories": [ { "id": 3, "name": "MyRepo", "description": "My repo description", "provider": "ClearFileSystem" } ] }
Slot | Description |
contentRepositoryList | This function finds only repositories for which the user has authorizations |
Key | Type | Description |
provider | String (optional) | Content provider (must be specified as ‘FileSystem’) If no provider is specified, all repositories are returned |
{ "provider": "FileSystem" }
Key | Type | Description |
repositories | Array | Array of all repositories |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
permissionObjectType | String | Must be specified as ‘App’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
provider | String | Content provider |
{ "repositories": [ { "id": 3, "name": "MyRepo", "description": "My repo description", "permissionObjectType": "App", "permissionObjectID": "DummyApp", "provider": "FileSystem", }, { "id": 4, "name": "MyRepo2", "description": "My repo description 2", "permissionObjectType": "Session", "permissionObjectID": "abc", "provider": "FileSystem", } ] }
Key | Type | Description |
provider | String (optional) | Content provider (must be specified as ‘ClearFileSystem’) If no provider is specified, all repositories are returned |
{ "provider": "ClearFileSystem" }
Key | Type | Description |
repositories | Array | Array of all repositories |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
provider | String | Content provider |
{ "repositories": [ { "id": 5, "name": "MyRepo5", "description": "My repo description 5", "provider": "ClearFileSystem" }, { "id": 6, "name": "MyRepo6", "description": "My repo description 6", "provider": "ClearFileSystem" } ] }
Slot |
contentRepositoryGet |
Key | Type | Description |
id | Integer | Primary key |
{ "id": 3 }
Key | Type | Description |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
permissionObjectType | String | Must be specified as ‘App’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
provider | String | Content provider (must be specified as ‘FileSystem’) |
{ "id": 3, "name": "MyRepo", "description": "My repo description", "permissionObjectType": "App", "permissionObjectID": "DummyApp", "provider": "FileSystem", }
Key | Type | Description |
id | Integer | Primary key |
{ "id": 3 }
Key | Type | Description |
id | Integer | ID of the repository |
name | String | Name of the repository |
description | String | Description of the repository |
provider | String | Content provider (must be specified as ‘ClearFileSystem’) |
{ "id": 3, "name": "MyRepo", "description": "My repo description", "provider": "ClearFileSystem", }
Slot | Description |
contentRepositoryEdit | This function edits a content repository |
Key | Type | Description |
id | Integer | Primary key (ID of the repository) |
name | String | Name of the repository |
description | String (optional) | Description of the repository |
permissionObjectType | String | Must be specified as ‘App’ |
permissionObjectID | String | The ID of the Object Type can be freely selected |
{ "id" : 15, "permissionObjectType" : "App", "permissionObjectID": "DummyApp", "name": "MyTestRepo", "description": "My new description", }
Key | Type | Description |
id | Integer | Primary key (ID of the repository) |
name | String | Name of the repository |
description | String (optional) | Description of the repository |
{ "id" : 15, "name": "MyTestRepo", "description": "My new description" }
A repository can only be deleted if it does not contain any content folders.
Slot | Description |
contentRepositoryDelete | This function deletes a content repository |
Key | Type | Description |
id | Integer | Primary key |
{ "id": 15 }
_______________________________________________
You can copy a connector call within a connector in the connector call overview by clicking the appropriate copy button.
By clicking the button a new pop up opens in which you can specify the name of the copied connector call. The default value is the name of the copied connector call added _copy.
Once you have assigned a name, click on the save button. Your connector call has been copied with all input and output parameters.
_______________________________________________
You can copy any Data Type of the Simplifier. The copy will have all attributes/fields and any tags given to the copied template.
Click on the copy icon and a new pop-up will appear.
By default, “_Copy” is added to the current Data Type Name. However, you can also assign a new name. Click ‘Save’ and the copy has been created.
_______________________________________________
Enter tile “Transports” on the Simplifier Dashboard and click on Transportcollection to define a new Transport or edit an existing one. This leads you to the overview page, which lists all existing Transports:
To create a new Transport, or edit an existing one, make sure you’ve got the “Transport Creation” permission associated to one of your roles. Click on “+” on in the upper right corner to create a new Transport from scratch or press the edit button beside one of your existing one to edit it. This leads you to a new page which allows you to define all Transport artifacts:
The upper part of the screen allows you to enter a name for your Transport.
The lower part of the screen is dedicated to the selection of the artifacts which shall be part of your Transport. The left pane lists all available features (Apps, Connectors, Roles, Business Objects, Datatypes, Widgets & Libraries) and allows you to search for specific ones. Ideally, the features of your app have an identical name part, so you can easily find all belonging features through the search bar. You can filter the list by clicking on “Name” or “Feature” and select e.g. only Widgets.
Select an artifact by checking the checkbox beside it. After clicking the right arrow, all selected artifacts are immediately listed in the right pane. (Attention: The “Application” feature represents only the cover of your app and its standard Widgets, not all your used features like e.g. customized Widgets, Business Objects or Connectors!
When you’re done, press the “Save” button in the upper right corner or “Cancel”, if you want to omit your changes.
_______________________________________________
If you choose to create a new OpenUi5 Widget, you have to take a look at the constructor details in its API reference.
Here you can find the OpenUi5 API of all Widgets and a description when to use them.
Let’s create a mobile version of a Panel. For starters search new sap.m.Panel in the API reference.
You will see the supported settings, in this case: Properties, Aggregations and Events.
For the first step name your Widget, write a short description and choose a category in the Widget tab.
In addition you’ve got now the possibility to add custom tags to the widget. You can search and filter for widget tags in the search field of the widget overview list and in the widget search field of the UI designer.
Click on the OpenUI5 tab to fill out the specific parameters.
The Widget Type has to be the same as the UI5 control name. In this case: sap.m.Panel
API reference
Simplifier Widget Type
Fill in the template for the Widget. It represents a blueprint of the Widget which can be used by the Simplifier.
The OpenUI5 templates are written in JSON with Mustache placeholder syntax.
The Simplifier supports three different types:
The placeholderName will be used to declare properties, events, etc.. It is advisable to use the OpenUI5 names.
For SAP Controls (e.g. sap.m.BackgroundDesign) you can use the „String“ Data Type.
All attributes that are declared with a mustache value in the template, have to be declared in the properties / events / etc. area below as well, so you can work with them in the UI Designer later in the process. You can use constant values instead of mustache e.g. if you don‘t want a property to be editable.
If all properties are listed, you can set the Default Binding-Property which is the prioritized widget property used in the edit mode of a user story (Process Designer).
After hitting the “Save” button, you’ve successfully created a Panel Widget for your application.
_______________________________________________
There are two different options to create a Transport:
_______________________________________________
Connectors define the connection (entry point) to an external system. Given such a connection, you might send several different requests to the connected system. We call one such concrete pair of request / response a “connector call”. In order to use a connector call in the edit mode of a user story (Process Designer), you must create at least one connector call for each connector.
Attention To use a connector within an app, you have to configure a specific connector call and assign data types within the configuration! Otherwise the connector will not be visible in the Process Designer. |
Choose a connector from the overview and click the call icon. In the call overview add a new call for each connector operation.
For SOAP and SQL connectors, you have the possibility to use the Connector Wizard. It helps you to create your connector calls much easier and faster. If you click on it, you can choose the ones that you need.
Otherwise click on the plus icon in the upper right and enter a unique call name that describes the operation (e.g. read, write, update, delete, search, …).
Connector Call name
Unique name without spaces to describe the operation.
Description
Description of the operation.
For configuring a connector call, you have to specify input and output parameters in the following tables:
Each connector call has its own specific parameters.
Validate
You can validate the Input and Output parameter in the backend. It validates:
If the validation is not successful, the client is notified of all failed validations and it’s written to the Connector log or System log at the same time.
For every new Connector Call, this flag is set by default. Already existing Connector Calls do not have this checkbox flagged to guarantee the compatibility.
Parametername
The technical path or name within a rest api definition or web service description language or csv header column.
Alias
A meaningful non-technical description for the technical parameter. This wording is used in the edit mode for a user story (Process Designer) for mapping data with ui elements.
Description
Optional description of the parameter.
Constant Value
A constant value like SAP Client or company code that can’t be overwritten by any business apps. The value will be validated, so that it’s not possible to use a constant value with a wrong base type in Connector Calls and Buisness Objects.
Data Type
Assigned Simplifier data type for validating data before it gets back or from a backend system.
After finishing the parameters, you can save the connector call settings.
_______________________________________________
Connector Type | Login Method | Connector Details | Copy a Connector | Usage of Connector
To create a new connector, click on the plus icon on the upper right corner within the connector overview. It opens a new pop up where you can select the connector type and enter the required and optional information.
Name | The connector needs a unique name. |
Connector Type | Set the technical protocol of the interface – see chapter Connector Types. |
Description | Add a description. |
Active | Set the connector active. You can see within the overview which connector is active. |
Timeout time (in seconds) | Set the time in seconds until the connector request will run. After the set timeout, the request will be discontinued. |
Result Type | Type of result from the connector request. It can either be a single result or multiple results (e.g. Array). |
Tags | You can add tags to your connector (e.g. the name of a project). |
You can add or select the login method for the specific backend systems. To select an existing login method, click on the corresponding field. It opens a drop down where you can select it.
If you want to create a new one, you can choose between using UserCredentials and SingleSignOn.
If you’d like to get an overview on your existing login methods and manage them, click on the “Logins” tab in the connector overview.
On the right side you can add data to your connector. Each connector has specific details that depend on the properties of the communication protocol. Read more on the following pages.
You can also copy an existing Connector. The complete configuration of the Connector, including its Connector Calls, is copied and created with the duplicate.
You can see which applications are using the connector. For that, click on the appropriate icon within the connector overview underneath ‘Actions’.
It opens a popup that displays all applications that uses the connector:
By clicking on an entry, the application opens so that you can edit it.
_______________________________________________
The logic of a business object is implemented via script templates/methods. Each business object can hold as many methods as wanted. Click on the ‘Edit methods’ icon to add some templates via the ‘+’.
Creating a script template involves writing a method via JavaScript and editing parameters. In the script editor you can code logic that can be called in the Process Designer.
The content corresponds to the inner body of a JavaScript function. In other words: your main code block must not be wrapped into a separate function definition but rests on the top level context. It’s nevertheless possible to define sub-functions on top of your main code block.
It’s best practice to wrap your main code block in a try-catch-block to handle possible errors.
In the toolbar above you have several possibilities: undo, redo, search, search and replace, format code, settings and fullscreen.
This example reads a name which is provided to the business object as an input parameter, compiles it into a greeting message and writes the result to the output.
Take a look at the try-catch-block surrounding the main code section:
If no error occurs, the upper part of the code inside the “try”-section will execute and return the greeting message and output.success = true. However, if any error occurs, the function will jump down into the “catch” section and return output.success = false and assign any details of the failure to attribute output.error.
In order to use the script template correctly, you have to add the same input and output parameters you used in the payload. Those parameters will be shown in the mapping dialogs in the Process Designer. Please note the correspondent handling of in- and output through the (JSON) objects “input” and “output”. Both of them may carry arbitrary attributes.
In this example the object “input” carries the attribute:
The “output” object carries the attributes:
Validate
You can validate the input and output parameter in the backend. It validates:
If the validation is not successful, the client is notified of all failed validations and it’s written to the business object log or system log at the same time.
For every new business object, this flag is set by default. Already existing business objects do not have this checkbox flagged to guarantee the compatibility.
*NOTE* You have the possibility to declare parameters as optional. When declaring a parameter as non-optional, the validation will fail if the parameter is not provided.
_______________________________________________
Business objects are managed under the module ‘Business Objects’. The main screen lists all existing business objects in table form. On the top left, you can switch between server-side and client-side business objects.
Press ‘+’ in the upper right corner to create a new one from scratch. This fires up the following screen:
First, choose a name for your client-side business object, e.g. ‘MyNewBusinessObject’ and set a description (optional). Add some tags, so you can search in the overviews and the UI Designer by the tags.
You may then select any connector, plugin, server-side business object, client-side business object or managed libraries on the left side. It opens a dialog where you can select it. Each selected item appears in the list below, from where you might also remove it again by clicking the delete icon underneath ‘Actions’.
When you’re done, leave the screen by hitting the ‘Save’ button and return to the overview page. Your new business object appears in the table.
You can see which applications or interfaces are using the business object. For that, click on the appropriate icon within the business object overview underneath ‘Actions’.
It opens a popup that displays all used applications:
By clicking on an entry, the application opens so that you can edit it directly.
You can access your input parameters via oPayload.<myInputParameter>.
To use the output parameters you have to return an object that has your parameters as properties. E.g.
return { myOutputParameter : myOutputValue }
As client-side Business Objects and their contents are called asynchronously, it may happen when a connector call is called that it is not yet finished and is returned undefined or null.
To avoid this, you must call fnSuccess instead.
fnSuccess ({ myOutputParameter : myOutputValue })
It must be called in your last callback/function of your client-side Business Object and returns the data.
In the case of an error, the following can be specified:
fnError ({ myErrorMessage : myErrorMessageValue })
_______________________________________________
Business objects are managed under the module ‘Business Objects’. The main screen lists all existing business objects in table form. On the top left you can switch between server-side and client-side business objects.
Press ‘+’ in the upper right corner to create a new one from scratch. This fires up the following screen:
You may then select any connector, plugin or other business objects you want to refer on the left side. It opens a dialog where you can select it. Each selected item appears in the list below, from where you might also remove it again by clicking the delete icon underneath ‚Actions‘.
When you’re done, leave the screen by hitting the ‘Save’ button and return to the overview page. Your new business object appears in the table.
You can see which applications or interfaces are using the business object. For that, click on the appropriate icon on the right.
It opens a popup that displays all used applications:
By clicking on an entry, the application opens so that you can edit it directly.
_______________________________________________
To create a new application, click on the Applications module.
Then click on the “+” button on the top right to create a new business app:
The following dialog will appear:
Fill out the necessary fields analog to the table below:
App-Type |
Choose UI5 as technology for your business app. For more information, see the chapter Basic Concept / Technology. |
App-Name |
Unique app name like “SmartMaintenance” |
App-Description |
A short description of your app |
Default Language |
Your default language for configuration – you can translate this language later via the language translation feature |
App-Transport-Name |
The name of the transport for transferring your configuration to another Simplifier instance like a quality assurance system |
After the app creation you can configure it with the following tabs:
![]() |
Configure the user interface and mark all necessary events to design your workflow. |
|
![]() |
Define your workflow with simple visual events and actions. |
_______________________________________________
To design your application, you can use CSS for styling with standard web cascading style sheets.
Warning: The syntax for accessing widgets by ID with CSS is: #<screenId>–<widgetId>
After changing CSS properties you have to deploy your application.
If you would like to learn more about CSS, take a look at the tutorials of the w3 schools or Codecademy.
_______________________________________________
Filepath and Filename to local .CSV File that should be written, relative to the current working directory of the application server. It is recommended to give an absolute path, so it doesn’t matter which directory is set as “Current Working Directory” from the appserver start script.
Delimiter
Delimiter of the columns that separates the values like comma or semicolon. This must be exactly one character, more than one character is not supported by the library.
**In order to use the tabulator character, the expression ‘\t’ can be used in the Admin UI.** If more than one character is specified, all but the first character will be discarded.
Charset
Character encoding used to read/write the file. If a charset is used that is unknown to the application server JVM, all read/write operations will fail.
Mode
Operation Mode of the Connector, either READ, WRITE or READ/WRITE – the CSV Connector can currently only read the referenced csv file.
Attention! Please make sure that the Simplifier application Server has the right permissions to access and read the file on the operating system level. |
Header
Activate the checkbox if the CSV File has a header in the first row.
Quote all Items
Activate the checkbox if all items should be quoted in terms of strings (“). Otherwise only values which contain the delimiter are put in quotes. This setting is irgnored when reading.
Go to CSV Connector Calls to configure the corresponding Calls.
_______________________________________________
Go to CSV Connector Details for more information about the CSV Connector.
A CSV Connector can be configured in 3 different modes:
* READ: The connector can only read from the specified CSV file path, no write operations are permitted.
* WRITE: The connector can only write to the CSV file, but not read from it.
* READ/WRITE: The connector can read from the file and also write to it.
The CSV Connector Call for a READ operation requires 2 Input parameters: “action” and “resultmode“.
To execute a read operation, call the Connector with the parameter “action” and the constant value “read“.
Reading Connectors get the result as JSON array of arrays by default. There can be definied two “resultmode“parameter:
The Connector returns everything if you use “/” as Output parameter.
_______________________________________________
The Documentation refers to the latest version of Simplifier (4.0). If you have an On-Premise installation and need help with an older version, please contact us via contact@simplifier.io, we are glad to support you.
In order to optimize the teamwork in the UI Designer, it is now possible to work on an application simultaneously with several users. The new AutoSave function ensures that no changes can get lost and that every user works with the latest version.
Like in version 3.5, user stories can be saved separately. In addition, the Simplifier indicates who is currently working in which user story to enable conflict-free working in the Process Designer.
UI Designer:
Read more »
Process Designer:
Read more »
To simplify the testing of interfaces (connectors) and business objects, there is now a test history. Input parameters and test results for the test procedures are stored and archived. Users can retrieve this information at any time and repeat the tests as required.
Connectors:
Read more »
Business Objects:
Read more »
To reduce the manual testing effort of applications, users can create automated tests by using the OPA5 technology. An absolute innovation in the low-code market is the connection to an automated German test cloud. This allows the app to be tested automatically on different browsers and operating systems*.
*paid feature
For a better traceability during the app creation, the app process documentation is now automatically generated in Markdown format. In addition, the last editor of applications and connectors is displayed.
For external user management systems and single sign-on scenarios, the Simplifier now supports even more authentication methods such as OAuth 2.0, SAML 2.0 and OpenID Connect. The connection to an existing LDAP, Active Directory or SAP system via SSO2 is still supported.
Open Authorization (OAuth):
Read more »
Security Assertion Markup Language (SAML):
Read more »
With version 4.0, the central log for the monitoring of Simplifier applications during runtime can be archived via the central settings.
To increase the user experience in the Simplifier, we have reworked the display views. This includes the Simplifier Dashboard and all list views of components.
In order to enable faster work, it is now also possible to switch directly to the edit mode of applications, connectors or business objects via usage lists.
It is possible to search for widgets in the screens within the UI Designer. In addition, users can use the arrow keys to navigate between the widgets.
The search function in the Process Designer displays all activities such as events, scripts, connectors and business objects.
UI Designer:
Read more »
Process Designer:
Read more »
To reduce the need for users to create code themselves in the future, it is now possible to iterate via data aggregation and nest conditions via an OR function.
We have enhanced the SOAP and SAP RFC connectors with query parameters, for example, to change the current language settings in the SAP backend system.
In addition, it is now possible to send messages to Simplifier user groups using the push connector. Parameters in SQL connectors can be used several times in the statement and foreign key dependencies can be created for SQLite connectors.
The user interface of the text templates was adapted to the Simplifier design and extended by transfer parameters analogous to the business objects.
It is furthermore possible to configuratively integrate templates in the Process Designer into the application workflow.
The SAP UI5 Theme Designer can be used seamlessly to create UI5 themes representing the corporate design that can be imported to Simplifier.
The Simplifier has been extended by several security features:
The Conferencing Plugin for real-time audio and video calls has been optimized.
Elements can be edited within the Data Workbench. Users also get more information about variables and auto fields at first glance, e.g. the exact data type.
In addition, we have added some attributes to the Auto-Field URL, such as protocol, port and source address.
For more information, have a look at Data Workbench and the following pages.
_______________________________________________
[vc_row row_type=”row” stretch_row_type=”no”][vc_column][vc_column_text]The Simplifier Cloud is hosted in data centers of T-Systems Germany.
The locations of the twin-core data centers are:
Lübecker Str. 2 39124 Magdeburg Germany |
Am Schiens 10-11 39221 Bördeland/Biere Germany |
[/vc_column_text][/vc_column][/vc_row][vc_row row_type=”row” stretch_row_type=”no”][vc_column][vc_gmaps link=”#E-8_JTNDaWZyYW1lJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZ3d3cuZ29vZ2xlLmNvbSUyRm1hcHMlMkZkJTJGdSUyRjAlMkZlbWJlZCUzRm1pZCUzRDF2YXJBRGVLbkpzYkQ0UW9ZX19FTWl5OUpLT0ZhcE5JdyUyMiUyMHdpZHRoJTNEJTIyNjQwJTIyJTIwaGVpZ2h0JTNEJTIyNDgwJTIyJTNFJTNDJTJGaWZyYW1lJTNF” title=”T-Systems data center”][/vc_column][/vc_row]
_______________________________________________
Connector | Asynchronous Connector | Business Object | Mapping Collections | Mapping Structs
Data Objects represent data sources and destinations, which can be triggered for execution. You can choose either a predefined connector (you can activate it to asynchronous) or a business object. |
Function | Description |
Asynchronous | If you select this option, the value helper assistant only offers asynchronous connectors. |
Value Helper | If you open the value helper, an assistant opens that guide you to your connector. |
Show Busy Indicator | You have the possibility to configure if the UI is blocked by the busy indicator, or can configure which element on your screen should be blocked by it. |
Input Mapping | You can map variables, auto fields, widget properties and constants to the input parameter of your connector. |
Output Mapping | You can map the output parameter of your connector to variables and properties. |
A typical example of a data object is a previously defined connector call. An assistant offers all configured connectors that own connector calls. You can search for the connector name or even the connector type. If you select a connector, all calls are listed on the right side. Choose the required Connector and the Call you want to execute. |
|
You have the possibility to configure if the complete UI should be blocked by the busy indicator, or which element(s) on your screen should be blocked by it. If you want to assign a connector call to a data object, you have to define the sources for the connector input (the request) and the destination for its output (the response). This is called the “Input Mapping” and “Output Mapping”: |
|
Clicking one of these two buttons opens a new pop up which allows you to connect widgets with the input or output attributes of a connector call. Independent of whether you’re defining the input or output mapping, you’ll always find the mapping sources in the left pane and the destinations on the right. If you define e.g. the input mapping, you’ll find the list of widgets in the left pane and the available connector call request parameters on the right. Within the output mapping dialog, the widgets are on the right pane, as they are the destination of the received data.In this example, the request of the selected connector call provides only a single input parameter, an ID field named “TechnischerPlatzId”. This input parameter is connected with the value of the widget “CustomerType”. This means, that once the data object is triggered, e.g. through a button press event, the connector will be called with the actual value of the widget “CustomerType” as the request parameter.You can choose the exact source that you want to use for the input parameter by double-clicking on the widget. It opens a list of all properties so you can choose the one you need as input. |
You can configure asynchronous connectors in the Process Designer. The configuration works as same as with the synchronous connector. | |
When setting a connector to asynchronous, the assistant only offers connectors with asynchronous interfaces (Push, MQTT and OPC/UA). |
It has two inputs “subscribe” and “unsubscribe” and one output.
subscribe | can be triggered with any output |
unsubscribe | can be triggered with any output |
output | will be triggered on any async. message the Data Object receives |
The input and output mapping of Business Objects works equivalent to the mapping of Connectors.
After selecting the right business object and the predefined script template, you can map the input and output parameters. |
Function | Description |
Client-side | You can choose between client-side and server-side business objects. Read more about client-side and server-side business objects. |
Value Helper | By opening the value helper, an assistant opens that takes you to your business object. |
Show Busy Indicator | You have the possibility to configure if the complete UI should be blocked by the busy indicator, or which element on your screen should be blocked by it. |
Input Mapping | You can map variables, auto fields, widget properties, and constants to the input parameter of your business object. |
Output Mapping | You can map the output parameter of your business object to variables and widget properties. |
The dialog shows all configured business objects that include methods. You can search for the name of the business object. By selecting a business object, all methods are listed on the right-hand side. |
Collections represent multiple results of Structs. For example, a database request may deliver a list of addresses from numerous people and you can map them to the equivalent widget within a data object.
Unfortunately, the input mapping of collections is not yet possible. Nevertheless, you can use the “Script” tile and map your data via code.
There is a general pattern you can follow and adapt it to your specific data. To map data to your table, you must have a predefined connector with at least one connector call.
Now click on the Script tile and edit the code.
Build an object.
Add payload to your object. If the input parameter of your connector call is filled in with an alias, you can add them as keys to your object.
Otherwise, you need an escape function.
Example:
payload[escape("soap/_-ITIZ_-OBJ_BUS2012_UPDATE/IT_PO_ITEMS(1)/QUANTITY")] = "X"
Add a global function call with the following Parameters:
The output mapping of a data object to a table, a list or a selected widget can be easily done in the Process Designer. Click on “Output Mapping” and add the output parameter (on the left) and your table widget (on the right) to the screen. Double click on each to select the items. |
All configured parameters have an indicator if it’s mandatory. If you haven’t mapped all input parameters of a data object that has been marked as mandatory, the following warning will appear: |
Structs describe a package of domain types. For example, the struct “address” contains different domain types like name, street, city, ZIP Code, etc.
You can map structs as input and output parameter within your data object or when using a UI action.
Example: In the example below, we want to use a business object that needs the information first name, last name, street and city as input parameter. Prior to our work in the Process Designer, we have created the struct data type “Person” that contains several domain types like “Firstname” and another struct which is called “Address”. |
|
Within the input mapping of our business object, we can assign the input fields with the equivalent data to the struct “Person” that the business object needs. By double-clicking on the struct you can choose exactly which parameter you want to select. Navigate higher or deeper in the struct by clicking on the arrows (e.g. to select the domain type “Street” within the struct “Address”). |
_______________________________________________
The module “Data Types” is the central way to define different types of data, structures and collection of Data Types and their validation rules.
Data Types are a way to ensure data are sent and received in the right type format to and from the backend systems.
With this feature, you can define data definitions to validate your data with client and server-side validation to prevent security issues and backend saving problems due to wrong data formats or hacker attacks.
Data Types can be assigned to widgets and connector calls to validate input and output data.
There are six Base Data Types defined in the Simplifier:
Date |
Date Format |
String |
Characters, numbers and any other symbols from the Unicode Character Set |
Boolean |
True or False |
Integer |
Positive and negative numbers like -2, -1, 0, 1, 2 … |
Float |
Numbers with precisions like 2,503 |
Any |
Accept all kind of Data Types even heterogeneous Arrays. |
With the “Data Types” tile, you are able to enhance the Base Types and define your own logic.
The new Data Types are split into three different types:
You can assign tags to Data Types to find them easily in the searchbar. Already existing tags are suggested including tags of widgets.
_______________________________________________
Custom Events | Global Variables | Global Auto Fields
Within the Data Workbench, it is possible to administer custom events, global variables and auto fields that you want to use cross-functional in the user stories. |
Custom events can be imagined as tunnels which connect different user stories or processes. By publishing an event, you open the entrance to the tunnel and by subscribing to this particular event, you create the exit of the tunnel. This enabled you to jump between the user stories and helps you to have a clearly laid out working space. To create a new custom event, click on the plus icon. Enter a name and then you can use it in the Process Designer. Go to Events for an example of using the custom event in the Process Designer. In this section, you can also find out how to create a custom event directly in the Process Designer. |
Use global variables as a container to buffer data, e.g. if a connector returns a lot of data and you would like to use some of it later in your work process, you can save the parameter as variables and map them later. | |
To create a new one, click on the plus icon. Enter a variable name, variable type and default value (optional). | |
You can also select, e.g. a struct as the variable type. | |
If you have selected a struct as a variable type and clicking on the value helper for the variable type, the dialog on the right appears. The dialog lists the fields of the ‘Machine’ struct on the left side like a tree. The struct is expanded to its first children so that the user can immediately see which are the fields of the parent node ‘Machine’. |
You get the information about the fields on the right panel to configure the default values.
In general, the fields have four different appearances depending on their own data type:
Data type | Appearance | Behavior/Usage |
String, Integer, Float | Input field with validation (depending on data type) | Values are written in the input field and saved on live change. |
Date | Date time picker | The date time picker dialog opens and the user is able to select the date and time. |
Boolean | Switch | The switch can be set to true or false. |
Collection, Struct | Link | By clicking on the link, you will be navigated to a complex data type in the left tree, that will also be selected automatically. |
By pressing the ‘lubricant’ link from the dialog above, there are also different appearances of the tree items depending on their datatype:
By adding a collection object, the item is inserted into the structure below the collection. The collection object can then be clicked like an ordinary tree element. The only difference is that a collection item can be removed using the delete button.
You can reference variables in data objects as in- or output parameter. To do so, drag a variable (that you’ve created previously in the Data Workbench) from the toolbar in the mapping dialog. |
Auto fields are automatically computed/filled fields. You can use them e.g. if you want to greet the user who is logged in with his actual name or load e.g. the version number. To create a new auto field, click on the plus icon in the Data Workbench. Enter a name for the auto field, the type, and the characteristic. It is possible to declare auto fields from five types:
|
Category | Characteristic | Description |
Application | Name | The name of the application. |
Version | The current version of the application. If the application is not yet released, it is stated as “n/a”. |
|
User | Name | The currently logged in user name. |
URL | Complete URL |
The complete URL: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
Origin |
The origin part: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Protocol |
The protocol part: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Host Name |
The host name: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Host and Port |
The host name with port number: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Port |
The port number part: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Path |
The path component: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Query Parameter |
The value of a selected query parameter: https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Hash/Page fragment |
The page fragment (URL part after the hash-symbol): https://academy.simplifier.io:443/doc/current-release/?search=help#8263 |
|
Geolocation | Longitude | The longitude of a place or city. |
Latitude | The latitude of a place or city. | |
Device | Online | Holds the current connection state. |
Mobile Client | Tells you if your application is running on the Cordova Client. | |
Screen orientation | The screen orientation is set. | |
Device Type | The auto field can hold these values: desktop, phone, tablet, watch and smartglass. |
In the overview, the type of the auto field is displayed underneath its name and the characteristic is displayed on the right-hand side.
To edit an auto field, use the edit icon. It opens the same dialog as creating the auto field, but of course, predefined with the data, you set before. If you no longer need an auto field, delete it by clicking the appropriate icon.
You can use auto fields within a data object. In this example, we created an auto field that automatically gets the user name. It is mapped with the input parameter ‘userName’ of a preconfigured business object. | |
We configured some more auto fields like “applicationVersion” or 2 URL parameter. The result is shown below: At first, you can see the former way of typing in the information by hand. On the second Screen, we used the Auto Fields and you get the information automatically, simply by clicking on the button.
|
_______________________________________________
To delete a template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateDelete | |
Input-Parameter | Name | Template name |
Output-Parameter | None |
Example input::
{
"name"
:
"templatename"
}
Example output:
{
"success"
:
true
}
_______________________________________________
Applications can be deployed rapidly and previewed within a standard web browser and on the mobile device using the Simplifier Mobile Client.
If you click on preview, it opens a new browser tab. Every time you will deploy your application, the browser tab will be reloaded automatically.
Warning: Make sure that pop-ups are not blocked in your browser for your Simplifier instance.
You can simulate your preview for different mobile devices with the Chrome Developer Tools or use it for debugging.
To access the DevTools, open your app preview in Google Chrome and press F12.
Alternatives:
Via the toggle device toolbar, you can simulate different devices like Galaxy S5, iPhone 6 or iPad to preview your application. More information on Google Chrome DevTools Device Mode.
_______________________________________________
A Simplifier application can be deployed in different ways. You can deploy to your local machine for development and testing, you can deploy to the Simplifier cloud, Cloud Foundry-based platforms, Azure, AWS, SAP Cloud, or a server you configured yourself.
![]() |
||
![]() |
![]() |
![]() |
Cloud installations are hosted and maintained by Simplifier AG. Each instance is reachable via a unique DNS name:
https://<instance-name>.simplifier.io
On-premise installations are hosted by our customers, on their own infrastructure. This scheme is especially useful if the Simplifier shall be integrated into a closed network infrastructure.
For Installation of the Simplifier, the following persons and things are required:
Use the following checkpoints for an successful installation
Checkpoint | Description |
![]() |
System-Requirements are clear |
![]() |
Domain-Name for Development, QA and Productive Systems are clear |
![]() |
SSL Certifcates for all 3 Instances is available |
![]() |
Firewallports 443 and 587 are open |
![]() |
Backendsystem is reachable via Supported Protocols |
_______________________________________________
The Simplifier is able to recognize the device type that is used by the application, so you can assign different functionalities to it, e.g. different designed login screens for mobile or wearable devices.
At first, you need to create a new auto field type with the auto field type “Device” and the characteristic “Device Type”. How to create auto fields, you can see here.
Within the Process Designer, you can refer to this auto field using a condition. Select the corresponding auto field and assign it to a constant (String).
Choose between:
Please pay attention to the lower case!
_______________________________________________
The Simplifier is also available on Docker Hub.
Create the directory which will host all external user-specific data:$ mkdir -p /home/simplifier/data
$ export SIMPLIFIER_DIR="/home/simplifier/data"
Install SSL certificates:$ mkdir -p $SIMPLIFIER_DIR/certs
$ cp <certificate.pem> SIMPLIFIER_DIR/certs/default.crt
$ cp <keyfile.pem> SIMPLIFIER_DIR/certs/default.key
Run docker:
Alternative 1: with SSL/Certificates$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:80 -p 443:443 -p 8090:8090 \
––name=simplifier simplifierag/onpremise:latest
Alternative 2: without SSL/Certificates$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \
-p 80:8080 -p 8090:8091 \
––name=simplifier simplifierag/onpremise:latest
_______________________________________________
Referenced to the official Docker instructions.
Note: This installation instructions is based on the example of the operating system Ubuntu 16.04 LTS.
$ sudo apt-get update
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
Use the following command to set up the stable repository. You always need the stable repository, even if you want to install builds from the edge or test repositories as well. To add the edge or test repository, add the word edge or test (or both) after the word stable in the commands below.
Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial. Sometimes, in a distribution like Linux Mint, you might have to change $(lsb_release -cs) to your parent Ubuntu distribution. For example, if you are using Linux Mint Rafaela, you could use trusty.
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
_______________________________________________
Docker for Mac is the Community Edition (CE) of Docker for MacOS. To download Docker for Mac, head to Docker Store.
README FIRST for Docker Toolbox and Docker Machine users
If you are already running Docker on your machine, first read Docker for Mac vs. Docker Toolbox to understand the impact of this installation on your existing setup, how to set your environment for Docker for Mac, and how the two products can coexist.
default
machine (if one exists) to the new Docker for Mac HyperKitVM. When you are running Docker for Mac, you do not need Docker Machine nodes running at all locally (or anywhere else). With Docker for Mac, you have a new, native virtualization system running (HyperKit) which takes the place of the VirtualBox system. To learn more, see Docker for Mac vs. Docker Toolbox.
sysctl kern.hv_support
Note: If your system does not satisfy these requirements, you can install Docker Toolbox, which uses Oracle VirtualBox instead of HyperKit.
Docker.dmg
to open the installer, then drag Moby the whale to the Applications folder.
Docker.app
in the Applications folder to start Docker. (In the example below, the Applications folder is in “grid” view mode.)
You are prompted to authorize Docker.app
with your system password after you launch it. Privileged access is needed to install networking components and links to the Docker apps.The whale in the top status bar indicates that Docker is running, and accessible from a terminal.If you just installed the app, you also get a success message with suggested next steps and a link to this documentation. Click the whale (
) in the status bar to dismiss this popup.
Congratulations! You are up and running with Docker for Mac.
_______________________________________________
Referenced to the official Docker instructions.
Note: This installation instructions is based on the example of the operating system Ubuntu 16.04 LTS.
$ sudo apt-get update
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) <docker@docker.com> sub 4096R/F273FCD8 2017-02-22
Use the following command to set up the stable repository. You always need the stable repository, even if you want to install builds from the edge or test repositories as well. To add the edge or test repository, add the word edge or test (or both) after the word stable in the commands below.
Note: The lsb_release -cs sub-command below returns the name of your Ubuntu distribution, such as xenial. Sometimes, in a distribution like Linux Mint, you might have to change $(lsb_release -cs) to your parent Ubuntu distribution. For example, if you are using Linux Mint Rafaela, you could use trusty.
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
_______________________________________________
Docker for Windows is the Community Edition (CE) of Docker for Microsoft Windows. To download Docker for Windows, head to Docker Store.
If your system does not meet the requirements to run Docker for Windows, you can install Docker Toolbox, which uses Oracle Virtual Box instead of Hyper-V.
docker-machine
(including the default
one typically created during Toolbox install) no longer start. These VMs cannot be used side-by-side with Docker for Windows. However, you can still use docker-machine
to manage remote VMs.Looking for information on using Windows containers?
Docker for Windows Installer.exe
), you can get it from download.docker.com. It typically downloads to your Downloads folder
, or you can run it from the recent downloads bar at the bottom of your web browser.Docker.app
with your system password during the install process. Privileged access is needed to install networking components, links to the Docker apps, and manage the Hyper-V VMs.Docker does not start automatically after installation. To start it, search for Docker, select Docker for Windows in the search results, and click it (or hit Enter).
When the whale in the status bar stays steady, Docker is up-and-running, and accessible from any terminal window.
If the whale is hidden in the Notifications area, click the up arrow on the taskbar to show it. To learn more, see Docker Settings.
If you just installed the app, you also get a popup success message with suggested next steps, and a link to this documentation.
When initialization is complete, select About Docker from the notification area icon to verify that you have the latest version.
Congratulations! You are up and running with Docker for Windows.
_______________________________________________
A Domain type represents a single Data Type that inherits from a Base Type like String, Integer, Float, Date etc. and can include different properties.
For example a ZIP Code is an inherited type of string with the property of a maximum of 5 chars length.
To create a new Domain Type click on the “+” button.
Enter a unique Name for the Domain Type and an optional Description.
Also select a Parenttype to inherit from by clicking on the appropriate field.
In the area below you can set the properties of your Data Type:
Min
Minimum length of a String, minimum number of a range, earliest date of a date range.
Max
Maximum length of a String, maximum number range, latest date of a date range.
RegEx
Regular expression to validate this Domain Type – for more information see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp.
Possible Values
Simple JSON Array of Strings repesenting literals of chosen Base Type.
Nullable
If activated, this value can be empty (null).
_______________________________________________
The options „Don’t overwrite“ and „Overwrite“ are going to import the data to your system.
By choosing “Don’t overwrite”, only new features are uploaded. Every feature with the same name like an existing one is skipped.
_______________________________________________
For each step in the development and update process of the Simplifier, an independent instance should be used.
Here we would like to give you an example for deploying a DQP system on three virtual machines.
_______________________________________________
A “Dry run” analyzes the content of the file and displays a list of all features.
It does not import the data so you can simply test how the transport would work out.
_______________________________________________
To edit a PDF template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateEdit | |
---|---|---|
Input-Parameter | Name | template name |
Data | New template content (Base64-coded) | |
Stylesheet | Content of the LESS Stylesheets (Base64-coded, optional) | |
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) | |
Output-Parameter | None |
{
"name"
:
"templatename"
,
"data"
: "SGFsbG8gV2VsdA==\",
"stylesheet: "
SGFsbG8gV2VsdA==\",
"previewJson"
: "SGFsbG8gV2VsdA==\"
}
{
"success"
: true
}
_______________________________________________
SMTP host
Hostname of SMTP Server
SMPT port
Port of SMTP server
SMTP authentication
If enabled, the client attempt to authenticate the user using the AUTH command. Default to false.
SMTP StartTLS
If activated, it enables the use of the STARTTLS command (if supported by the server) to switch the connection to a TLS-protected connection before issuing any login commands. Note that an appropriate trust store must configured, so that the client will trust the server’s certificate. Default to false.
Take a look at Email Connector Call.
_______________________________________________
The email connector call requires 3 input parameters to be defined:
receiver | The email address of the receiver. Several email addresses can be specified separated by a comma. | String |
subject | The subject of your message. | String |
msg | The message itself. | String |
All data types should be set as String.
There are 3 optional parameters that can be configured as well:
receiverCC | The email address of the copy receiver. Several email addresses can be specified separated by a comma. | String |
receiverBCC | The email address of the blind copy receiver. Several email addresses can be specified separated by a comma. | String |
sender | The email address of the sender. | String |
attachments | A list of all attachments. | List[ByteAttachment] |
{ "session": String, "fileName": String, "attachmentMimeType": String }
_______________________________________________
You can maintain enumeration for widget properties. Enumerated properties can only hold the defined values and will be displayed as a selection in the UI Designer.
In order to define the enumerations, you have to add them in an array notation to the default value of the property. It is not necessary to set the values in quotes.
There are different predefined types of buttons in OpenUI5. The properties can be maintained as a list in the widget mask. In our example, we look at all different button types in the OpenUi5 API Reference and transfer them into the widget edit mask with the appropriate syntax: [typ1, typ2].
_______________________________________________
Publish Custom Events | Subscribe to Custom Events
Each workflow in the Process Designer starts with an event.
Click on the Event element under “Activities” on the left pane and drag & drop it into the drawing area. | |
If you double click on the shape of the activity, the event selection assistant opens. You can also open it by clicking right underneath “Subscribe event” / “Publish event”. |
It guides you to your required event. When subscribing to an Event, you can select events from these categories: Widget Events, Screen Events, Custom Events and System Events. Each category is sorted and searchable.
If you want to use the Event in the User Story you are currently working in, select one of the Events under the tab “Subscribe Event”.
Event Type | Description |
Widget Events | Events that are available for certain widgets, e.g. button press event. |
Screen Events | Events related to screens, e.g. onInit and onAfterShow. |
Custom Events | Individual events within an application that can be published and subscribed at any time. |
System Events | Events related to devices, e.g. onDeviceGoesOffline and onOrientationChange. |
If you want to make an event usable in other user stories, create a new Custom Event under the tab “Publish Event”. | |
A shortcut for creating Custom Events can be found in the top right-hand corner. |
You can subscribe to a custom event in another user story to connect the logic between different user stories.
You have a process in User Story 1 that contains a condition to check if an input field is filled out after clicking on a “Login” button. Afterwards, the user should be navigated forward to the next screen.
Imagine you have the other user story exclusively for the whole navigation of your application. So you want the end of the event from User Story 1 (the navigation) subscribed to User Story 2.
Therefore we published the new Custom Event “LoginButton” in User Story 1 and subscribed to it in User Story 2.
User Story 1 | |
User Story 2 |
Custom Events can be maintained in the Data Workbench.
_______________________________________________
To demonstrate various features of Simplifier the following Example Apps are available with every Simplifier Freemium Instance and can be downloaded here
Appname | Description | Video |
---|---|---|
ITIZ_Example_SmartMaintenanceDashboard | The Smart Maintenance Dashboard is used for real-time monitoring of machine data. A color-coded indicator shows immediately whether a production line is outside the predefined threshold values. This enables a quick reaction. In the dashboard the user sees an overview of all machines assigned to him. For each machine he gets information about manufacturer and sensor data. The sensor data is displayed in the shape of a chart. In addition, the user can perform the following activities: Remote Service Call, Create notification in the SAP system and Detail view. |
Play Video |
ITIZ_Mobile_Example_SimplifierExplored | This application shows a selection of functions of the Simplifier (e.g. Toggle Light, Vibrate, Scan Barcode, Take a picture…) IMPORTANT: most functions can only be used on a mobile device. Please run this application in the Mobile Client. |
|
ITIZ_Template_OPCUA | In this application you can specify an OPC UA node. The sensor data will then be displayed in real-time. | Play Video |
ITIZ_Template_REST_ToDoList | In this application you can create different to-dos with subject, text and user. You can also edit or delete existing to-dos. This application is using a REST interface. | Play Video |
ITIZ_Template_SAPRFC_PurchaseOrder | With the Purchase Order Application, you can display the details of a purchase order and also change the quantity of existing items. | Play Video |
ITIZ_Template_SAPSOAP_FunctionalLocation | This application shows you the functional location of a machine. You get the information about the manufacturer, as well as details about the location with representation in a map. The machines are displayed in a structure list and it is possible, for example, to remove the equipment and install another one. | Play Video |
ITIZ_Template_SQL_ShoppingList | In this application you can add a product and the quantity to the shopping list. You have the possibility to delete existing values. | Play Video |
_______________________________________________
In this example, the data of the OData connector is displayed in a listitem. So the logic behind the application in the Process Designer may look like this:
First you subscribe to a screen event onAfterRendering. A business object is then addressed in order to read the user token of the logged in Simplifier user. Mapping takes place within the business object. The token is written to a variable that must be created in advance. You can find out how to do this here. The business object is necessary because the connector is addressed later in the script activity in the route and an authentication is necessary.
Finally, the script activity is used to set the model:
var oModel = new sap.ui.model.odata.ODataModel("/client/1.0/PATH" + this.getGlobals().getVar("token")); console.log(this.getGlobals().getVar("token")); oModel.read("/T_IOT_190603718A7C2818EE3D?", null, null, true, function(oData, response) { this.setItemModel("ID of the SCREEN", "ID of the WIDGET", "ITEMS", oData.results); }.bind(this));
In this case, it’s:
var oModel = new sap.ui.model.odata.ODataModel("/client/1.0/odata/ODATA_Procurement_Overview/?SimplifierToken=" + this.getGlobals().getVar("token")); console.log(this.getGlobals().getVar("token")); oModel.read("/T_IOT_190603718A7C2818EE3D?", null, null, true, function(oData, response) { this.setItemModel("Main", "Main_List1", "items", oData.results); }.bind(this));
_______________________________________________
You can use the execution log to trace the execution of e.g. connectors.
The following type of entries are logged:
Type | Description |
Open App | When the direct path to an app is opened (appDirect). |
Download App | When downloading the app to the client (user context is provided). |
Connector Execution | When using a connector directly, the execution and payload will be logged. |
Connector Call Execution | When a connector call is invoked. All parameters, even the constant parameters are logged. |
Business Object Execution | When using a business object, the payload and parameters are logged. |
Plugins | Plugins which are called by the old akka interface. |
Asynchronous Connectors | When subscribing and unsubscribing a connector. |
Job Execution | Every execution of the job. |
Any above | Any exception by executing an artefact above. |
_______________________________________________
See the full featured list of supported operating systems:
Browser | Android > 4.4+ | iOS > 10.x+ | Windows 10 | Hololens | |
Capture/Play Audio/Video |
◦ |
• |
• |
• |
◦ |
This plugin provides access to the device’s audio, image, and video capture capabilities. | |||||
Get Device Information |
◦ |
• |
• |
• |
◦ |
This plugin defines a global device object, which describes the device’s hardware and software. Although the object is in the global scope, it is not available until after the deviceready event. | |||||
Access Accelerometer |
◦ |
• |
• |
• |
◦ |
This plugin provides access to the device’s accelerometer. The accelerometer is a motion sensor that detects the change (delta) in movement relative to the current device orientation, in three dimensions along the x, y, and z axis. | |||||
Access Device Orientation |
• |
•5.0+ |
• |
• |
◦ |
Provides information about the physical orientation and motion of the device. | |||||
Access Compass |
• |
• |
• |
• |
• |
This plugin provides access to the device’s compass. The compass is a sensor that detects the direction or heading that the device is pointed, typically from the top of the device. It measures the heading in degrees from 0 to 359.99, where 0 is north. | |||||
Access file system |
• |
• |
• |
• |
• |
This plugin implements a File API allowing read/write access to files residing on the device. | |||||
Up-/Download Content |
• |
• |
• |
• |
◦ |
This plugin allows you to upload and download files. | |||||
Access GPS |
• |
• |
• |
• |
◦ |
This plugin provides information about the device’s location, such as latitude and longitude. | |||||
Get Network Information |
• |
• |
• |
• |
◦ |
This plugin provides an implementation of an old version of the Network Information API. It provides information about the device’s cellular and wifi connection, and whether the device has an internet connection. | |||||
Native Dialogues |
• |
• |
• |
• |
• |
This plugin provides access to some native dialog UI elements | |||||
Trigger / Handle Notifications |
◦ |
• |
• |
• |
◦ |
The essential purpose of local notifications is to enable an application to inform its users that it has something for them — for example, a message or an upcoming appointment — when the application isn’t running in the foreground. | |||||
Access/Configure Statusbar |
◦ |
• |
• |
◦ |
◦ |
This plugin enables the user to make changes to the status bar of a mobile device | |||||
Access Device Vibrator | Chrome Firefox |
• |
•Ignores the specified time and vibrates for a pre-set amount of time. |
•Max time is 5000ms (5s) and min time is 1ms |
◦ |
This plugin provides a way to vibrate the device. | |||||
Scan Barcodes |
• |
• |
• |
• |
◦ |
Scan many different kinds of barcodes. | |||||
Beacon Scanning |
◦ |
• |
• |
◦ |
◦ |
This plugin provides the functionality to use beacons with the iBeacon protocol. | |||||
Augmented Reality |
◦ |
• |
• |
◦ |
◦ |
This plugin provides augmented reality functionality by Wikitude. | |||||
Bluetooth |
◦ |
• |
• |
• |
◦ |
This plugin enables communication between a phone and Bluetooth Low Energy (BLE) peripherals. | |||||
PDF Viewer |
• |
• |
• |
• |
◦ |
View PDF files. | |||||
Toggle Flash |
• |
• |
• |
◦ |
◦ |
Toggle the flash light of the device. | |||||
Text to Speech |
• |
• |
• |
• |
◦ |
Text to Speech functionality. | |||||
Speech recognition |
◦ |
• |
• |
◦ |
◦ |
Speech to text. | |||||
Share with |
◦ |
• |
• |
• |
◦ |
This plugin allows you to use the native sharing window of your mobile device. | |||||
SQLite |
◦ |
• |
• |
• |
◦ |
Native interface to sqlite. | |||||
Fullscreen |
◦ |
• |
• |
◦ |
◦ |
Set your app fullscreen. | |||||
Battery Status |
◦ |
• |
• |
• |
◦ |
Get battery status and information. | |||||
Offline Work |
◦ |
• |
• |
◦ |
◦ |
Login and run your applications offline. | |||||
Remote Call |
• |
• |
• |
◦ |
•separate application required. |
Audio/Video communication. |
_______________________________________________
To fetch a PDF template, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateFetch | ||
---|---|---|---|
Input-Parameter | Name | Template name | |
Output-Parameter | Value | Template | HTML Template Content (Base64-coded) |
Stylesheet | Content of the LESS Stylesheets ((Base64-coded, optional) | ||
PreviewJson | Content of the sample data in JSON format (Base64-coded, optional) |
{
"name"
:
"templatename"
}
{
"success"
:
true,
"value": { "template": "SGFsbG8gV2VsdA==\", "stylesheet:"
SGFsbG8gV2VsdA==\"
"previewJson": "SGFsbG8gV2VsdA==\" } }
_______________________________________________
The Logs & Monitoring tile uses all search features of the backend (i.e. pagination or filtering).
On the left-hand side you can set filters.
You can choose between the following filters.
Filter | Function |
User | Filter for specific user actions |
Log Level |
Filters based on the severity of the message: INFO, WARNING, ERROR |
Category |
The categories as shown in the tabs: Customize, User, Execution, System, Mobile, Transport, File |
From | From Date |
Until | Until Date |
In the logs on the right-hand side, you can click a detail button, which will open further information.
_______________________________________________
A fully qualified domain name (FQDN) is sometimes also referred to as an absolute domain name.
Development | dev-yourcompany.simplifier.io |
Quality Assurance | qa-yourcompany.simplifier.io |
Productive | yourcompany.simplifier.io |
Development | dev-simplifier.yourcompany.com |
Quality Assurance | qa-simplifier.yourcompany.com |
Productive | simplifier.yourcompany.com |
_______________________________________________
Here you will find general instructions about Simplifier deployment:
_______________________________________________
We support you with on-premise installations of Simplifier. To do that, we deliver a prepared Docker image to you. The image comes pre-configured and contains all the required components, including a Simplifier server in its most recent version.
The target instance must fulfill the following requirements:
The Simplifier Windows Deployment is not recommend for production use, because of the limited support for container |
The Simplifier MacOS Deployment is not recommend for production use, because of the limited support for container |
To ensure high availability and qualified operations, it is necessary to build a three-stage system landscape (= DQP-landscape: development, quality, production). Please note that with a DQP-landscape the system requirements are tripled.
_______________________________________________
Simplifier is a low code platform for mapping business processes in integrated business and IoT applications and to interconnect internal and external IT infrastructures. Applications only need to be configured once to be available on any mobile device and operating system. Basically the functionality can be divided in two main categories:
Using state-of-the-art technologies, we accelerate your application creation. We have designed and built our platform in terms of logic and usability to accommodate the modern, agile development processes within companies. Due to the low-code approach, applications no longer need to be elaborately programmed but instead can be easily configured and integrated into any system. Thus, applications can be mapped process-oriented.
The main features of Simplifier can be accessed from the central Dashboard, that consists of the following parts:
Basically, creating an application with Simplifier can be divided into the following 5 steps:
_______________________________________________
Here you will find general and Simplifier specific abbreviations, technical terms and their meaning.
_______________________________________________
A group contains several users and could be used for workflow logic in business apps like informing a team via email or push notification about a certain event or task.
To create a new group, you have to specify a unique name and an optional description, e.g. for a team or special task force group.
To add users, click into the ‘Add User to Group’ Field and search for specific usernames. Mark (optional) several users and click OK to add them.
_______________________________________________
Start the Simplifier container:
$ docker start simplifier
Stop the Simplifier container:
$ docker stop simplifier
Restart the Simplifier container:
$ docker restart simplifier
Create a backup of the complete Simplifier data directory, e.g.
$ docker stop simplifier $ tar cvzf simplifier_backup.tar.gz /home/simplifier
In case of updates, we will prepare a new docker image for you, preserving your personal settings. Please download the image to a temporary directory of your choice (e.g. /tmp) and change into the directory. Finally unpack and load it, as described in steps 3-4 in the installation instruction.
To perform the update, proceed as follows:
Take care NOT to remove your data directory /home/simplifier/data !
$ docker stop simplifier $ docker rm simplifier $ docker run ––name simplifier {additional options as in step 6 before}
_______________________________________________
To fill your screen with UI elements like text fields, charts or action buttons, use the widget panel on the left side. First, search for a specific widget using the name or just browse the list, then add the widget to the screen via the plus icon. The widget will appear in the content area of the screen. |
Widgets can also be nested in a structured hierarchy – representing the positions within the document structure. For example, a table must have columns and rows – so the columns and rows have to be added nested underneath the table element. So in the first step, add the table to the existing screen. After that, select the table and then add columns. |
The column widget is now nested under the table widget.
You can also use the arrow keys to structure the widgets in the content area into a hierarchy, or alternatively use WASD on your keyboard.
W or![]() |
moves the widget upwards |
A or![]() |
de-nests the widget |
S or![]() |
moves the widget downwards |
D or![]() |
nests the widget underneath the one above (if possible) |
With the arrow keys on your keyboard, you can navigate through the content area as follows:
Up ↑ | Navigates up |
Down ↓ | Navigates down |
Right → | Opens the currently selected tree item (if possible) |
Left ← | Closes the currently selected tree item (if possible) |
You can copy Widgets and insert them on a different Screen or even another Application. For that, use the Copy, Cut and Paste function. |
Every widget has properties to configure how the widget behaves. In the following example the properties of a button widget are shown.
In this example, the text property represents the text shown on the button in the user interface. If you want to set an icon to a widget, use the following syntax: |
The data type of default properties in application items can now be overwritten, but only domain types with the same basic type can be used.
You can find the settings in the Properties panel of the UI Designer. The button opens a popover, which lets you define the data type and the validation event. If the validation is enabled (checkbox), an indicator will be displayed. You can change the valueState and valueStateText as result. In this example, we wanted to make sure, that the input field will be filled with the correct data, a ZIP Code. Therefore we added the validation for the predefined Datatype “ZIP” (a String with exactly 5 numbers) on the change Event. |
|
Now, if you open the application in the preview and type in anything else than 5 numbers, the valueState of the input field would change to “ERROR” and the valueState text “Wrong Input” is displayed. |
_______________________________________________
To import a file to your Simplifier instance click on the “Import Transport” tile. You will be forwarded to an import overview page.
Choose your file you want to import. If you select ‘Dry Run’, it simulates the import.
If the transport works correctly, you can import it with the option ‘Overwrite’. When certain artifacts already exist and you do not select ‘Overwrite’, only the new artifacts are transported.
_______________________________________________
To use the pdf Plugin, you have to configure it first.
Copy the file “settings.conf.dist” from the directory “plugins/pdfPlugin/src/main/resources”, save it as “settings.conf” and adjust it as follows:
In order to start the conversion, you need to install the program wkhtmltopdf on your operation system. The path to the wkhtmltopdf executable must be stated in the “settings.conf” file. Furthermore you need two folders, one to file your template and the other for the temporary data during the conversion. You can either use relative or absolute paths for the folders.
For example:
pdfPlugin { storageDir = "templates" tempDir = "tmp" wkhtmltopdf = "C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe" } ....
NOTE:
If you use wkhtmltopdf on a Linux without the X11 Server, the error “wkhtmltopdf: cannot connect to X server” may occur.
In this case you need to install the program “xvfb” via the package manager to simulate the X11 server.
Create a wrapper (e.g. /usr/local/bin/wkhtmltopdf-xvfb) for the “wkhtmltopdf” program and write the path in the PdfPlugin Config.
<#!/bin/bash> xvfb-run --server-args="-screen 0, 1024x768x24"/usr/bin/wkhtmltopdf$*
The Plugin is located in the directory: plugins/pdfPlugins. It can be activated with the SBT/Activator via a “run” command. The STDIN command “stop” ends the Plugin execution.
You can adapt the logback-configuration file “plugins/pdfPlugin/src/main/resources/logback.xml” to configure the log output or display it in another file.
_______________________________________________
We always prepare an all-in-one Docker image for our customers which contains all required components.
Given a target machine that matches the requirements described in the previous chapter, the installation is quite easy:
1. Create the directory which will host all external user-specific data:
$ mkdir -p /opt/simplifier/data $ export SIMPLIFIER_DIR="/opt/simplifier/data"
2.1 If your server has an Internet connection, you can get the Docker image from Docker Hub.
$ docker pull simplifierag/onpremise:latest # for the Onpremiseversion include MySQL and Nginx $ docker pull simplifierag/netzportal:latest # for the Netzportalversion with config files for your own Oracle DB
View the variants and their versions.
2.2 As an alternative we can provide a tarball for download. Copy the downloaded file with ending .tar.gz to a temporary directory on the target machine, e.g. /tmp and cd to this directory.
$ wget -O <filename>.tar.gz
Unpack the file in place:
$ tar xzvf <filename>.tar.gz
You will get two files: one readme.txt and the docker image with the ending .tar.
Inside the directory which contains the unpacked file, run the following commands as root- (super-) user:
$ docker load -i <imagefile.tar>
3. Install SSL certificates:
$ mkdir -p $SIMPLIFIER_DIR/certs $ cp <certificate.crt> $SIMPLIFIER_DIR/certs/default.crt $ cp <keyfile.key> $SIMPLIFIER_DIR/certs/default.key
4. Run docker image:
Alternative 1: with SSL/Certificates
$ docker run ––name simplifier -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ -d <Docker Tag>
Alternative 2: without SSL/Certificates
$ docker run ––name simplifier -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:8080 -p 8090:8091 \ -d <Docker Tag>
Replace the <Docker Tag> with the selected variant, e.g. simplifierag/onpremise:latest
5. Open your browser
Now use your browser at your Client Computer to access http(s)://<IP> or <FQDN>/UserInterface. The Simplifier will prompt a license dialog. After pasting that license
you can start configuring Apps in the AdminUI.
_______________________________________________
Sometimes it is necessary to add an extra library to your app, e.g. if you want to display some special charts. You can upload and manage those external libraries under the “Libraries” tab in the Application tile.
If you want to know how to implement them into your application, go to “Assigning Libraries To Apps”
In the list overview you get information about:
The Simplifier provides the following libraries by default:
App Technology | Library | Version | Type |
UI5 | OpenUI5 | 1.38.2 | Direct |
AngularJS | AngularJS | 1.4.7 | Direct |
Angular | Angular Material | 1.0.0-rc4 | Direct |
Angular | Angular-Fittext | 3.3.3 | Direct |
Angular | Angular-PDF-Viewer | 0.2.0 | Direct |
Angular | Angular-NVD3 | 1.0.4 | Direct |
Angular | jQuery | 1.11.1 | Dependency |
Angular | PDF.js | 1.0.925 | Dependency |
Angular | NVD3 | 1.8.1 | Dependency |
Angular 2 | Angular2 | 4.1.3 | Direct |
Angular 2 | Ionic | 3.4.2 | Dependency |
_______________________________________________
Parameter | Type | Description |
Handler | Function | Callback function, which is called after all scripts have been loaded completely. |
_______________________________________________
Parameter | Type | Description |
Handler | Function | Callback function, which is called immediately before the loading of the script begins. |
_______________________________________________
To integrate the library with a js code snippet, use the following parameter:
Parameter | Type | Description |
ScriptPath | String | Relative path in the uploaded ZIP structure to the .js file you want to include (e.g. src/js/includedScript.js). |
Name | String | Name of the library you can use to access the .js file (e.g. includedScript). By using “includedScript” in your script code you can now use all methods of your integrated library. |
Dependencies | Array<String> | Dependent scripts (refers to the parameter “name” of “addScript”.) It guarantees, that all dependencies are loaded beforehand. Use this if your library needs other libraries to work properly. |
It is important to ensure that all scripts specified under “dependencies” are either integrated into the same library, or a dependency is set on the library in which the script is integrated.
_______________________________________________
To integrate the library with a js code snippet, use the following parameter:
Parameter | Type | Description |
StyleURL | String | Relative path to the uploaded ZIP structure of the library. |
Name | String | Style name (optional). |
_______________________________________________
Below is a description of the Simplifier Mobile Client for iOS. After you have downloaded the Simplifier Mobile Client from the App Store, start it on your mobile device.
First you have to authenticate yourself on the login screen with your Simplifier username and password. Enter the instance you want to access. If the device has a fingerprint reader, you can choose to restore your password with it. You can save your login so you don’t have to re-enter it every time.
Since it is uncomfortably to type the instance, you can also use the QR code login. Read here how to create a corresponding QR code in the Simplifier.
Once you have successfully authenticated yourself, you are in the overview of installed applications. At the beginning, this overview is empty. At any time, you can log out by clicking on the logout button in the top left corner. At the top right, on the Simplifier icon, various information will be displayed.
To now use apps on your mobile device, switch to the screen Browse Apps. You now see an overview of all applications that are on the specified instance. To install apps, simply click on them. When the apps are downloaded, Installed will display a notification with the number of newly installed apps. You can delete installed application by swiping to the left.
If an app, that you have already installed, has been newly deployed on the instance, you will be informed about updates of the application.
At the bottom right, you will find an overview of all settings.
_______________________________________________
Our cloud infrastructure provider, T-Systems operates data networks for customers worldwide and processes data in its own data centers – data protection and data security have absolute priority. The ICT provider, therefore, has its services regularly audited by independent institutions and has itself certified that it complies with global standards and norms, for example through ISO certifications.
Here you will find an overview of the current certificates:
Certificate Description | Download |
Quality management according to DIN EN ISO 9001 | ISO 9001 |
Information security management according to ISO/IEC 27001 | ISO/IEC 27001 |
Business continuity management according to ISO 22301 | ISO 22301 |
Environmental management according to ISO 14001 | ISO 14001 |
Occupational health and safety management according to OHSAS 18001 | OHSAS 18001 |
Information security measures for cloud services according to ISO/IEC 27017 | ISO/IEC 27017 |
Protection of personal data in public clouds according to ISO/IEC 27018 | ISO/IEC 27018 |
Trusted cloud privacy profile for cloud services (TCDP) | Open Telekom Cloud |
Security of cloud service providers according to CSA CLOUD CONTROL MATRIX | CSA STAR |
Cloud service according to TÜV trust it requirements catalogue | Trusted Cloud Service |
Zero outage as a certified service process | Zero Outage |
Compliance management systems (CMS) according to IDW PS 980 | auditor’s certificate |
_______________________________________________
Jobs are server-side executed and recurring tasks which use business objects as logic. They can be found by clicking on the ‘Jobs’ tile on the dashboard.
They are used to automate business objects. The selected business object method will be executed by the Simplifier on a periodic basis. You may schedule the jobs in order to trigger them without further user intervention.
The red and green icons within the overview indicate whether the job is active. The red icons signify that it’s inactive and the green icons signify that it’s active.
To create a new job, you have to name it and set an interval after which the job is called in repeatedly. Selecting the business object and the function provides the job with functionality. Furthermore, you can choose the user who should execute the job (in case he has all permissions required). The active time zone on the server applies to all dates and time settings. You can choose between the 5 following intervals:
Interval
It’s a recurring interval at which the job is executed in the format <hh>:<mm>:<ss>. If the new execution overlaps with a previous run, it’s only started after it has been completed and after a further interval.
One Time
With this you can set an actual date <dd>.<MM>.<yyyy> and time <hh>:<mm>:<ss>.
If the selected time is in the past, the job will not be executed!
Daily
You can set a daily time in the format: <hour>:<minute>:<second>
Weekly
If you select this interval, it will be repeated every week. Set it in <hour>:<minute>:<second> and the appropriate day(s).
Monthly
Set this interval if you want that it’s repeated monthly. Set it in <hour>:<minute>:<second> and the day(s) within this month.
If the selected day doesn’t occur in this month, e.g. the 30th February, the job will not be executed in this month.
_______________________________________________
Applications can be localized easily by adding language files (.po-format) to the application. A fallback language has to be defined. At default the language will be set according to user’s environment, browser or device language.
For the translation of the individual applications, .po files are used in the Simplifier. Those can be viewed, downloaded and uploaded via the Language tab in the UI Designer.
To create a new translation file, you can download a template from this overview by clicking on the corresponding button.
The downloaded file can be edited in the text editor of your choice (e.g. Notepad ++ or POEditor). For more convenience, you can also use the online PO file editor.
Important: translatable values must be flagged within a widget in order for them to appear in the default language file!
In this template, all values marked as translatable in the widgets used are listed and can be translated into the target language.
This file can then be added via the Plus icon. You have to select the target language and the file you want to edit. In order to avoid cache problems, rename the file before uploading.
If the desired language is not available, please contact your administrator, as these are maintained in the server settings.
To change the language at runtime, the following script must be inserted in the Process Designer: sap.ui.getCore().getConfiguration().setLanguage(“en”), where “en” can be replaced by the desired abbreviation.
To start an application with a specific language, the URL of the following query parameters can be added:
?sap-language=en
_______________________________________________
Name | Defines the name of the authentication |
Mechanism | LDAP |
Priority | This defines the order in which the authentication mechanisms are processed |
Host name | This defines the IP/host of the authentication service |
Port | This defines the authentication port |
Base DN | This defines the domain name of the entry point |
You can test the connection by inserting a username and password.
_______________________________________________
You can assign different libraries to your application and get an overview on their dependencies.
Go to “Integration of external Libraries” for more details.
_______________________________________________
The Simplifier comes with the following plugins:
Plugin Name | Description |
keyValueStorePlugin | Offers a Key/Value Store Database based on Java MapDB |
pdfPlugin | Offers a PDF Template Designer and Generator based on wkthmltopdf |
contentRepoPlugin | Offers a Content Repository for saving and sharing documents in a folder hierarchy with own permission objects |
jsonStore | Offers a Database Plugin to save and read back customer information (and application data) from apps in json format. |
sessionPlugin | Offers a User-Session Plugin to save and manage User Session |
stepByStepGuidancePlugin | Offers a generator (like a wizard) to build simple apps consisting of one information (image, text, video) per screen and one of the predefined functions. |
captcha | Server-Side Generation of Captcha Images for the UI5 Captcha Widget |
You can find more plugins on the Marketplace.
_______________________________________________
To list your templates, you need the following parameter:
URL | /client/1.0/PLUGIN/pdfPlugin/adminTemplateList | |
Input-Parameter | None | |
Output-Parameter | Value | JSON-Array with all template names |
Example output:
{
"success"
:
true
,
"value"
: [
"templatename1"
,
"templatename2"
,
"templatename3"
]
}
_______________________________________________
You can debug your applications on the Simplifier in real time on mobile devices.
Enter chrome://inspect into your Chrome browser.
Connect your mobile device via USB and enable “USB Debugging” within the device settings. Chrome will autodiscovering your mobile device and integrating it within the developer tools options.
When connected, you can begin screencasting by clicking the appropriate button in the developer tools window. Then your mobile device can be supplied directly with input from your desktop screen. Any changes are instantly displayed on your mobile device.
By the way, the “Port forwarding” button above provides some flexibility for those who don’t have their screen and developer machine on the same network. In this scenario, you can create a TCP port on your mobile device and assign it to a specific TCP port on your development machine. All forwarded traffic is transferred via USB, bypassing the mobile device’s network configuration.
By clicking the “Toggle device toolbar” button, the current page is reduced to the imitated screen parameters according to the set properties. This imitated display can be operated with the mouse in the same way as with the finger on a physical device.
In this view, you can simulate pinch zooming, finger scrolling and even multi-touch events.
_______________________________________________
You can install the Docker engine on your local machine and start the Simplifier Docker for development and testing.
The Docker Engine runs on
![]() |
![]() |
![]() |
further Instructions to start the Simplifier
_______________________________________________
Choose the Connector Path:
You can choose between READ and WRITE.
{
"connectorName"
:
"WriteLoggingConnectorHandler"
,
"json"
: {
"msg"
:
"Test Log Konnektor umgeschrieben"
,
"logLvl"
:
"debug"
,
"logGroup"
:
"pickIt"
,
"deviceMac"
:
""
,
"timestamp"
: 1425293416
}
}
{
"connectorName"
:
"ReadLoggingConnectorHandler"
,
"json"
: {
"logGroup"
:
"pickIt"
,
"logLvl"
:
"debug"
}
}
_______________________________________________
Conditions give you the possibility to make the process flow dependent on the evaluation of certain expressions.
In such an expression, you can compare auto fields, variables, an actual value of a widget or a given constant with each other and decide upon the result, if the process continues one way or the other. Or you might decide to continue the process only if one condition holds and omit the alternative, which in turn results in a process stop at this stage.
If you double click on the shape, it will add a new condition. Alternatively, you can click on the plus icon on the right. By default, an AND condition is created. You can switch between AND and OR (not XOR) conditions using the toggle switch.
The process pane contains a condition, that’s executed after the login button got pressed. The condition compares a widget value (value property of widget InputUsername) with the fixed constant value “admin”. This means that the expression evaluates to true if the input value of field username equals “admin”. In this case, the process flow leads to navigate to screen “BusinessScreen”. If the username does not equal “admin”, the user will be navigated to the screen “PrivateScreen”.
Selecting a widget property for comparison is guided via a three-step dialog. It asks you to select the screen in the first step, then one of the widgets on this screen and finally the property of the widget that you like to use for the comparison. |
Defining a constant value for comparison is even easier: you specify the data type via a selection in a drop-down box and set the value in the field below. |
If you want to compare a variable, every existing one in the Data Workbench will be shown within the list. You can switch between the tabs Base Types, Domain Types, Structs, and Collections. |
You can select every generated auto field for comparison as well. |
An iterator is an object that sequentially passes data structures. It respectively returns the following element and determines if there are another elements following. With the Iterator activity, you iterate over a variable. It has two output ports: each and after. |
Port | Description |
each | For every iteration, the following process will be executed. |
after | After all iterations ended the following process will be executed. |
The Iterator Selection Helper can be accessed by opening the mapping dialog on the right. The mapping dialog can also be opened by double-clicking on the shape.
You can drag and drop the parameter in the drawing area in the middle. By double-clicking on the parameter you can select the collection you want to iterate.
The mapping dialog is aware of its type and offers only collection variables that are defined in the app. By opening the mapping dialog, you can drag and drop the element on the left and on the right in the middle. By double-clicking on it, you find all parameter/variables that can be mapped listed in a pop-up. |
The Script element allows you to integrate a custom JavaScript snippet. It is activated by the previous event. Drag the activity “Script” underneath “Logic” in the drawing area.
The activity “Script” shows a preview of the JavaScript full screen and its (optional) description on the right side. You can also enter code in this section, the changes were saved and also transferred in the full screen. The full screen will be opened by double-clicking on the shape or by clicking on the appropriate icon.
You can prettify JavaScript code with just one click. Therefore you have to have the script activity on full screen. By clicking on the appropriate icon, your code will be simply prettified.
_______________________________________________
The error log is the central logging and monitoring area where all data-streams and errors are logged and saved.
_______________________________________________
Each process step can be configured as a screen. A screen represents one single user interface page and can contain several widgets.
In the screen section you can do the following actions:
![]() |
Copy Screen |
Copy a screen and paste it into the actual or a different application. |
![]() |
Paste Screen |
Paste the previously copied screen into the current or a different application. |
![]() |
Edit Screen |
Activate the edit mode to change screen order or delete screens. |
![]() |
Add Screen |
Add a new screen to the actual application. |
To rename screens, select it and change the ID within the properties section on the right.
Use the ‘Description’ field to comment on the screen. This helps to identify the purpose of the screen later.
_______________________________________________
You can mark widgets as deprecated to prevent them from being displayed within the UI Designer.
For that, you have to go back to the application overview and switch to the widgets tab. Search for the appropriate widget and edit it. All you have to do now is to activate the toggle ‘Deprecated’ of the widget and click on save.
If deprecated is active, the widget will no longer be available on the left side of the UI Designer.
Deprecated widgets that were used before they were marked as deprecated, will still be shown within the application content. The application will also still be saved and deployed without issues or warnings and runs as before.
_______________________________________________
The marketplace module is central to the Simplifier Experience and Workflow. It does not only provide a variety of applications ready to import to your own account, but also any other type of module content such as Connectors, Virtual Connector packages, Business Objects, custom widgets and more.
To add any type of content to your own account, browse the marketplace and click “request” to send us an e-mail with all the information we need so we can provide the content to you.
In the future, this feature will be automated, so you can add content with one click.
_______________________________________________
Broker Name | The name of the broker. This is used by the Call to select the correct broker. |
Broker Hostname | Hostname of the broker IPv4 OR hostname! |
Port | The port, the broker is running on (1883 is standard for TCP and 8883 is standard for SSL). |
TLS | TLS Encryption. Not yet available! |
Keep-Alive | The number of seconds the client should be kept alive if no activity takes place. |
Clean-Session | Determines whether the session is cleaned after a reconnection. |
Last will topic | The topic for which a message is sent if the client dies (testament). |
Last will payload | The message for the testament. |
Last will retained | Flag to decide whether the message should be retained by the broker. |
Last will QoS (Quality of Service) |
Flag to decide how often the message will be sent. |
Allow multiple executions in reordering | If you send the “order” list to rearrange the given operations, you can decide with the flag whether operations should be executed several times. |
Continue after an exception | Flag to decide whether the next operation should be executed after an error or whether the execution completely stops. |
You can choose between 2 operations: PUBLISH and SUBSCRIBE.
Build the payload like this:
Parameter | Description |
---|---|
operationType | Type of the operation, PUBLISH or SUBSCRIBE. |
brokerName | The name of the broker, as it is specified in the Connector Details. If no name is given, the default broker is selected. |
returnSet (for SUBSCRIBE operations) | Option which information the incoming messages contain. “STANDARD”: Only the payload and the topic are displayed. “WITH_QUALITY_INFORMATION”: Equivalent to the “STANDARD” but additionally with information whether the message is duplicated / withheld and QoS. “VERBOSE”: As before but with Client ID as well as message ID. |
Parameter for the Object “clientInformation” |
|
clientId | The ID of the client. Since no two clients can connect with identical ID on the same broker, caution is advised. Dropping this parameter causes a random ID to be generated by the program. |
forceReconnection | Setting whether the client should reconnect. |
Parameter for the Object “messages” |
|
qos | The Quality of Service settings: “AT_LEAST_ONCE”, the message is sent at least once. “ONCE”, the message is sent exactly once. “AT_MOST_ONCE”, the message is sent 0 or 1 time. |
topic | The topic for which the message is published. |
retain | Setting whether to keep the message in the broker. |
payloadInformation | Meta information for the payload. ***Is not being used at the moment.*** |
payload | The payload as a String. |
If you want to publish 1 message:
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
}
]
}
]
If you want to publish n messages:
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
},
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic2"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation2"
,
"payload"
:
"PayloadB"
}
]
},
]
"operations"
: [
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
" AT_LEAST_ONCE "
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
}
]
},
{
"operationType"
:
"PUBLISH"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"client1"
,
"forceReconnection"
:
"true"
},
"messages"
: [
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation"
,
"payload"
:
"PayloadA"
},
{
"qos"
:
"AT_LEAST_ONCE"
,
"topic"
:
"myTopic2"
,
"retain"
:
"true"
,
"payloadInformation"
:
"JustMetaInformation2"
,
"payload"
:
"PayloadB"
}
]
}
]
If you want to subscribe for n topics:
{
"operationType"
:
"SUBSCRIBE"
,
"returnSet"
:
"VERBOSE"
,
"brokerName"
:
"testBroker"
,
"clientInformation"
: {
"clientId"
:
"clientSubscribe"
,
"forceReconnection"
:
"true"
},
"topics"
: [
"test"
,
"myFancyTopic"
]
}
_______________________________________________
To use other native mobile actions, you need to implement code via a Script activity.
With the Simplifier, you can build your application using web technologies like JavaScript.
If you want to use native functionalities, you need a bridge between those technologies. Therefore you can use pre-installed Cordova Plugins in the Simplifier Client and integrate different predefined APIs.
Here is a list of plugins to use and a link to their documentation on GitHub:
_______________________________________________
OData (Open Data Protocol) enables the creation of REST-based data services that allows resources identified by Uniform Resource Identifiers (URIs) and defined in a data model to be published and edited through the use of HTTP messages by Web clients.
It allows flexible access to the databases and to create, read, update and delete (CRUD) valid data on the web. OData is able to provide consistent semantics for data exchange in client-server communication.
Contrary to the other connectors, OData does not require any connector calls because the metadata is updated automatically.
Create a new connector and select OData as connector type. Within the specific data on the right, define the endpoint. Optionally, you can also define request headers to pass through and response headers to pass through.
You can read about how to use and address the connector in an application here.
_______________________________________________
You can react on losing connection of your application/device in the Process Designer. There are two default events added in every application: onDeviceGoesOnline and onDeviceGoesOffline. |
Event | Function |
onDeviceGoesOnline | Will be triggered when the device has established a connection to the Wi-Fi or LTE. |
onDeviceGoesOffline | Will be triggered when the device has lost the connection to Wi-Fi or LTE. |
The auto field type “Device” holds the current connection state – characteristic: online. How to create a new auto field, you can see here. | |
It can be used in every mapping and also in conditions. |
_______________________________________________
On Premise means that as a customer you run the Simplifier on your own servers. Whether this is a dedicated root server, a virtual machine in VM Ware or a cloud computing instance at a cloud provider like Amazon does not matter in this case.
You are responsible for the installation, operation, maintenance, updates of the Simplifier instance and guaranteed availability.
To learn how to deploy the Simplifier on-premises, look at the Checklist for onPremise installations.
_______________________________________________
This section describes the necessary parameters and data types for OPC-UA connector calls. There are 3 different kind of calls
NOTE: Please refer for the necessary data types here.
_______________________________________________
This section describes the nescessary collections as well as their meaning, required to use OPC-UA READ/WRITE connector calls.
Collections
_______________________________________________
After sending the subscription, the OPC-UA Connector will subscribe the given nodes for monitoring requests. Every change will be sent through the websocket to the client and can be received by the onMessage function, which has been described here,
Request JSON
var requestData = {
"operation": String,
"nodes": Array of String,
"namespaceIndices": Array of String,
"publishingInterval": Float,
"clientHandlingID": Integer,
"samplingInterval": Float,
"queueSize": Integer,
"discardOldestItem": Boolean,
"monitoringMode": String,
"returnedTimestamps": String
}
operation
The operation, which should be done by the asynchronous OPC-UA connector. Only the following options are valid at the moment.
nodes
The names of the nodes, which should be subscribed. The name is one of two parts, which defines a node Id.
NOTE: If more than one item should be subscribed with one request, then the amount of nodes must be the same as the amount of namespaceIndices.
namespaceIndices
The namespace indices where the nodes resides
NOTE: If more than one item should be subscribed with one request, then the amount of namespaceIndices must be the same as the amount of nodes.
publishingInterval
The interval, in which the OPC-UA server will publish the changes in the subscribed nodes. According to the queueSize all changes, which are still stored in the queue will be published. The used timeunit are milliseconds.
clientHandlingID
An internal unique handling key for the OPC-UA server to distinguish the monitoring subscriptions.
NOTE: Each request must have an unique clientHandlingID or else only message from the latest subscription will be returned.
samplingInterval
The interval in which the OPC-UA server will sample the subscribed nodes for changes. This parameter will be only used if SAMPLING is the chosen monitoringMode. The used timeunit are milliseconds.
queueSize
The size of the queue that logs all changes of the subscribed nodes. Each node has an own queue. If the queue is full and new changes occurs, then the oldest changes are discarded automatically.
discardOldestItem
If this option is selected, then the oldest entry in the queue of each subscribed node will be discarded regardless whether the queue is not full or not.
monitoringMode
The monitoring mode. The following two modes are available:
returnedTimestamps
This option decides what timestamps are returned in each message. The application server timestamp will be returned every time. For now the following options are allowed:
_______________________________________________
This section contains examples for the OPC-UA Monitoring Request Subscriptions
Attention The status code of a frame might return either “Good” or “Bad” if later case occurs, then also the OPC-UA Error Message will be returned! |
Request with Reporting Both Timestamps
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 2,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Both"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the latest 2 changes after 1 second. The returning message frame contains the application server, OPC-UA server and source timestamps. The oldest item will be dropped.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”bb827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828049″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”bb827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223423″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Source Timestamp
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":500.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 1,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Source"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last change after 500 milliseconds. The returning message frame contains the application server and source timestamps. The oldest item will be dropped but it does not matter, as the queue can contain only one element.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”aa827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”324234″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”aa827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”2333543″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUASourceTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Server Timestamp
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":2000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 20,
"discardOldestItem": false,
"monitoringMode": "Reporting",
"returnedTimestamps": "Server"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last 20 changes after 2 seconds. The returning message frame contains the application server and OPC-UA server timestamps. The oldest item will not be dropped.
Returning Message Frame
{
“frameType”:”data”,
“subscriptionKey”:”cc827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”4488280898″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”cc827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223425″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“OPCUAServerTime”:”Mon Jan 01 01:00:00 CET 1601″,
“statusCode”:”Good”},
“success”:true}
}
Request with Reporting Neither Timestamps
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":100.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 5,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Neither"
}
This request subscribes the nodes “myNode” and “myOtherNode” that resides in namespace 2 to the OPC-UA server, which will report the last 5 changes after 100 millieconds. The returning message frame contains only the application server timestamp. The oldest item will be dropped.
Returning Message Frames
{
“frameType”:”data”,
“subscriptionKey”:”dd827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828042″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
{
“frameType”:”data”,
“subscriptionKey”:”dd827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myOtherNode”,
“namespaceIndex”:2,
“value”:”22223421″,
“appServerTime”:”Wed Oct 19 19:37:43 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
Request with Sampling
var requestData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode"],
"namespaceIndices": [2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 100.0,
"queueSize": 10,
"discardOldestItem": true,
"monitoringMode": "Sampling",
"returnedTimestamps": "Neither"
}
This request subscribes the nodes “myNode” that resides in namespace 2 to the OPC-UA server, which will sample the node every 100 milliseconds and return the last 10 changes after 1 seconds. The returning message frame contains only the application server timestamp. The oldest item will be dropped.
Returning Message Frame
{
“frameType”:”data”,
“subscriptionKey”:”ff827118-f1b0-2170-9937-f8c7e1620107″,
“content”:{“data”:{
“nodeName”:”myNode”,
“namespaceIndex”:2,
“value”:”448828043″,
“appServerTime”:”Wed Oct 19 19:37:42 CEST 2016″,
“statusCode”:”Good”},
“success”:true}
}
_______________________________________________
Endpoint Port
The port of the OPC-UA server, this server should connect.
Timeout Time
Timeout Unit
Security Mode
Security Policy
Multiple Executions
If you reorder the operations in your code and want the possibility to do multiple executions, activate the switch.
Exceptions depending on status
Not implemented yet!
Permissions
Take a look at OPC-UA Connector Calls.
_______________________________________________
OAuth (Open Authorization) is an open standard for token-based authentication and authorization on the Internet.
To set OAuth as authentication, make sure you have administrator rights.
After you have logged in as usual in the login mask with your user credentials, click on your name in the upper right corner and then on the settings.
Switch to the Authentication tab in the upper toolbar.
To add a new authentication mechanism, click on the plus icon in the upper right corner.
First, fill out the following fields:
Name | Specify any name. |
Priority | 0 – The priority can be ignored in this case. |
Mechanism | Select OAuth 2.0. |
You can enable different types of OAuth 2.0 authentication mechanisms by applying the required data in a generic form. This allows using any OAuth 2.0 authorization service. On the subpages, you will find examples of authorizations with Google, Amazon and Azure.
Display Name | The display name is shown on the login button. |
Client ID | The client ID identifies the application and is defined by the configuration on the OAuth server. |
Client Secret | The client secret authenticates the application and is defined by the configuration on the OAuth server. |
Scope | The scope determines which rights are gained with the access token. E.g. ‘profile’, ’email’, etc. for gaining rights to access the user profile/user email. |
Authorization Endpoint | The authorization endpoint is the URL to which an authorization request is sent. |
Token Endpoint | The token endpoint is the URL to which an access token request is sent. |
Redirect Endpoint | The redirect endpoint is the URL to which the browser is directed after successful authorization. This URL needs to be entered in the OAuth server configuration. |
Additional Query Parameters | You can add additional query parameters, such as name and value. |
Icon | The icon will be displayed on the login mask above the display name. |
Profile URL | The URL to which a user profile request is sent. |
Profile Path | The path which points to the user profile. E.g. ‘.’, ‘profile’, etc. |
Profile Verb | GET, POST, PUT |
First Name | The path which points to the entry of the user profile containing the first name. E.g. ‘givenName’, ‘person.firstName’, etc. |
Last Name | The path which points to the entry of the user profile containing the last name. E.g. ‘surName’, ‘person.lastName’, etc. |
E-Mail Address | The path which points to the entry of the user profile containing the email address. E.g. ‘mail’, ’emails.0.value’, etc. |
Mobile Phone Number | The path which points to the entry of the user profile containing the mobile phone number. E.g. ‘phone’, ‘phones.mobile’, etc. |
The settings for OAuth 2.0 can be tested within the configuration. Since the test procedure includes several steps, it is necessary to save the settings first.
The assignment of an access token can be tested by pressing the ‘Test authentication’ button, while pressing the ‘Test profile extraction’ button initiates the complete OAuth 2.0 procedure, which assigns an access token and also collects a user profile with the required data.
_______________________________________________
By providing the Simplifier Image on Docker Hub, we enable deployment on various public clouds and structures, e.g. Container as a Service (CaaS) on Amazon Web Services (AWS), Google Container Engine (GKE), Azure, SAP Cloud Platform and IBM Bluemix.
![]() |
![]() |
![]() |
![]() |
![]() |
_______________________________________________
To see the active Plugins, click on the Plugin tile.
Every Plugin can be an own configuration app, that is visible in the upper menu bar.
You can see the following information in the table above:
PluginName
Technical name of the Plugin.
Connection URL
On what server runs the plugin and which tcp port does it use.
Configuration
If this plugin offers you a configuration user interface, the checkbox is activated and you can see them as tabs in the upper bar.
_______________________________________________
Be careful if you choose to overwrite the existing data. If you changed e.g. the properties of the widget “Button” and import a transport which contains the “old” button widget, your new changes will be overwritten. To avoid this, delete your existing application on the system and import your transport with the option “Don’t overwrite”!
_______________________________________________
[vc_row row_type=”row” stretch_row_type=”no”][vc_column][vc_column_text]
Wir werden Ihre Projekt-Registrierung prüfen und uns zeitnah bei Ihnen mit der Entscheidung zur Annahme oder Ablehnung melden.
Vielen Dank![/vc_column_text][vc_btn title=”Zurück zum Partnerportal” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fdoc%2Fpartnerportal%2F|title:Zur%C3%BCck%20zum%20Partnerportal||”][/vc_column][/vc_row]
_______________________________________________
[vc_row row_type=”row” stretch_row_type=”no”][vc_column][vc_tta_tabs active_section=”1″][vc_tta_section title=”Projekt Deal Registrierung” tab_id=”1536144032872-b57e2075-c785″]
[/vc_tta_section][vc_tta_section title=”Partner Programm Bibliothek” tab_id=”1498550130453-d394ac3c-8424″][vc_empty_space height=”20px”][vc_column_text]
[/vc_column_text][vc_btn title=”Allgemeine Lizenz- und Nutzungsbedingungen DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190214-Simplifier_Allgemeine%20Lizenz-und-Nutzungsbedingungen.pdf||target:%20_blank|”][vc_btn title=”Partner Guide DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190314_Simplifier-Partner-Guide.pdf||target:%20_blank|”][vc_btn title=”Vermittlungsprovision für Partner DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190314-Simplifier_Referral%20Fee_Vermittlungsprovision-f%C3%BCr-Partner.pdf||target:%20_blank|”][vc_btn title=”Partner Deal-Registrierung DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190314-Simplifier_Partner-Deal-Registrierung.pdf||target:%20_blank|”][vc_btn title=”Angebot – Get Ready Package DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190313-Simplifier_Partner-Get-Ready-Package.pdf||target:%20_blank|”][vc_btn title=”Geheimhaltungsvereinbarung NDA DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190401-Simplifier_Geheimhaltungsvereinbarung_NDA.pdf||target:%20_blank|”][vc_btn title=”Simplifier Partner Präsentation DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2F190404-Simplifier_Partner_Channel_Pr%C3%A4sentation.pdf||target:%20_blank|”][vc_column_text]
Bitte beachten Sie, dass sowohl die Vertragsvorlage als auch die aktuelle Preisliste nur auf Anfrage bei unserem Partner Manager erhältlich ist. Bitte wenden Sie sich diesbezüglich direkt an Tina Bosco. Vielen Dank
[/vc_column_text][vc_column_text]
[/vc_column_text][/vc_tta_section][vc_tta_section title=”Partner Sales Training” tab_id=”1536565869197-b9b6179a-f078″][vc_column_text]
Aus eigener Erfahrung wissen wir, wie wichtig es ist, gerade durch die Beratung, der Prozessoptimierung und vor allem innerhalb neuer Trendthemen, Kunden zu begeistern aber auch ein Stück weit mit viel Kompetenz und Fingerspitzengefühl den Bedarf zu evaluieren.
Im Rahmen Ihrer Partnerschaft und vor allem mit dem „Get Ready Package“ für Partner bieten wir Ihrem Unternehmen unter anderem und kostenlos die Möglichkeit einer entsprechenden Simplifier Sales und Pre-Sales Ausbildung. Das Package enthält noch weitere attraktive Bausteine für Sie bereit!
Beide Trainings sind webbasiert und bieten daher die Möglichkeiten mit maximaler Flexibilität, selbstständig den passenden Zeitpunkt zur Absolvierung einzuplanen.
Die Trainings sind inhaltlich aufeinander abgestimmt, so dass nach erfolgreichem Abschluss, unterschiedliche Dialoge zum Simplifier mit dem Kunden geführt werden können. Pre-Sales in Anlehnung daran, dem Kunden dann den Simplifier im Rahmen von Demo oder Websessions zu präsentieren.
Ein modularer und abwechslungsreich gestalteter Inhalt mit Videos, Statements, Erfahrungsaustausch unserer Kollegen aus eigenen Projekten sowie Beispielen von Business oder Use Cases runden die Trainings ab. Aber das sind nur Beispiele, wo der Simplifier zum Einsatz kommt! Denn Projekte sind mit dem Simplifier bereits heute so gut wie bei jedem Ihrer Kunden identifizierbar!
Darüber hinaus stellen wir sicher, dass das pragmatische Simplifier Lizenz- und Preismodell vermittelt wird, als auch die Themen Wartung & Support, Dienstleistung, Workshops, Hackathons uvm.
Bei erfolgreichem Abschluss stellen wir automatisiert ein personalisiertes Sales / Pre-Sales Zertifikat aus!
Beide Trainings sind somit Grundlage um schnell und eigenständig ertragreiches Simplifier Neugeschäft zu generieren und Ihren Dienstleistungsumsatz zu steigern!
Darüber hinaus erhalten Sie weitere Nachlässe auf ihren Basis-Nachlass, wenn Sie im Besitz von Sales und Pre-Sales Zertifikaten sind!
Module 1 | Simplifier Partner Sales Training |
Vorwort & Einleitung | |
Unit 1 | Vorwort & Einleitung |
Module 2 | Part I |
Christopher Bouveret zeigt Ihnen einen Überblick des Simplifiers und Low-Code Marktanalyse. | |
Unit 1 | Simplifier – Überblick & Low-Code Marktanalyse |
Unit 2 | Quiz |
Module 3 | Part II |
Dominik Meier spricht über die Lösungsplattform im Manufacturing Bereich. | |
Unit 1 | Einführungsvideo Manufacturing |
Unit 2 | Simplifier – Lösungsplattform Manufacturing |
Unit 3 | Quiz Manufacturing |
Module 4 | Part III |
Tim Deckmann spricht über die Lösungsplattform für Stadtwerke. | |
Unit 1 | Einführungsvideo Utilities |
Unit 2 | Simplifier – Lösungsplattform für Stadtwerke |
Unit 3 | Quiz Utilities |
Module 5 | Part IV |
Florian Rühl spricht über Lizenzierung, Pricing und Support. | |
Unit 1 | Simplifier – Lizenzierung | Pricing | Support |
Unit 2 | Quiz Lizenzierung | Pricing | Support |
Unit 3 | Summary Partner Sales Training |
[/vc_column_text][vc_column_text][/vc_column_text][/vc_tta_section][vc_tta_section title=”Partner Pre-Sales Training” tab_id=”1538637051896-5fde74f6-5ba6″][vc_column_text]
Aus eigener Erfahrung wissen wir, wie wichtig es ist, gerade durch die Beratung, der Prozessoptimierung und vor allem innerhalb neuer Trendthemen, Kunden zu begeistern aber auch ein Stück weit mit viel Kompetenz und Fingerspitzengefühl den Bedarf zu evaluieren.
Im Rahmen Ihrer Partnerschaft und vor allem mit dem „Get Ready Package“ für Partner bieten wir Ihrem Unternehmen unter anderem und kostenlos die Möglichkeit einer entsprechenden Simplifier Sales und Pre-Sales Ausbildung. Das Package enthält noch weitere attraktive Bausteine für Sie bereit!
Beide Trainings sind webbasiert und bieten daher die Möglichkeiten mit maximaler Flexibilität, selbstständig den passenden Zeitpunkt zur Absolvierung einzuplanen.
Die Trainings sind inhaltlich aufeinander abgestimmt, so dass nach erfolgreichem Abschluss, unterschiedliche Dialoge zum Simplifier mit dem Kunden geführt werden können. Pre-Sales in Anlehnung daran, dem Kunden dann den Simplifier im Rahmen von Demo oder Websessions zu präsentieren.
Ein modularer und abwechslungsreich gestalteter Inhalt mit Videos, Statements, Erfahrungsaustausch unserer Kollegen aus eigenen Projekten sowie Beispielen von Business oder Use Cases runden die Trainings ab. Aber das sind nur Beispiele, wo der Simplifier zum Einsatz kommt! Denn Projekte sind mit dem Simplifier bereits heute so gut wie bei jedem Ihrer Kunden identifizierbar!
Darüber hinaus stellen wir sicher, dass das pragmatische Simplifier Lizenz- und Preismodell vermittelt wird, als auch die Themen Wartung & Support, Dienstleistung, Workshops, Hackathons uvm.
Bei erfolgreichem Abschluss stellen wir automatisiert ein personalisiertes Sales / Pre-Sales Zertifikat aus!
Beide Trainings sind somit Grundlage um schnell und eigenständig ertragreiches Simplifier Neugeschäft zu generieren und Ihren Dienstleistungsumsatz zu steigern!
Darüber hinaus erhalten Sie weitere Nachlässe auf ihren Basis-Nachlass, wenn Sie im Besitz von Sales und Pre-Sales Zertifikaten sind!
Module 1 | Simplifier Partner Pre Sales Training |
Vorwort & Einleitung | |
Unit 1 | Vorwort & Einleitung DE |
Module 2 | Part I |
Christopher Bouveret zeigt Ihnen einen Überblick des Simplifiers und Low-Code Marktanalyse. | |
Unit 1 | Simplifier – Überblick & Low-Code Marktanalyse DE |
Module 3 | Part II – Tutorials |
Tutorials | |
Unit 1 | First Overview |
Unit 2 | Manage Settings |
Unit 3 | Create new user |
Unit 4 | Create new connector |
Unit 5 | Create connector call |
Unit 6 | Test a connector call |
Unit 7 | Create a new application |
Unit 8 | UI Designer overview |
Unit 9 | Create user story |
Unit 10 | Use data object |
Unit 11 | Mobile action |
Unit 12 | Create transport |
Unit 13 | Import transport |
Module 4 | Part III – Demo Applications |
Demo Apps | |
Unit 1 | Template: SAP-RFC Purchase Order |
Unit 2 | Template: REST ToDo List |
Unit 3 | Template: SQL Shopping List |
Unit 4 | Example: Smart Maintenance Dashboard |
Unit 5 | Template: OPCUA |
Unit 6 | Template: SOAP-SAP Functional Location |
Module 5 | Part IV |
quiz | |
Unit 1 | Quiz |
[/vc_column_text][vc_column_text][/vc_column_text][/vc_tta_section][vc_tta_section title=”Partner Marketing” tab_id=”1498550130366-b8935ce3-c654″][vc_empty_space height=”20px”][vc_column_text]
[/vc_column_text][vc_btn title=”Simplifier Logo transparent (PNG)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2FSimplifier-Logoschrift-web-300×1302.png||target:%20_blank|”][vc_btn title=”Simplifier Logo weißer Hintergrund (JPG)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2FSimplifier-Logoschrift-web-300×1302-white.jpg||target:%20_blank|”][vc_btn title=”Simplifier Logo weißer Hintergrund (PNG)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2Fpartner%2FSimplifier-Logoschrift-web-300×1302-white.png||target:%20_blank|”][vc_column_text]
[/vc_column_text][vc_btn title=”Brand Guidelines DE (PDF)” style=”flat” color=”sky” size=”lg” i_icon_fontawesome=”fa fa-file-pdf-o” add_icon=”true” link=”url:https%3A%2F%2Facademy.simplifier.io%2Fwp-content%2Fuploads%2F2017%2F04%2F170228-iTiZZiMO-Partner-Program-Brand-Guidelines-Final-DT.pdf||target:%20_blank|”][/vc_tta_section][/vc_tta_tabs][vc_raw_js]JTNDc2NyaXB0JTIwdHlwZSUzRCUyMnRleHQlMkZqYXZhc2NyaXB0JTIyJTNFJTBBZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciUyOCUyMCUyN3dwY2Y3bWFpbHNlbnQlMjclMkMlMjBmdW5jdGlvbiUyOCUyMGV2ZW50JTIwJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwbG9jYXRpb24lMjAlM0QlMjAlMjdodHRwcyUzQSUyRiUyRmFjYWRlbXkuc2ltcGxpZmllci5pbyUyRmRvY3VtZW50YXRpb24lMkZwYXJ0bmVycG9ydGFsJTJGcGFydG5lci1zdWNlc3MlMjclM0IlMEElN0QlMkMlMjBmYWxzZSUyMCUyOSUzQiUwQSUzQyUyRnNjcmlwdCUzRSUwQSUwQQ==[/vc_raw_js][/vc_column][/vc_row]
_______________________________________________
The PDF Plugin can be used to generate files with a fixed layout but dynamic values.
It is structured in such a way that you can create a new template for the PDF plugin on the left. Use the plus icon on the left. In the middle you see the content, which you can create according to your needs in HTML, CSS and JSON. On the right you will see a preview of your template.
_______________________________________________
The ownership concept provides that a user only can use artifacts, that were created by himself.
You have the possibility to share your own artifacts with other users. The permissions a user receives for a shared artifact has to be set by the admin.
_______________________________________________
Open developer plugin-Doc in new tab
_______________________________________________
Plugins extend the Simplifier core features in all manners. They are standalone programs that can contain
In short: Every time you are not able to configure logic, interfaces or ui elements within the Simplifier, you can do it with your own plugin.
Plugins are coded JAR Files that can be developed in the classic way like Eclipse, Netbeans or another Java IDE. The Plugins can be ran standalone and remotely and communicate with the Simplifier via akka message bus system over tcp. Every Plugin has its own port number and, if necessary, also its own ip addresses.
Plugins can be coded in any programming language, it’s only necessary that an HTTP interface will be provided.
_______________________________________________
this.callPlugin(pluginName, slot, payload, callback, showBusyIndicator, failonError, failCallback)
pluginName | the name of the plugin |
slot | slot (function, interface) within the plugin |
payload | a JSON object with the required parameters for the plugin |
callback | function, which is called after the successful execution of the plugin |
showBusyIndicator | boolean value that indicates whether the screen has to be blocked by a loading bar (true) or not (false) |
failonError | boolean value that indicates whether the plugin should be called in case of an error of the function passed via “failCallback” (false) or not (true) |
failCallback | function, which is called in case of an error in the plugin, is false for “failOnError” is passed |
_______________________________________________
For Simplifier Configuration & App Development within Simplifier Admin Interface we recommend using Google Chrome Browser.
click here to download
![]() |
Codecademy: Learn HTML |
![]() |
Codecademy: Learn CSS |
![]() |
Codecademy: Introduction to Javascript |
![]() |
_______________________________________________
Process Dashboard | Process Designer
The Process Designer allows defining process flows as the result of an event in an intuitive, graphical way. The Process Designer tab is located next to the UI Designer. By that, it follows the classic workflow of creating an application: First you design the screen of your application, followed by the definition of the workflow between these elements in the Process Designer.
By clicking on the Process Designer tab, you get to the Process Dashboard.
The Process Dashboard is divided into different user stories, which you can save individually, so it’s possible to work on it simultaneously with several people. After deploying the entire application in the UI Designer or Process Designer, all user stories are merged into one. If you save a user story in the Process Designer, the changes won’t be displayed in the preview as long as it is not deployed.
You can add a new story by dragging “Story” on the left into the middle. A pop-up appears to set a name, an external link and the link text for it and a story description. You can open multiple user stories at the same time. To switch between the user stories, simply switch between the tabs.
To edit or delete an existing user story, click on the equivalent icons. The stories are ordered alphabetically (or by number if you use them). It’s possible to sort the user stories in ascending or descending order. You can do this on the right with the appropriate icons.
By double-clicking on the whole tile or clicking on the edit icon, you will be forwarded to the Process Designer, where you can work on your user story.
If another user is editing the user story, it is displayed by a small avatar image of the user in the user story tile. By mouse over such an avatar image, a tooltip with the user’s login name is displayed. | |
Similarly, a small button in the upper left corner in the Process Designer itself displays users who are editing the same user story. The color of the button turns to red when another user starts editing the same user story. To view all editors, click on the button to open a pop-up. It displays the avatar screen and the user’s login name. The colors depend on the user’s login name, so each user is given an individual color. The list of editors will always be up to date so you will get an instant response when someone starts editing the same user story. |
You have the possibility to search within the Process Dashboard for occurrences of elements.
Therefore, switch between the live search for story names (frontend search) and the search for widgets, activities and data objects (backend search) in the Process Dashboard. While the search for story names continues to apply a live filter to the list of tiles, the search for widgets, activities and data objects need to be explicitly confirmed by pressing the search button or press enter.
Note: Auto fields cannot be found by name, but only by the expression they represent.
Live search for user story names | |
Search for activities |
As a result, all activities that match the search term are highlighted in green within Process Designer.
The main view of the Process Designer is split into three main sections:
For a better understanding of the application creation, use the Process Documentation. You can open it in the Process Dashboard as well as in the Process Designer itself. | |
It opens a dialog, that displays a textual documentation of the application process in Markdown format. |
The toolbar within the Process Designer gives you control of the appearance of your process.
Number | Function | Description |
1 | Grid resolution | This slider changes the size of the grid in combination with the “snap to grid” function (2), you have full control to properly align your process. |
2 | Snap to grid | When deactivating (click on the icon), you can freely move all activities. |
3 | Zoom | You can zoom out (left icon), zoom in (right icon) and reset the zoom with the icon in the middle. |
4 | Connection settings | You can choose between three types of connections:
|
5 | Delete | With this icon, the currently selected activities and connections will be deleted. |
You can cut, copy, paste and delete shapes within the Process Designer. Therefore you have to click on the appropriate icons on the top right of the canvas.
Cut | With the left icon, you can cut your selected shapes from the canvas. So the shapes including connections and mappings of the configured shapes were copied and dropped. | |
Copy | With the second icon from the left, you can copy the selected shapes including the connections and mappings from the canvas. | |
Paste | With the third icon from the left, you can paste your copied (or cut) shapes including all connections and mappings. They appear slightly offset from the copied or cut shapes. | |
Delete | With the right icon, you can delete your selected shapes. You can also do this with the delete key on your keyboard. |
If you have any errors in your process, you will receive feedback about that. Every error will be displayed within the process. The corresponding activity will be highlighted in red and a tooltip will be shown by hovering over it. |
_______________________________________________
With the Push Notification Connector, you are able to send a notification to all logged in users who have the selected role or are in the selected group on the Simplifier instance.
Select via the value helper the roles and/or the groups to which you want to send a message in the connector configuration mask. Unfortunately, a multi-select is not yet possible and you have to select several roles in succession.
To create the connector calls for this connector, take a look at Push Notification Connector Calls.
How to use a Push Connector in a REST-Client (e.g. the Advanced Rest-Client)
Step 1: You need a Token
Request Type: POST Content Type: application/json Payload: {"user":"<username>", "pass": "<password>"}
Returns: { "result": "someprettylongtoken", "success": true }
Step 2: Make a Connector request with this Token
XHR Type: POST Content Type: application/json Header: SimplifierToken Payload: { "connectorName" : "<connector_name>", "json": { "msg" : "<some_string>" } }
{ "connectorName" : "Push", "json": { "msg" : "test" } }
XHR Type: POST Content Type: application/json Header: SimplifierToken Payload: { "connectorName" : "<connector_name>", "json": { "msg": "{"order_id":"<NotificationMessage> <header> <message_id>1234567890</message_id><created>date_time</created> <request> <site>9999</site> // Asset Nr.<resource>Station_1</resource> // Ressource/ Workplace<order>variant_123</order> // Order-/ SFC Nr.<variant>variant_123</variant> // Variant Nr.<assy>assembly_123</assy> // Assembly Group Nr. <time>180</time> // Time allowance </request> </header> </NotificationMessage>"}" } }
Take a look at Push Notification Connector Calls.
_______________________________________________
The Push Notifiaction Connector Call requires only one input parameter to be defined:
Parameter Name | Data Type |
msg | String |
Parameter Name | Data Type |
msg | String |
_______________________________________________
The QR Login-Generator lets you generate your individual QR code for login purposes especially for wearable devices without a keyboard. You don’t need to type in your credentials anymore, just scan the QR code and you are logged in on your instance. Especially when using smart glasses, this feature is comfortable as it takes just a quick scan to enter Server URL, username and password without typing.
To generate such a QR code, go to the tile Users on the Simplifier dashboard and switch then to the tab QR Generator in the user overview.
You have to enter the required user with password and the Server URL. By default, this is already filled in. Generate the login code and now you can log in to other devices easily and quickly by scanning the QR code.
_______________________________________________
Call for READ operations (the name TIA_READ is the arbitrarily chosen name for this call)
For the READ Connector Call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameters: identifier and namespaceIndex). Furthermore, you can define the Identifier Type (optional) and the order of the operations in the code (optional).
operationType: Defines which operation you want to execute, in this case, “READ”.
Parameter Name: operations[0]/operationType
Constant Value: READ
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 Parameter:
order (optional): Order in which the actions should be performed.
This parameter changes the execution order of the specified READ commands e.g. if we have three READ commands. Command 1 reads from node x, command 2 reads from node y and command 3 from node z, the normal execution order would be: x, y, z.
By specifying the read order with numbers starting from 0 to the last command number subtracted by one (e.g. for three commands it would be 2), the execution will be changed according to the defined number.
For example, by adding “order”:[2,1,0] to your code, you switched the operations, so the read commands would be executed the following way. z, x, y.
NOTE: The specific commands are NOT defined here!
You can return all Output Parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected Output Parameter, use the following syntax:
Parameter Name: operationsResult/[0]/dataType/name (exemplary)
Data Type: depends on the Parameter you want to be returned.
For now, only the complete unformatted JSON will be returned.
_______________________________________________
To receive messages via the Process Dashboard, you need to perform the following steps:
Continue with script:
var lv_msg = data.data.msg;
data.data.msg must eventually be adapted to the output parameter specified in the connector call. lv_msg is the received message (type String, can be e.g. a JSON string, then parse to get object:
JSON.parse(data.data.msg)
It returns the object:
{propertyOne: 'abc', propertyTwo: 5}
Continue without script:
Use the output mapping to map received messages, e. g. to a widget or to save it in a variable.
_______________________________________________
Besides the creation of individual transports, there is a second approach to export your data to another system. By releasing your app after you finished your project or along the way for testing purpose. Every time you create a new application, a transport file will be generated automatically with your app’s name. It is advisable to update this Transport during your working process (add every feature you use). For releasing the app, your Transport has to be approved by an Admin in advance. If the approval was given, click on the “Release” button in the UI Designer to export your app. Next, you can add a release note. |
|
If your release was successful, you can see the current version of your app in the Application Overview. Click on the “Show Releases” Icon for an overview of the metadata and a direct download option. |
With this action button in the release overview, you will be redirected to the metadata dialog. Here you can insert additional information like requirements, compatible devices or add screenshots of the application. The metadata will be displayed in the Marketplace if you upload the app. You can maintain the metadata in German or English. |
Data | Description | |
Name | Name of the app (is set by Simplifier) | |
Version | Version of the release (is set by Simplifier) | |
Release Date | Date of the release (is set by Simplifier) | |
Languages | Languages defined in the app (is set by Simplifier) | |
Manufacturer | The Manufacturer | |
Compatible Simplifier Versions | Version of Simplifier on which the app is running | |
Compatible Devices | Compatibility to desktop/mobile/wearables |
![]() |
Data | Description |
Marketplace Title | The title of the app that is displayed in the Marketplace | |
Coverage | Scope of the app | |
Requirements | System requirements (like OPC/UA system) | |
Description | Description of the app | |
Icon | Application icon that is displayed in the Marketplace | |
Screenshots | Screenshots of the app (is displayed at the bottom) | |
Demo-Link | Oütional demo link to the app | |
Media-Link
|
Optional media link (e.g. an embedded YouTube link) |
Data | Description | |
Limited visibility | Triggers if the app is visible in the Marketplace or only available by a secret link | |
Template |
_______________________________________________
This section contains a description of all possible websocket requests for an asynchronous connector (For now only the subscription and unsubscription are documented).
Subscription Request
This request subscribes the websocket to an asynchronous connector and will receive messages from it.
var request = null;
request = {
"frameType": "subscribe",
"subscriptionKey":[requestUUID],
"json": [requestData]
};
Unsubscription Request
This request unsubscribes the websocket from an asynchronous connector and will not receive messages from it any more. Whether the connector stops working or not depends on the connector implementation.
var request = null;
request = {
"frameType": "unsubscribe",
"subscriptionKey": [requestUUID]
};
[requestUUID]
A unique String, which acts as the identification key.
An example key might be “bb827118-f1b0-2170-9937-f8c7e1620107”.
[requestData]
A Json object, which will be send to the respective connector. Examples can be found here and here.
_______________________________________________
(On-Premise Installation)
Remote Service applications demand some additional requirements, especially on the network side. To successfully establish a connection between two clients, e.g. the Remote Service Portal, running in the browser on a Desktop machine and the Remote Service Client running on a Smart Glass, they must either reside in the same network, or a STUN-/TURN-server must be used.
The minimum requirements for using a remote service application are:
_______________________________________________
The URL defines the REST endpoint.
_______________________________________________
When the connector is executed, it will only return a JSON as a result, if the content-type of the http result is “application/json”. In all other cases, the connector will return a JSON object with the following keys:
_______________________________________________
The Simplifier Server needs a typcial Reverse Proxy as standard setup.
The Reverse Proxy should provide the following services for a secure setup
Forwarded Ports:
Cross-Origin Resource Sharing (CORS) is a mechanism that uses additional HTTP headers to allow a user agent to access selected resources from a server located on a different origin (domain) than the currently used Web site. A user agent makes a cross-origin HTTP request when requesting a resource from another domain, protocol, or port than the one from which the current document originates.
The CORS mechanism supports secure cross-domain queries and data transfers between browsers and web servers. Modern browsers use CORS in an API container such as XMLHttpRequest or Fetch to minimize the risks of cross-origin HTTP requests.
Header name | Header value |
Access-Control-Allow-Origin | * |
Access-Control-Allow-Credentials | true |
Access-Control-Allow-Methods | GET, POST, PUT, DELETE, OPTIONS |
Access-Control-Allow-Headers | DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,SimplifierToken |
Header name | Header value |
Access-Control-Max-Age | 1728000 |
Response name | Response code |
Empty Content | 204, No proxy call required |
Location / Path | Description |
“^/genToken/$” | The Simplifier Authentification Service based on Tokens |
“^/assets/(.*)$” | The static assets like images , pdf files etc for an Application |
“^/client/(.*)$” | The Client REST API to access business objects, connector or plugins |
“^/library-managed/(.*)$” | Third Party Javascript Libraries that need for the HTML5 Applications |
“^/library-static/(.*)$” | Third Party Javascript Libraries that need for the HTML5 Applications |
“^/appDirect/(.*)$” | Hosting Path for the created HTML5 Applications |
“^/UserInterface/(.*)$” | Admin Backend Interface Application (should only accessible in a secure environment, internal network) |
“^/authentication/(.*)$” | External Authentication Provider for e.g. oAuth |
“^/passwordExpired/(.*)$” | Password Reset Page for Admin Interface |
“^/marketplace/(.*)$” | Simplifier Marketplace |
“^/develop/(.*)$” | Plugin Interface |
_______________________________________________
To use the RFC Connector Call with the operation EXECUTE, you have to configure the following input parameter in the Simplifier:
The second one is optional.
In this case: EXECUTE
Defines which parameters you pass – you can transfer imports, changings and tables and then fire the function.
Defines the return parameter.
The value is a list of the following values, but only one of them can be used at the same time.
Returns additional changing parameter to see if the tables have changed somehow when executing the function block (point of time is depending on the returnSet).
The value is a list of the following values, but only one of them can be used at the same time.
If you’ve set INPUT as returnInformation, the changing parameter before the function has been executed will be displayed.
If you’ve set OUTPUT as returnInformation, the changing parameter after the function has been executed will be displayed.
_______________________________________________
To use the RFC Connector Call with the operation GET, you have to configure the following input parameter in the Simplifier:
In this case: GET
Defines the exact information you want to return from the function block. Choose between:
With the following values (but the value may only appear once in the list, e.g. [import, template];[export])
Lists the complete structure (with SAP metadata) of the function block. Choose between:
Enter the value as a list. [STRUCTURE, METADATA]
Structure is the default.
_______________________________________________
The section Role Overview defines permissions for your users. Here you can configure roles that you can then apply to your users in order to permit or restrict certain actions, like administering applications and users or allow the use of special applications and restrict the use of others. Usually, there is one administrator-role that is allowed to use all features and functions of the Simplifier.
To create a new role , click on the plus icon to enter the create dialog. To add permission, use the selection helper on the right and choose the needed permission category. To enable or disable a single permission, click on the checkbox in the corresponding column. Finally, assign the role to existing users. Hit the save button to finish the role creation or the update.
Within the right tab you can add a user to the role. Use the selector for this.
_______________________________________________
Create the directory which will host all external user-specific data
For Linux and Mac
$ mkdir -p /home/simplifier/data $ export SIMPLIFIER_DIR="/home/simplifier/data"
For Windows, please replace “SIMPLIFIER_DIR” with an absolute path.
Example: “C:\Docker\Simplifer\Data”
Install SSL certificates:
$ mkdir -p SIMPLIFIER_DIR/certs $ cp <certificate.pem> SIMPLIFIER_DIR/certs/default.crt $ cp <keyfile.pem> SIMPLIFIER_DIR/certs/default.key
Run docker:
Alternative 1: with SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:80 -p 443:443 -p 8090:8090 \ ––name=simplifier simplifierag/onpremise:latest
Alternative 2: without SSL/Certificates
$ docker run -d -v $SIMPLIFIER_DIR:/opt/simplifier/data \ -p 80:8080 -p 8090:8091 \ ––name=simplifier simplifierag/onpremise:latest
Access Simplifier on localhost:
Now you can open the Simplifier in your browser.
http(s)://localhost/UserInterface
To avoid certificate errors, you can create a local host entry for your domain stored in the certificate for the HTTPS connection.
e.g. https://simplifier.<yourcompany>/UserInterface
_______________________________________________
Mandatory Information | Optional Information | Connection Pool | Host Information | Use External System (optional) | Settings | SAP Router (optional) | SNC Settings (optional)
The following parameters are mandatory:
Parameter | Description | Example | Mandatory | JCo Configuration Key |
System ID | Unique ID of the SAP System | ID4 | Yes | – |
System Number | SAP System instance number, maximum two digits | 80 | Yes |
jco.client.sysnr
|
Client Number | Number of the SAP Client, always three digits | 100 | Yes |
jco.client.client
|
Language | Default language of the SAP System that must have the language installed | en | Yes |
jco.client.lang
|
The following parameters are optional:
Parameter | Description | Example | Mandatory | JCo Configuration Key |
User name alias | Alias for the user name | RFCtest | No |
jco.client.alias_user
|
R3 system number | Number of the SAP R3 system | 80 | No |
jco.client.r3name
|
SAP system group | SAP system group | GRP | No |
jco.client.group
|
SAP Client Type | SAP internal value | Not Defined | No |
jco.client.type
|
Name | Description | SAP Internal Value |
Not Defined | It is never set in the configuration, it serves only as default value. | – |
R2 System | The R2 system. | 2 |
R3 System | The R3 system. | 3 |
External System | An external system. | E |
Parameter | Description | Mandatory | JCo Column Key |
Peak Limit | Peak Limit in [Milliseconds] | No |
jco.destination.peak_limit
|
Pool capacity | Pool capacity (default value is 1) | No |
jco.destination.pool_capacity
|
Expiration Time | Expiration Time in [Milliseconds] | No |
jco.destination.expiration_time
|
Expiration Period | Expiration Period in [Milliseconds] | No |
jco.destination.expiration_check_period
|
Maximum Client Get Time | Maximum Client Get Time in [Milliseconds] | No |
jco.destination.max_get_client_time
|
Please fill out either application server or gateway server hostname to define the endpoint to the SAP backend system.
Parameter | Description | Example | Mandatory | JCo Configuration Key |
Application Server Hostname | Application Server IPv4 address or hostname | 10.111.25.7 | Yes |
jco.client.ashost
|
(or) Message Server Hostname | Message Server IPv4 address or hostname | 10.111.29.0 | Yes |
jco.client.mshost
|
Gateway Service Hostname | Gateway Service IPv4 address or hostname | 10.101.26.0 | No | jco.client.gwserv |
Gateway Host Hostname | Gateway Host IPv4 address or hostname | 10.111.29.9 | No |
jco.client.gwhost
|
Parameter | Description | Mandatory | JCo Configuration Key |
Use external system | Activate the usage of an external system | No | – |
External Server | External Server IPv4 address or hostname | No |
jco.client.tphost
|
External Program | The external program ID | No |
jco.client.tpname
|
Activate the following settings as you need them.
A maximum of one router can be configured, so it is currently not possible to connect them in series.
Parameter | Description | Mandatory |
Use an SAP Router | Activate the use of an SAP Router | No |
Router name | The IPv4 address or hostname of the SAP router | Yes |
Use a default port | Activate the use of a default port | No |
Port | Port of Router (0-65535) | Yes |
Parameter | Description | Mandatory | JCo Configuration Key |
SNC Mode Active | Activates the SNC communication. SNC Parameters may be configured | Yes |
jco.client.snc_mode
|
SNC Name | The name of the SNC user that is used for the SNC communication | No |
jco.client.snc_myname
|
SNC Partner | The name of the SNC Communication Partner | Yes |
jco.client.snc_partnername
|
SNC-SSO Mode | Determines whether SSO attempts should be included in SNC communication | Yes |
jco.client.snc_sso
|
SNC Quality of Protection | The protection quality of the SNC communication determines which part of the communication is encrypted | Yes |
jco.client.snc_qop
|
Name | Description | SAP Internal Value |
Only Authentication | Minimum protection | 1 |
Integrity Protection on top of authentication | Authentication and integrity | 2 |
Privacy Protection on top of integrity protection and authentication | Maximum protection | 3 |
Default Protection | Use the value from snc/data_protection/use on the application server | 8 |
Maximum Protection | Use the value from snc/data_protection/max on the application server | 9 |
_______________________________________________
This section describes the necessary parameters and data types for RFC connector calls. There are two different kind of calls
_______________________________________________
_______________________________________________
Furthermore you can use the mechanism type RFC. It works on the same principle as SOAP. You can log on to the Simplifier via SAP and start connector calls with the SSO2 Token.
Name | Defines the name of the authentication |
Mechanism | SAP SSO |
Mechanism Type | RFC |
Priority | This defines the order in which the authentication mechanisms are processed |
SAP Server Type | The type of the SAP Server: Application Server, Gateway Service, Gateway Host, Message Server, Message Server Port |
Host name | This defines the IP/ Host of the authentication service |
SAP System ID | This defines the ID of the SAP System |
SAP System Number | This defines the number of the SAP System |
SAP System Language | This defines the language of the SAP System |
SAP Client Number | This defines the number of the SAP Client |
SAP Router Hostname | This defines the hostname of the SAP Router |
SAP Router Port | This defines the authentication port of the SAP Router |
Create profile regardless of received SSO-Token | If this switch is on, then the Simplifier will try to extract the profile. The used authentication method will be only: {Basic-Authentication}. If the username or password consists of non-alphanumerical symbols, then the authentication required for retrieving the user details might fail. |
Enforce default values for the profile extraction | If this switch is on, then all missing information in the profile will be replaced by default values. This will even happen when critical information, required for further extraction steps is missing. If this switch is off, then the extraction process will be terminated and an error will be returned. |
SAP Client Type | The type of the SAP Client: Not defined, R2, R3 or External |
|
You can assign an alias |
SAP R3 System Number | This defines the number of the SAP R3 System |
SAP System Group | This defines the group of the SAP System |
You can test the profile extraction and token retrieval as well as the whole chain seperately.
_______________________________________________
Using SAP SSO
You can use the SOAP service to authenticate via a SAP system and get a SSO2 Token for SAP SOAP webservices. The user synchronization is done by the iTiZZiMO own SAP RFC Module -ITIZ-_USER_READ or with a different SOAP-Webservice, which calls the standard SAP-Module BAPI_GET_USER_DETAIL.
Name | Defines the name of the authentication |
Mechanism | SAP SSO |
Mechanism Type | SOAP |
Priority | This defines the order in which the authentication mechanisms are processed |
Host name | This defines the IP/ Host of the authentication service |
Port | This defines the authentication port |
URI Type | This defines the URI Type (HTTP or HTTPS) |
WSDL Endpoint | This is composed of Host name, Port, URI Type and Client Number |
Client Number | This defines the SAP Client Number |
Ignore Invalid SSL Certificates | You can ignore invalid SSL Certificates |
|
You can set a timeout |
Operation Name | This defines the Operation name |
Binding Name | This defines the Binding name |
You can test the connection by inserting a Username and Password.
_______________________________________________
You can assign roles to apps, which is the first step in order to have anonymous logins.
All assigned roles to the app are imported and exported by the transport system. By default it is not allowed for anonymous users to execute data operations in the app.
Allowing anonymous users must be allowed with a conscious consent. For this you have to tick the checkbox besides “Allow anonymous users”. After that, the plus icon is available to assign a role.
You can also remove roles. All you have to do is click on the corresponding icon.
When disallowing anonymous users, all assigned roles will be removed.
When you navigate to an application, an authentication of the app for accessing an application token is triggered. All roles assigned to the app are linked to the application token. This feature allows anonymous users to e.g. execute connectors.
As a further security aspect, the app needs to provide a security functionality in order to obtain an application token.
_______________________________________________
SAML (Security Assertion Markup Language) is an Extensible Markup Language (XML) standard that allows users to log in to networked but separate websites with just a single login.
To set SAML 2.0 as authentication, make sure you have administrator rights.
After you have logged in as usual in the login mask with your user credentials, click on your name in the upper right corner and then on the settings.
Switch to the Authentication tab in the upper toolbar.
To add a new authentication mechanism, click on the plus icon in the upper right corner.
First, fill in the following fields:
Name | Specify any name. |
Priority | 0 – The priority can be ignored in this case. |
Mechanism | Select SAML 2.0. |
Fill in the Identity Provider Information:
Display Name | The display name is shown on the login button underneath the icon. |
Force authentication | If this option is enabled, the identity provider must authenticate the presenter directly and not rely on a previous security context. When both Force authentication and Passive are enabled, the identity provider must not re-authenticate the presenter unless the limitations of ‘Passive’ can be satisfied. |
Passive | If this option is set, the identity provider and the user agent themselves must not visibly take control of the requester’s user interface and interact with the presenter in a noticeable manner. |
Sign Assertions | If set, the assertion within the SAML response will be signed. |
Maximum lifetime |
Used to determine whether a user login is sent within a valid time period after the user’s last login. If so, the user is automatically logged in without having to re-enter a user name and password. |
Service Provider Entity-ID |
By default, the entity ID of your application (the server provider) corresponds to the callback URL. You can force your own entity ID by setting this parameter. |
IDP Metadata | XML that contains the configuration of your IDP (Identity Provider). For example, it contains the certificate for signing the communication. This file is usually distributed by your IDP. |
Icon | The icon is shown on the login button. |
Below the Identity Provider settings are the profile attributes that can be mapped within the Identity Provider. These attributes are synchronized in the user interface of the Simplifier.
First Name | Name of the parameter maintained in the IDP for the first name, e.g. ‘firstname’, ‘first_name’ etc. |
Last Name | Name of the parameter maintained in the IDP for the last name, e.g. ‘lastname’, ‘familyname’ etc. |
E-Mail Address | Name of the parameter maintained in the IDP for the mail address, e.g. ‘mail’, ’email’ etc. |
Mobile Phone Number | Name of the parameter maintained in the IDP for the mobile phone number, e.g. ‘mobile’, ‘phone’ etc. |
_______________________________________________
The following tables refer to the OWASP Top 10 Security Measures 2017 and explain the security measurements and relevant settings to avoid security flaws within the Simplifier platform.
A1: Injection |
Simplifier Prevention |
User supplied data is not validated, filtered or santizied by the application. | Double validation against data type definition (client and backend validation). |
Hostile data is used directly with dynamic queries or non-parameterized calls for the interpreter without context-aware escaping. | All connector calls are parameterized, including SQL queries. |
Hostile data is directly used or concatenated, so that the SQL or command contains both structure and hostile data in dynamic queries, commands, or in stored procedures. | All connector calls are parameterized, including SQL queries. |
A2: Broken Authentication |
Simplifier Prevention |
You may have authentication weakness if your application… | The Simplifier uses a token authentication. This token expires after x seconds (depends on the server security settings). |
Permits credential stuffing, where the attacker has a list of valid usernames and passwords. | The permission object view own user details prevents the application to access all user data. |
Permits brute force or other automated attacks. | We secure the authentication by deactivating the account after x times of failed logins. |
Permits default, weak or well-known passwords. |
The admin can secure the password by setting password rules in the Simplifier password settings. |
Uses weak or ineffectual credential recovery and forgot password processes, such as “knowledge-based answers”, which cannot be made safe. | Actual we provide an one-time link to reset the password via email, but no other security questions. |
Using plain text, encrypted, or weakly hashed passwords permits the rapid recovery of passwords using GPU crackers or brute force tools. | Our password does not exist in the database. We are using encrypted hashes via bcrypt algorithm. |
Has missing or ineffective multi-factor authentication. | We provide multi-factor authentication through OAuth 2.0 authentication method. |
A3: Sensitive Data Exposure |
Simplifier Prevention |
Data of a site is transmitted in clear text, internally or externally. | The Simplfier runs behind web proxy and all data is encrypted via HTTPS based on TLS 1.2 |
Sensitive data is stored in clear text, including backups. | The Simplfier doesn’t save personal data or sensitive data on its own database – we are using existing backend systems for that. |
Old or weak cryptographic algorithms are used either by default or in older code. | We rely on bcrypt. |
Default crypto keys are in use, weak crypto keys are generated or re-used, or proper key management or rotation is missing. | We rely on bcrypt. |
Encryption is not enforced, e.g. security policies or headers are missing. | If you use our provided reverse proxy template, this can not happen. |
A4: XML External Entities (XXE) |
Simplifier Prevention |
Your application accepts XML directly or XML uploads, especially from untrusted sources, or inserts untrusted data into XML documents, which is then parsed by an XML processor. | We only support XML formats with REST and SOAP connectors from trusted backend sources and no direct upload or data processing within an application. |
Any of the XML processors in the application or SOAP based web services has document type definitions (DTDs) enabled. | Yes, we parse WSDL and consider DTD if available and generate corresponding data type definitions within the Simplifier itself. |
If your application uses SOAP prior to version 1.2, it is likely susceptible to XXE attacks if XML entities are being passed to the SOAP framework. | We support SOAP version 1.2 |
SAST tools can help detect XXE in source code, although manual code review is the best alternative in large, complex apps with many integrations. | We only support XML formats with REST and SOAP connector from trusted backend sources and no direct upload or data processing within an application. |
Being vulnerable to XXE attacks likely means that you are vulnerable to other billion laughs denial-of-service attacks. | We only support XML formats with REST and SOAP connectors from trusted backend sources and no direct upload or data processing within an application. |
A5: Broken Access Control |
Simplifier Prevention |
Bypassing access control checks by modifying the URL, internal app state, or the HTML page, or simply using a custom API attack tool. | This can not happen because every API is secured by permission objects independent from the user interface itself. |
Allowing the primary key to be changed to another’s users record, such as viewing or editing someone else’s account. | This can not be happen because every API is secured by permission objects independent from the user interface itself. |
Elevation of privilege. Acting as a user without being logged in, or acting as an admin when logged in as a user. | The Simplifier authentication token is assigned to the client fingerprint that contains a lot of unique attributes like system configuration, browser version, screen resolution, browser plugins etc. If you use a foreign authentification token to gain privileges, you have to be on the same client system and using the same browser and user credentials – so it is very unlikely to misuse a foreign token. |
Metadata manipulation, such as replaying or tampering with a JWT access control token or a cookie or hidden field manipulated to elevate privileges. | The Simplifier authentication token is not stored in a cookie and is encrypted on the client with the client fingerprint. |
CORS misconfiguration allows unauthorized API access. | If you use our recommend reverse proxy example you will be safe in terms of CORS misconfiguration. |
Force browsing to authenticated pages as an unauthenticated user, or to privileged pages as a standard user or API not enforcing access controls for POST, PUT and DELETE. | All APIs are secured by permission objects. |
A6: Security Misconfiguration |
Simplifier Prevention |
Unnecessary features are enabled or installed. | Features are enabled via permission objects. |
Default accounts and their passwords are still enabled and unchanged. | Every single installation will get an automatically generated complex administrator password. We are not using default passwords. |
Does your error handling reveal stack traces or other overly informative error messages to users? | The logging and monitoring feature clears backend passwords out of the logs, so we will not include security related information within the logs. |
Old configurations are used with updated software which may not be backward compatible. | All configuration objects are automatically migrated to the newest release versions. |
Security settings in application servers, application frameworks, libraries, databases, etc. are not set to secure values. | In our cloud environment we are using very strong passwords. |
The server doesn’t send security directives to client agents or they are not set to secure values for web applications. | HSTS headers are set in the web reverse proxy. |
Any of your software is out of date. | Every customer is forced to upgrade once a year – older versions are supported via long term support that includes also security patches. |
A7: Cross-Site Scripting (XSS) |
Simplifier Prevention |
Reflected XSS: Your app or API includes unvalidated and unescaped user input as part of HTML output or there is no content security policy header. | We use the content security header. |
Stored XSS: Your app or API stores unsanitized user input that is viewed at a later time by another user or an administrator. | All API fields are validated against data type defintions to prevent unsanitised data. |
DOM XSS: JavaScript frameworks, single page apps, and APIs that dynamically include attacker-controllable data to a page are vulnerable to DOM XSS. | We provide encoding function also for JavaScript for HTML, URL, CSS and JavaScript. |
A8: Insecure Deserialization |
Simplifier Prevention |
The serialization mechanism allows for the creation of arbitrary data types, AND | We transform every data to JSON format with sanitize options. |
There are classes available to the application that can be chained together to change application behavior during or after deserialization, or unintended content can be used to influence application behavior, AND | We only accept valid JSON data. Each data object will be checked against API data definition by default. |
The application or API accepts and deserializes hostile objects supplied by an attacker, or an application uses serialized opaque client side state without appropriate tamper resistant controls. OR | We only accept valid JSON data. Each data object will be checked against API data definition by default. |
Security state sent to an untrusted client without some form of integrity control is likely vulnerable to deserialization. | Every client has to be authenticated to check if the client is trusted. |
A9: Using Components with Known Vulnerabilities |
Simplifier Prevention |
You don’t know the versions of all components you use (both client-side and server-side). This includes components you directly use as well as nested dependencies. | All depending libraries are checked against security exploits with VersionEye Service. |
Your software is out of date. This includes the OS, Web/App Server, DBMS, applications, APIs and all components, runtime environments and libraries. | All components are checked against update with VersionEye. |
You don’t know if they are vulnerable. Either if you don’t research for this information or if you don’t scan them for vulnerabilities on a regular base. | All components are checked against update with VersionEye. |
You don’t fix nor upgrade the underlying platform, frameworks and dependencies in a timely fashion. | We provide security hotfixes for the last 2 major releases (1 year). |
You don’t secure the components’ configurations. | We secured the complete configuration. |
A10: Insufficient Logging & Monitoring |
Simplifier Prevention |
Auditable events, such as logins, failed logins, and high value transactions are not logged. | Failed login attempts and valid logins are logged as such as every business object or connector call. No matter what kind of value this transaction is. |
Logs of applications and APIs are not monitored for suspicious activity. | All applications are monitored. |
Alerting thresholds and response escalation according to the risk of the data held by the application is not in place or effective. | Actual it is not possbile to alert security response teams or administrator via email after certain security events – this will be available in further releases. |
_______________________________________________
To send messages via the Process Dashboard, you need to take the following steps:
_______________________________________________
An object can be passed as a message by converting it into a JSON string:
JSON.stringify({propertyOne: 'abc', propertyTwo: 5}) var lo_payload = { 'msg:'<requested message>' }; function successCallback(po_result) { //Enter any code that will be executed in case of success } function errorCallback(po_result) { //Enter any code that will be executed in case of error } this.callConnector("<connector-name>", lo_payload, successCallback, true, true, errorCallback);
_______________________________________________
You can access all connectors you’ve previously assigned to your business object inside your script template.
Simplifier.Connector.<ConnectorName>(payload?: string|object): object
Example:
var connectorResult = Simplifier.Connector.MySoap({bindingName: "Binding", "operationName": "MyOp", "soap": {"foo": "bar"}});
Each call to a connector in a script template follows this convention:
Simplifier.Connector.<ConnectorName>.<CallName>(payload?: string|object): object
Example:
var connectorCallResult = Simplifier.Connector.MySoap.myCall({"Foo": "bar"});
_______________________________________________
You can call any other business objects in your current one in a similar way than calling a connector, using the following syntax:
Simplifier.BusinessObject.<BOName>.<MethodName>(payload?: string|object, parametrized?: boolean = true): object Simplifier.CurrentBusinessObject.<MethodName>(payload?: string|object, parametrized?: boolean = true): object
The payload has to be a stringified JSON object. The result of the business object method is a string and therefore it has to be parsed.
Example:
var otherMethodResult = Simplifier.BusinessObject.OtherBO.someMethod({"foo": "bar"}); var unparamtetrizedResult = Simplifier.BusinessObject.OtherBO.someMethod("{\"foo\": \"baz\"}", false); var sameBoResult = Simplifier.CurrentBusinessObject.someMethodOnSameBO({"baz": "baz"}); var noArgsResult = Simplifier.CurrentBusinessObject.methodWithoutArgs();
_______________________________________________
In order to call a plugin from your business object you need to add the plugin to your business object first (see Create Server Side Business Objects) and afterwards access it within a Business Object Function using this syntax:
Simplifier.Plugin.<PluginName>.<SlotName>(payload?: string|object): object
Example:
var repos = Simplifier.Plugin.contentRepoPlugin.listRepos(); var newRepo = Simplifier.Plugin.contentRepoPlugin.createRepo({name: "MyRepo"}); Simplifier.Plugin.contentRepoPlugin.updateRepo("{\"id\": 15}");
_______________________________________________
You can access any methods, like Logging, Utils/Tools, Email, Connectors, Business Objects, Plugins, Users, Permissions, Groups and Roles of Simplifier by using the Simplifier object.
Simplifier.Log.info | |
Creates a log entry with level INFO.
|
|
Input : (string) | Result: () |
message: string | – |
Simplifier.Log.info(message: string, details: string|object): void
Simplifier.Log.warn | |
Creates a log entry with level WARNING. | |
Input : (string) | Result: () |
message: string | – |
Simplifier.Log.warn(message: string, details: string|object): void
Simplifier.Log.error | |
Creates a log entry with level ERROR. | |
Input : (string) | Result: () |
message: string | – |
Simplifier.Log.error(message: string, details: string|object): void
Simplifier.Log.critical | |
Creates a log entry with level CRITICAL. | |
Input : (string) | Result: () |
message: string | – |
Simplifier.Log.critical(message: string, details: string|object): void
Simplifier.Log.debug | |
Creates a log entry with level DEBUG. | |
Input : (string) | Result: () |
message: string | – |
Simplifier.Log.debug(message: string, details: string|object): void
These examples apply to all log levels.
Simplifier.Log.warn("Test log entry"); Simplifier.Log.info("Test log entry with Details", "Details String"); Simplifier.Log.error("Test log entry with Details", {'key': 'value'}); Simplifier.Log.info("test", ["Array",1337,42.1,null,true, {key:"value"},[1,3,3,7]]) Simplifier.Log.critical("test", 1337) Simplifier.Log.debug("test", 42.1) Simplifier.Log.info("test", null) Simplifier.Log.warn("test", true)
Simplifier.Util.xml2json(xml: string): string Simplifier.Util.json2xml(json: string): string Simplifier.Util.xml2jsonValue(xml: string): object Simplifier.Util.jsonValue2xml(json: string): string Simplifier.Util.encodeBase64(string: string): string Simplifier.Util.decodeBase64(json: string): string
var encoded = Simplifier.Util.encodeBase64("String to encode"); var decoded = Simplifier.Util.decodeBase64(encoded);
output.jsonResult = Simplifier.Util.xml2jsonValue("<root><test>hello</test></root>"); output.stringResult = Simplifier.Util.xml2json("<root><test>hello</test></root>");
output.stringInput = Simplifier.Util.json2xml(JSON.stringify({test: "hello"})); output.jsonInput = Simplifier.Util.jsonValue2xml({test: "hello"});
Simplifier.Email.sendTemplateMail(payload: string|object): void
Simplifier.Email.sendTemplateMail({ templateNamespace: "MyNamespace", templateName: "MyTemplate", emailCharset: "UTF_8", emailMime: "text/html", receiver: "test@test.de", receiverCC: ["cc@test.de"], subject: "My Mail", "data": {"Var1": "Replacement1"} });
Simplifier.Connector.<ConnectorName>(payload?: string|object): object Simplifier.Connector.<ConnectorName>.<CallName>(payload?: string|object): object
var connectorResult = Simplifier.Connector.MySoap({bindingName: "Binding", "operationName": "MyOp", "soap": {"foo": "bar"}}); var connectorCallResult = Simplifier.Connector.MySoap.myCall({"Foo": "bar"});
Simplifier.BusinessObject.<BOName>.<MethodName>(payload?: string|object, parametrized?: boolean = true): object Simplifier.CurrentBusinessObject.<MethodName>(payload?: string|object, parametrized?: boolean = true): object (--> BOName = Currently executed Business Object)
var otherMethodResult = Simplifier.BusinessObject.OtherBO.someMethod({"foo": "bar"}); var unparamtetrizedResult = Simplifier.BusinessObject.OtherBO.someMethod("{\"foo\": \"baz\"}", false); var sameBoResult = Simplifier.CurrentBusinessObject.someMethodOnSameBO({"baz": "baz"}); var noArgsResult = Simplifier.CurrentBusinessObject.methodWithoutArgs();
Simplifier.Plugin.<PluginName>.<SlotName>(payload?: string|object): object
var repos = Simplifier.Plugin.contentRepoPlugin.listRepos(); var newRepo = Simplifier.Plugin.contentRepoPlugin.createRepo({name: "MyRepo"}); Simplifier.Plugin.contentRepoPlugin.updateRepo("{\"id\": 15}");
Simplifier.User.getAll | |
Retrieves all created users.
|
|
Input : () | Result: Array(object) |
– | [id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}]?] |
Simplifier.User.getById | ||
Retrieves the user with the given id. | ||
Input: (number) | Result: object|null | |
id: number | id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] | null |
Simplifier.User.getByName | ||
Retrieves the user with the given login name. | ||
Input: (string) | Result: object|null | |
loginName: string | id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] | null |
Simplifier.User.getCurrentUser | ||
Retrieves the currently logged in user. | ||
Input: () | Result: object|null | |
– | id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] | null |
Simplifier.User.create | |
Creates a new user. | |
Input: (object) | Result: object |
login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [String]?, groups: [Number]?, attributes: [{ name: String, category: String, value: String, description: String? }]? |
id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] |
Simplifier.User.update | |
Updates a user identified by the assigned id. | |
Input: (number, object) | Result: object |
id:Number | id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] |
login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [String]?, groups: [Number]?, attributes: [{ name: String, category: String, value: String, description: String? }]? |
Simplifier.User.update | |
Updates a user identified by the assigned login name. | |
Input: (string, object) | Result: object |
login: String | id: Number, login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [{ id: String, name: String, description: String, active: Boolean}]?, groups: [{id: Number, name: String, description: String}]?, attributes: [{name: String, category: String, value: String, description: String?}] |
login: String, firstName: String, lastName: String, email: String, mobileNumber: String?, activeFrom: String?, activeTill: String?, active: Boolean?, salutation: String?, roles: [String]?, groups: [Number]?, attributes: [{ name: String, category: String, value: String, description: String? }]? |
Simplifier.User.delete | |
Deletes a user identified by the assigned id. | |
Input: (number) | Result: () |
id: Number |
– |
Simplifier.User.checkLogin | |
Checks whether a user can login providing the given credentials. | |
Input: (string, string) | Result: (boolean) |
login: string password: string |
true, false |
Simplifier.User.assignRole | |
Assigns the role with the given ID to the user, identified by the given login name. | |
Input: (string, string) | Result: () |
loginName: string roleId: string |
– |
Simplifier.User.assignRole | |
Assigns the role with the given ID to the user, identified by the given login name. | |
Input: (number, string) | Result: () |
id: number roleId: string |
– |
Simplifier.User.unassignRole | |
Dissolves the user-role relation of the given user and role. | |
Input: (string, string) | Result: () |
loginName: string roleId: string |
– |
Simplifier.User.unassignRole | |
Dissolves the user-role relation of the given user and role. | |
Input: (number, string) | Result: () |
id: number roleId: string |
– |
Simplifier.User.assignGroup | |
Assigns the group with the given ID to the user, identified by the given login name. | |
Input: (string, number) | Result: () |
loginName: string groupId: number |
– |
Simplifier.User.assignGroup | |
Assigns the group with the given ID to the user, identified by the given login name. | |
Input: (number, number) | Result: () |
id: number groupId: number |
– |
Simplifier.User.unassignGroup | |
Dissolves the user-group relation of the given user and group. | |
Input: (string, number) | Result: () |
loginName: string groupId: number |
– |
Simplifier.User.unassignGroup | |
Dissolves the user-group relation of the given user and group. | |
Input: (number, number) | Result: () |
id: number groupId: number |
– |
Simplifier.User.getAttribute | |
Retrieves the attribute with the given name and category of a user identified by the user’s ID. | |
Input: (number, string, string) | Result: (object | null) |
id: number name: string category: string |
name: string category: string value: string description: string?| null |
Simplifier.User.getAttribute | |
Retrieves the attribute with the given name and category of a user identified by the user’s ID. | |
Input: (string, string, string) | Result: (object | null) |
loginName: string name: string category: string |
name: string category: string value: string description: string?| null |
Simplifier.User.getAttributes | |
Retrieves all attributes of the user identified by the given ID. | |
Input: (string) | Result: Array (object) |
loginName: string |
[name: string category: string value: string description: string?] |
Simplifier.User.getAttributes | |
Retrieves all attributes of the user identified by the given ID. | |
Input: (number) | Result: Array (object) |
id: number
|
[name: string category: string value: string description: string?] |
Simplifier.User.setAttribute(id: number, name: string, category: string, value?: string|null = null): void Simplifier.User.setAttribute(loginName: string, name: string, category: string, value?: string|null = null): void Simplifier.User.resetPasswordWithEmailTemplate(id: number, emailData: object|string): void Simplifier.User.resetPasswordWithEmailTemplate(loginName: string, emailData: object|string): void Simplifier.User.setPassword(oneTimeHash: string, newPassword: string): void
Simplifier.Permission.checkPermission(permissionName: string, characteristic: string): boolean Simplifier.Permission.checkPermissionCharacteristic(permissionName: string, characteristic: string, characteristicValue: string): boolean
Simplifier.Group.getAll(): Array<object> Simplifier.Group.getById(id: number): object|null Simplifier.Group.create(data: object|string): object Simplifier.Group.update(id: number, data: object|string): object Simplifier.Group.delete(id: number): void Simplifier.Group.getUsersByGroup(id: number): Array<object>
Simplifier.Role.getAll(): Array<object> Simplifier.Role.getById(id: string): object|null Simplifier.Role.getByName(id: string): object|null Simplifier.Role.create(data: object|string): object Simplifier.Role.update(id: string, data: object|string): object Simplifier.Role.delete(id: string): void Simplifier.Role.getUsersByRole(id: string): Array<object>
It is possible to make use of the NumeralJS API in server-side business objects.
The API can be found here.
_______________________________________________
As a user that is defined as an admin by the corresponding role, you can hit the settings button by clicking on your user profile name on the top right corner. Within the settings panel, you can define several settings: Server, Password, License, Authentication, Messages and Log. |
The Server settings control your session. At the subtitle Authentication token, you can set the lifetime of the authentication token and its checking interval. If you set the authentication token to active, the checking interval to 10 seconds and the maximum lifetime of the authentication token to 3600 seconds, that means that every 10 seconds it will be checked if you are inactive. If you are inactive for about 3600 seconds, you will be automatically logged out. |
||||||||||||||
Within the SMTP Settings, you can define the email settings.
|
||||||||||||||
You can switch on Experimental Features. It’s not guaranteed that these features work properly. At the subtitle Support you can also activate the helpcenter and the chat function. |
The Password settings specify the password policy for your users. | ||||||||||||||||
|
The License settings offer information about the current license you use. If your license expires, you can update it here. Simply copy and paste the license key in the corresponding field. |
Take a look at Authentication Settings and the following subpages.
The Message settings allow you to store system messages, which are transmitted to all logged in users, e.g. if you want to inform them about maintenance work. With corresponding rights (assigned role “System Messages”), you can add a validity date. The messages can be written in HTML.As soon as a message is stored, it is pushed to all user. User who log in later receive the message as well. The message is displayed as an overlay and must be closed manually. |
Within the settings you find the settings for the logs. You can define per categories, which loglevel will write a log in the Logs & Monitoring. Choose from the following categories:
Use the Log Archive Settings to specify the time period for archiving the logs. It runs every day at 3 a. m. when it’s activated. |
_______________________________________________
All external programs, business applications and the mobile client access the Simplifier via the Simplifier Client API.
The Simplifier Client API is documented by Swagger and can be accessed by opening the URL:
https://<pcmr.simplifier.io>/client/2.0/api-docs/
A detailed documentation of the client API is displayed and you can try out the API using the tools built into Swagger. All changes in the API are automatically transferred to the documentation.
GET | /appDeps/{appName} | Get dependencies for application |
GET | /apps/{appName} | Download application ZIP |
GET | /appDeps/{appName} | Get dependencies for application |
GET | /libs | List all libraries |
POST | /business-object/{businessObject}/{method} | Execute Business Object Method |
POST | /business-object/{businessObject}/{method} | Execute Business Object Method |
POST | /connector/{connector} | Execute Connector |
POST | /connector/{connector}/{call} | Execute Connector Call |
POST | /pluginSlot/{plugin}/{slot} | Execute Plugin Slot |
POST | /connector/{connector} | Execute Connector |
POST | /connector/{connector}/{call} | Execute Connector Call |
GET | /apps/{appName} | Download application ZIP |
GET | /libs/{libId} | Download library ZIP |
GET | /libs | List all libraries |
POST | /log/MobileClient | Post general message to simplifier logger |
POST | /log/WebView | Post WebView message to simplifier logger |
GET | /ping | Get default ping/pong message |
POST | /ping | Get custom ping/pong message |
POST | /pluginSlot/{plugin}/{slot} | Execute Plugin Slot |
GET | /version | Get version of the currently running Simplifier app server |
_______________________________________________
The Simplifier Cloud is the default deployment option when you get started with the Simplifier. As an integrated solution, the Simplifier Cloud includes automatic backups, monitoring, high availability, and more. The availability is at least 99.95%.
The Simplifier Cloud will be deployed in Deutsche Telekom’s data centers OTC. Data protection and data security are a matter of trust.
The protection and security of your data has the highest priority. The Open Telekom Cloud is operated and data is secured in our own, highly secure twin-core data centers in Germany. Data processing is subject to the strict requirements of the European Data Protection Ordinance (DSGVO).
In addition, the Open Telekom Cloud is certified according to the Trusted Cloud Data Protection Profile (TCDP) 1.0. This certifies that the Open Telekom Cloud – currently one of the few cloud offerings on the market – offers companies the technical requirements necessary to meet the basic European data protection requirements (DSGVO).
Further information can be found here.
_______________________________________________
_______________________________________________
Download the Simplifier Mobile Client in the appropriate stores, depending on your mobile device.
_______________________________________________
WSDL URL
The URL to the Web Service Description Language Document (WSDL) of the SOAP Service. Please don’t mix up with the SOAP Service Endpoint.
Take a look at SOAP Connector Calls.
_______________________________________________
Stick to the standard protcol | Use the protocol manually | Connector Wizard
SOAP is a network protocol. You can either stick to the standard when using the protocol like SAP or use it manually like Microsoft. The way the protocol is used decides on how you have to build your connector call.
In this case, the SOAP connector call requires two input parameters to be defined:
bindingName | The name attribute of your wsdl:binding attribute in your WSDL file |
operationName | The name of the wsdl:operation attribute in your WSDL file for the operation that you want to call in your connector call |
Example:
Parameters, that are required by the called SOAP operation, take the following form: soap/<operationName>/<parameterName>, e.g. soap/_-ITIZ_-BU_OBJ_EQUI/index SOAP connectors provide one or more optional parameters prefixed with ‘queryParams/‘. |
|
Those fields are appended as query parameters on the SOAP request URL to provide additional meta information. It works in the same way as queryParams on REST connectors. |
In this case, the SOAP Connector Call requires two additional input parameters to be defined:
bindingName | The name attribute of your wsdl:binding attribute in your WSDL file. |
operationName | The name of the wsdl:operation attribute in your WSDL file for the operation that you want to call in your connector call. |
strict | Determines whether services (strict == true) or local bindings (strict == false) are used to determine endpoints in the WSDL. If you don’t use the standards, you have to set this parameter. The Data Type is “boolean”. Set the value to “false”. |
endpoint | By adding this as parameter, you can choose the endpoint manually. If the endpoint is not set, the endpoint which is defined in the WSDL file will be used. |
Example:
All possible nodes (even if marked as optional) have to be defined in the Connector Call. They take the same form as in the standard use of the protocol: soap/<operationName>/<parameterName>, e.g. soap/Query/index Inline attributes are characterized like this: soap/<xml-node>/@attribute, e.g. soap/RequestServerVersion/@Version |
In the connector call overview, you can find the Connector Wizard in the top right corner. By clicking on it, the assistant helps you to create the connector calls. |
|
First Step – Select Operations: In the first step you can select the operations you want to execute. |
|
Second Step – Configure Operations: In the second step you can edit the name and description of the connector calls. |
_______________________________________________
Datasource
The JDBC Driver of the supported database: MySQL, Sybase, Oracle, PostgreSQL, SQLite, HANA and Microsoft SQL.
Host
The hostname of the database server.
Port
The TCP Port of the database server. The standard is 3306.
Database Schema
The name of the database.
Connection-String
The connection string specifies information about a data source and the means of connecting to it. It is generated automatically, depending on your previous selections.
Result Type
The result type is a Monadic type holding a returned value or an error code. Choose between Multiple Results (e.g. Array), Single Result and No Result.
If you have created an SQL connector with the SQLite data source, files are created for a special directory for SQLite data files. The connector creates an SQLite database on the Simplifier server in the connector properties if it’s not available. When changing the connector, a backup of the file is created.
Attention: Deleting the connector also deletes the data file.
Take a look at the SQL Connector Calls.
_______________________________________________
Simple Call | Query Call | Execute Call | Connector Wizard
An SQL connector call requires the two parameters “mode” and “request“.
You can choose between 3 different modes:
The ‘Simple Call’ corresponds to an unparameterized SQL call. The SQL request is defined by a ‘String’ without variable substitution. In order to be able to process the output of the SQL request, it must be defined in the output parameter of the connector call. Currently, you can still map the entire JSON result to a single parameter. |
The ‘Query Call’ is used to transfer the result from an SQL statement to the Simplifier. The SQL request of the ‘Query Call’ is parameterized (in contrary to the ‘Simple Call’). |
|
Definition of the constant value for the request parameter |
The input value of the request parameter is represented by a name and a Simplifier data type. In our example, we used the name ‘mail’ and the data type ‘String’. A parameter definition is initiated and ended with a colon. Between the colons is a pair of values, separated by a colon as well, which represents the name and the type of the parameter. In a parameterized SQL request: select * from USER_Data where email like :mail:String: If you use more values in an SQL statement you have to use a syntax separated by a comma, e.g. VALUES (:id:String:,:mail:String:). |
Definition of the parameter in the Connector Call |
In order to use the parameter that has been defined in the SQL request via the connector call interface, a new connector call parameter must now be inserted, which corresponds to the parameter definiton of the SQL request. All connector call parameters that refer to an SQL request have the prefix /params/. In the example above, a new parameter name /params/mail with the Simplifier data type ‘String’ has been created. The parameter expressions ‘alias’, ‘description’ and ‘constant value’ are equivalent to the usual connector calls. The result of a ‘Query Call’ can be assigned via the output parameters equivalent to the ‘Simple Call’. |
The ‘Execute Call’ is quite similar to the ‘Query Call’. But with the ‘Execute Call’, no result is sent back to the Simplifier.
Typically SQL INSERTs, UPDATEs, or DELETEs are displayed in that way.
In the connector call overview, you can find the Connector Wizard in the top right corner. With the SQL Wizard, it’s easy to configure new connector calls based on SQL Connectors for MySQL and Oracle. When opening the Wizard, all tables available for the schema are displayed. |
|
First Step – Select Queries: In the first step you can search for the table, and then select under “Actions” whether you want to select all columns (right icon) or only certain ones (left icon). |
|
If you only want to select certain ones, click on the left icon. A new popup opens in which you can select the desired columns. Then click OK. | |
Second Step – Configure Connector Calls: After you have selected the desired tables and, if necessary, their columns, you can edit the connector calls by clicking on “Edit Connector Calls”. When you have edited the calls, click on “Create connectorcalls”. |
_______________________________________________
URL | /client/1.0/PLUGIN/pdfPlugin/generatePdf | |
---|---|---|
Input-Parameter | Template | Template name |
Session | Session ID (to retrieve transaction data) | |
Config | PDF parameter for the generation as JSON String (optional) | |
Output-Parameter | Value | JSON Object with the parameter “jobId” (contains the generated JobID) |
Example for a call:
{
"template"
:
"templatename"
,
"session"
:
"12345678910"
,
"config"
:
"{\"orientation\" : \"Portrait\",\"page-size\" : \"A4\",\"margin-top\" : \"1in\",\"margin-bottom\" : \"1in\",\"margin-left\" : \"1in\",\"margin-right\" : \"1in\",\"footer-center\" : \"[page] / [toPage]\"}\"}"
}
{
"value"
: {
"jobId"
:
"a1ef6b46-1671-425a-947c-d9e552d4e755"
},
"success"
:
true
}
The specified parameters for the config correspond to the parameters for wkhtmltopdf or the PdfConfig class of the wrapper. This can be used to control page formats, margins, headers, footers, etc.
_______________________________________________
Structs describe a package of Domain Types. For example the Struct “address” contains different Domain Types like Name, Street, City, ZIP Code, Mobile Number etc.
To create a new Struct Type click on the “+” button.
Click into the appropriate field to select the type.
Click e.g. on Domain Types on the top and search for the domain type in the searchbar.
After clicking on apply, the type will be applied.
In the fields table can you add the following Data Types:
Name
Name of the field in the structure.
Optional
With this setting it isn’t necessary to provide all fields in Connector or Business Object Calls.
Type
Base or Domain Type or even another structure or collection.
Description
Description of the field.
_______________________________________________
Parameter | Description | Data Type | Mandatory |
operationType | The type of the performed operation here: MONITORING | String | Yes |
publishingInterval | The interval in [milliseconds] when changes are published | Double | Yes |
returnedTimestamps | Enumeration value, which type of timestamp should be returned, see ReturnedTimestampEnumeration | String | Yes |
globalMonitoringParameters | Global configuration for all monitored items. See MonitoringParameters | MonitoringParameters | Yes |
monitoredItems | The list of items, which should be monitored i.e. from which value changes should be pushed by the connector. | List[MonitoredItem] | Yes |
MonitoringParameters | |||
Parameter | Description | Data Type | Mandatory |
monitoringMode | The monitoring mode enumeration value see MonitoringModeEnumeration | String | Yes |
samplingInterval | The sampling interval in [milliseconds] in which the OPC-UA Server looks if changes occurred for the monitored items | Double | Yes |
queueSize | The queue size of changes, which are aggregated for a publishing interval | Int | Yes |
discardOldestItem | A flag, which indicates, that the oldest change may be dropped. | Boolean | Yes |
MonitoredItem | |||
Parameter | Description | Data Type | Mandatory |
nodeId | The node Id information, see NodeId | [NodeId] | Yes |
monitoringParameters | The optional monitored item parameter definition, see MonitoringParameters | [MonitoringParameters] | No |
NodeId | |||
Parameter | Description | Data Type | Mandatory |
identifier
|
The identifier name. | String | Yes |
namespaceIndex | The namespace index from 0 to 65535 | String | Yes |
identifierType | The identifier type enumeration, see IdentifierTypeEnumeration, the identifier will be searched as the provided identifier type. | String | No |
_______________________________________________
The following subpages show the calls that can be executed via the interface. Therefore they do not have to be implemented.
You can manage your templates or start a new creation via REST.
All calls are started via a POST request, which may contain parameters in JSON format in the body.
The return is always in JSON format. It includes the result parameter “success” to indicate whether the call was successful.
If the call is not successful, an error code (as a return parameter “code”) and an error message (as a return parameter “message”) are returned.
The following errors are possible:
Error Code | Message | At Request |
1 | template name invalid | adminTemplateFetch, adminTemplateEdit, adminTemplateDelete, generatePdf, adminTemplateAdd |
2 | template not existing | adminTemplateFetch, adminTemplateEdit, adminTemplateDelete, generatePdf |
3 | template name already in use | adminTemplateAdd |
400 | bad request | All |
500 | internal error | All |
(Errors 400 and 500 correspond to the HTTP status codes and indicate errors when parsing the parameter or processing errors)
The sub-sites describe the merging and saving of PDFs as well as the different requests to manage your templates.
_______________________________________________
Within the tile for Templates you can create templates in HTML-format.
_______________________________________________
As an admin, you can test your connector call by clicking on the ‘Test Connectorcall’ icon in the connector call overview or click on ‘Save & Test’ within the create/edit dialog of a connector call.
The upcoming dialog provides an input field for all input parameters, that to not have a constant value.
After entering the test values, click on the ‘Test’ button. It runs the call and displays the result in JSON format.
A history entry is created for each test and displayed in a closable panel on the left side of the dialog. Parameters from a current call can be imported into the next test by clicking the corresponding icon of the history entry.
Note: Values that are marked as constants in the current call definition are not imported!
History entries can be deleted by pressing the trash icon. The history entries also display detailed error messages if a call was unsuccessful.
Parameter- and constant names, -aliases and datatypes can be inspected by hovering over the parameter name. If the parameter is of a complex type, an info symbol is displayed. Hovering over this symbol will show a tooltip containing the value.
_______________________________________________
As an admin, you can test your script template by clicking on the ‘Test Method’ icon in the Methods overview of a business object or click on ‘Save & Test’ within the creation of a Method.
The upcoming dialog provides an input field for all input parameters, that do not have a constant value.
After entering the test values, click on the ‘Test’ button. It runs the template and displays the result in JSON format.
A history entry is created for each test and displayed in a closable panel on the left side of the dialog. Parameters from a current template can be imported into the next test by clicking the corresponding icon of the history entry.
Note: Values that are marked as constants in the current call definition are not imported!
History entries can be deleted by pressing the trash icon. The history entries also display detailed error messages if a call was unsuccessful (hover over the info symbol).
_______________________________________________
Testing WebSocket Connections through Reverse Proxy
The WSS Protocol is used for realtime data communication and server to client push mechanism.
To test a sucessfull connection, following the steps below
If not, please check the Reverse Proxy Requirements
_______________________________________________
You can upload a particular theme to give your app a specific look corresponding to your corporate design. To do this, you need a third party less compiler as an external tool.
When the less compiler has run through, you have to put all CSS files in a ZIP file. Then upload it in the UI Designer under Theming.
You have the possibility to download your already uploaded theme again. The icon for this is located to the left of the delete icon.
To activate the theme, use the client-side business object ITIZ_Utilities with the function ApplyTheme. | |
Set the input mapping. |
To create a theme we recommend to use the UI5 Theme Designer.
_______________________________________________
A token is required for a secure communictation with the application server. You can generate a token with the following AJAX-Request
var token = null;
$.ajax("http://localhost:8080/genToken/client/1.0", {
method: 'GET',
headers: {'Authorization': '[Authorization]' // [userName] : [userPassword]},
success: function(data) {
if (!data.result) {
alert("Error retrieving token: " + data.message);
return;
}
token = data.result;
}});
[userName]
The name of the user as String.
[userPassword]
The passsword of the respective user as String.
[Authorization]
The authorization data required for identification. Consisting of the authorization method here the String Basic and the [userName]:[userPassword] as a Base64 encoded String.
_______________________________________________
This section contains a detailed code example for generating a token and establishing a websocket with a connector, then a complete subscription followed by a complete unsubscription example. The arbitrary chosen connector is the “TIA_Connector”
Token Generation Example
var token = null;
$.ajax("http://localhost:8080/genToken/client/1.0", {
method: 'GET',
headers: {'Authorization': 'Basic YWRtaW46YWRtaW4=' // admin : admin},
success: function(data) {
if (!data.result) {
alert("Error retrieving token: " + data.message);
return;
}
token = data.result;
}});
Attention Using the admin as user might be a security risk. In productive systems the admin should be changed into an authorized user with the respective permissions. |
Websocket Connection Example
var webSocket = null
;
webSocket = new WebSocket("ws://localhost:8080/client/1.0/connectorAsync/" + "TIA_Connector" + "?SimplifierToken=" + token)
Complete Subscription Example
var requestSubscribeData = {
"operation": "MONITORING_SUBSCRIBE",
"nodes": ["myNode","myOtherNode"],
"namespaceIndices": [2,2],
"publishingInterval":1000.0,
"clientHandlingID": 1,
"samplingInterval": 1000.0,
"queueSize": 2,
"discardOldestItem": true,
"monitoringMode": "Reporting",
"returnedTimestamps": "Both"
}
var requestSubscribe = null;
request = {
"frameType": "unsubscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107"
};
var requestSubscribe = null;
requestSubscribe = {
"frameType": "subscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107",
"json": requestData
};
webSocket.send(requestSubscribe);
Complete Subscription Example
var requestUnsubscribe = null;
requestUnsubscribe = {
"frameType": "unsubscribe",
"subscriptionKey":"bb827118-f1b0-2170-9937-f8c7e1620107"
};
webSocket.send(requestUnsubscribe);
_______________________________________________
Before a transport is available for downloading, it has to be approved by an Admin. With the right permissions, you will find the “Approve” button next to the “Save” and “Cancel” options in the Transport.
Attention: Save the Transport in advance, else your changes won’t appear in the Transport file!
If the approval process was successful, a download icon appears in the Export column and your transport is now ready for downloading. By clicking on the icon, some metadata about the creator, approver and dates are provided.
The downloaded file can be used to import the data on a different system.
_______________________________________________
Imagine you’ve build a fancy application for one of your customers on a Simplifier instance that you’ve reserved exclusively for development tasks. Now that it’s ready to roll out, you’re faced with the question on how to bring this application finally to the customer’s Simplifier instance? How can you export and import it, preserving all its dependencies, like connectors and associated roles?
That’s when Transports come into play. They allow you to define all of your app’s artifacts and let the Simplifier collect them to create a bundle.
Clicking on the “Transports” tile forwards you to an intermediate page where you can choose between the Transportcollection and importing Transports.
_______________________________________________
_______________________________________________
With the UI Designer, you can create and design the user interface of your applications. The interface is divided into four sections: On the left side, you can browse the widgets available for the selected UI. The center presents the content structure as well as an overview about the different screens. On the editing area to the right side, you can change the parameters of the widget that is currently selected in the content structure.
You have several options in the upper menu bar to navigate to specific features:
![]() |
Preview | Preview your application in the browser – be aware that there are no mobile features like camera available. To preview your mobile applications, use the Simplifier Mobile Client. |
![]() |
Assets | You can upload assets like documents, images, CAD models or any other file types. |
![]() |
CSS Editor | Use the CSS Editor to change the layout of your application. |
![]() |
Language | Translate your application into different languages and set the fallback language. |
![]() |
Libraries | Add Libraries to your application and get an overview about their dependencies. |
![]() |
Theming | Upload a particular theme to give your app a specific look according to your corporate design guidelines. |
![]() |
Release | If you have tested your application successfully, you can release a new version with release notes. |
![]() |
Deploy | Saves and deploys the current app configuration. It’s necessary to deploy your application before starting the preview. |
![]() |
Save | Save the current app configuration. |
![]() |
Exit | Exit the current app configuration. |
_______________________________________________
The User Management module lets you define many different parameters for users and the roles they take.
The QR-Code generator for easy accessing, especially with smart glasses, is also located here.
The following table explains the different User Management functions and their meanings:
User |
User Master data |
Master data for a user account like Email, Username, Expire Date, Address Data |
Roles |
Collection of permissions |
A role represents a number of permissions and can be assigned to a specific user |
Permission |
Permissions |
Permissions are an authorization like granting access to a specific connector or business app |
Groups |
Collection of users |
A user group contains several users and could be used for workflow logic in business apps like informing a team via email or push notification about a certain event or task |
_______________________________________________
The user overview presents you all users of your own Simplifier instance. Aside from the first name and last name you also can see the username and the expiry date of the user. Four icons on the left side allow you to see details of the user, edit or delete the user (only when your role has the permissions) and see if the user has been blocked.
To add a new user click on the “+” icon on the right above the user table. Within the User Details, fill out all required user information and assign a role or group for the user.
After creating a user, a one-time-link via email will be sent to the created user. After email activation via the link, a new password can be set.
You can also assign different attributes to a user.
Example Use Case:
Let’s say we have a utility company.
They use an application to administrate their commissioners. They can add a new commissioner within the app and assign different attributes to him, e.g. a ZIP code or in which division he is working (gas, water, electricity or district heating). Now every commissioner is created as an own user in the Simplifier and you can manage the attributes directly in the user management.
_______________________________________________
User-Log logs the Login and Logout actvities from the users.
_______________________________________________
Display Name | The display name is shown on the login button. |
Client ID | The client ID identifies the application and is defined by the configuration on the OAuth server. |
Client Secret | The client secret authenticates the application and is defined by the configuration on the OAuth server. |
Scope | The scope determines which rights are gained with the access token. E.g. ‘profile’, ’email’, etc. for gaining rights to access the user profile/user email. |
Authorization Endpoint | The authorization endpoint is the URL to which an authorization request is sent. |
Token Endpoint | The token endpoint is the URL to which an access token request is sent. |
Redirect Endpoint | The redirect endpoint is the URL to which the browser is directed after successful authorization. This URL needs to be entered in the OAuth server configuration. |
Additional Query Parameters | You can add additional query parameters, such as name and value. |
Icon | The icon will be displayed on the login mask above the display name. |
Profile URL | The URL to which a user profile request is sent. |
Profile Path | The path which points to the user profile. E.g. ‘.’, ‘profile’, etc. |
Profile Verb | GET, POST, PUT |
First Name | The path which points to the entry of the user profile containing the first name. E.g. ‘givenName’, ‘person.firstName’, etc. |
Last Name | The path which points to the entry of the user profile containing the last name. E.g. ‘surName’, ‘person.lastName’, etc. |
E-Mail Address | The path which points to the entry of the user profile containing the email address. E.g. ‘mail’, ’emails.0.value’, etc. |
Mobile Phone Number | The path which points to the entry of the user profile containing the mobile phone number. E.g. ‘phone’, ‘phones.mobile’, etc. |
The settings for OAuth 2.0 can be tested within the configuration. Since the test procedure includes several steps, it is necessary to save the settings first.
The assignment of an access token can be tested by pressing the ‘Test authentication’ button, while pressing the ‘Test profile extraction’ button initiates the complete OAuth 2.0 procedure, which assigns an access token and also collects a user profile with the required data.
_______________________________________________
Display Name | The display name is shown on the login button. |
Client ID | The client ID identifies the application and is defined by the configuration on the OAuth server. |
Client Secret | The client secret authenticates the application and is defined by the configuration on the OAuth server. |
Scope | The scope determines which rights are gained with the access token. E.g. ‘profile’, ’email’, etc. for gaining rights to access the user profile/user email. |
Authorization Endpoint | The authorization endpoint is the URL to which an authorization request is sent. |
Token Endpoint | The token endpoint is the URL to which an access token request is sent. |
Redirect Endpoint | The redirect endpoint is the URL to which the browser is directed after successful authorization. This URL needs to be entered in the OAuth server configuration. |
Additional Query Parameters | You can add additional query parameters, such as name and value. |
Icon | The icon will be displayed on the login mask above the display name. |
Profile URL | The URL to which a user profile request is sent. |
Profile Path | The path which points to the user profile. E.g. ‘.’, ‘profile’, etc. |
Profile Verb | GET, POST, PUT |
First Name | The path which points to the entry of the user profile containing the first name. E.g. ‘givenName’, ‘person.firstName’, etc. |
Last Name | The path which points to the entry of the user profile containing the last name. E.g. ‘surName’, ‘person.lastName’, etc. |
E-Mail Address | The path which points to the entry of the user profile containing the email address. E.g. ‘mail’, ’emails.0.value’, etc. |
Mobile Phone Number | The path which points to the entry of the user profile containing the mobile phone number. E.g. ‘phone’, ‘phones.mobile’, etc. |
The settings for OAuth 2.0 can be tested within the configuration. Since the test procedure includes several steps, it is necessary to save the settings first.
The assignment of an access token can be tested by pressing the ‘Test authentication’ button, while pressing the ‘Test profile extraction’ button initiates the complete OAuth 2.0 procedure, which assigns an access token and also collects a user profile with the required data.
_______________________________________________
These settings depend on the third-party provider.
Display Name | The display name is shown on the login button. |
Client ID | The client ID identifies the application and is defined by the configuration on the OAuth server. |
Client Secret | The client secret authenticates the application and is defined by the configuration on the OAuth server. |
Scope | The scope determines which rights are gained with the access token. E.g. ‘profile’, ’email’, etc. for gaining rights to access the user profile/user email. |
Authorization Endpoint | The authorization endpoint is the URL to which an authorization request is sent. |
Token Endpoint | The token endpoint is the URL to which an access token request is sent. |
Redirect Endpoint | The redirect endpoint is the URL to which the browser is directed after successful authorization. This URL needs to be entered in the OAuth server configuration. |
Additional Query Parameters | You can add additional query parameters, such as name and value. |
Icon | The icon will be displayed on the login mask above the display name. |
Profile URL | The URL to which a user profile request is sent. |
Profile Path | The path which points to the user profile. E.g. ‘.’, ‘profile’, etc. |
Profile Verb | GET, POST, PUT |
First Name | The path which points to the entry of the user profile containing the first name. E.g. ‘givenName’, ‘person.firstName’, etc. |
Last Name | The path which points to the entry of the user profile containing the last name. E.g. ‘surName’, ‘person.lastName’, etc. |
E-Mail Address | The path which points to the entry of the user profile containing the email address. E.g. ‘mail’, ’emails.0.value’, etc. |
Mobile Phone Number | The path which points to the entry of the user profile containing the mobile phone number. E.g. ‘phone’, ‘phones.mobile’, etc. |
The settings for OAuth 2.0 can be tested within the configuration. Since the test procedure includes several steps, it is necessary to save the settings first.
The assignment of an access token can be tested by pressing the ‘Test authentication’ button, while pressing the ‘Test profile extraction’ button initiates the complete OAuth 2.0 procedure, which assigns an access token and also collects a user profile with the required data.
_______________________________________________
The prerequisite for using SAML with Google is G Suite with administration rights.
Log in at admin.google.com with your Google account, select the item “Apps” and then the item “SAML-Apps”.
Use the “+” button to create an SSO for a SAML application.
At the bottom of the pop-up, you can select “SETUP MY OWN CUSTOM APP”.
Here you can assign a freely selectable name, in our example “Simplifier-Tutorial” with the description “Simplifier SAML”. In the lower area you can upload a logo. Here you can download the Simplifier logo.
Now open the user interface of Simplifier parallel in a new tab and open the settings and select “Authentication”.
Here you create a new authentication method with the “+” symbol, set a name for this method e.g. “Google”, set priority to “0” and select Mechanism to “SAML 2.0”.
Now you can specify a display name and set the maximum lifetime to “486000” seconds (8 hours) as suggested by us.
Copy the Service Provider Endpoint and paste it into the Service Provider Entity ID.
Now open the IDP Metadata File already downloaded from Google: GoogleIDPMetadata-<your-domain>.xml with a text editor of your choice and copy the content into IDP Metadata. Additionally you can define a logo.
Please copy the Service Provider Entity ID again and switch to the Google Admin Portal. There you paste the previously copied URL under ACS URL and Entity ID. In the field ACS URL, the domain must be added “:443”.
Leave the Start URL field empty and tick the checkbox at Signet Response.
Click on NEXT and then on FINISH.
Then you have to edit the attributes Mapping.
Click on ADD NEW MAPPING.
Please transfer the values from the Simplifier Settings page as in the example and save them in Simplifier as well as in the Google Admin Portal.
Finally, the SAML app must be activated for all or certain users in Google. Click on EDIT SERVICE and select “ON for everyone” and SAVE.
_______________________________________________
Important: The ADFS setting for maximum lifetime is 480 minutes (8 hours), so increase this value when authenticating with an ADFS service.
Go to SAML TOOL to build the XML metadata and fill out the required fields:
SAML TOOL | Simplifier | Description |
Attribute Consume Service Endpoint (HTTP-POST) | Service Provider Entity ID | Endpoint URL that needs to be configured in SAML IDP. It is set by the instance name and the previously assigned authentication name by Simplifier. |
EntityId | Service Provider Endpoint | At default, the entity ID of your application (Service Provider) is equal to the callback URL, but you can force your own entity ID by setting this parameter. |
SP X.509 cert | The certificate bundle is created in the next step and inserted into Simplifier data storage. | Only the certificate (*.crt) is required. |
A certificate bundle is required for SAML authentication. To create the XML metadata, the CRT in x.509 format is needed and Simplifier needs a JKS bundle.
To create the required certificates, we have created a bash script in the Simplifier Docker Container.
docker exec –it <Simplifier Container Name> \
bash –c “/opt/simplifier/bin/create_saml_keystore.sh”
Insert the output of the script (certificate) into the SAML tool and click on the button ‘BUILD SP METADATA’.
Please save the XML text as a file.
In the configuration for ADFS, you now need to run the Add Trust Positions for Trusted Pages wizard and insert the XML file.
The IDP metadata file required for Simplifier can now be obtained from the SPE. This must be entered in the IDP metadata field.
With ADFS ( Windows Server 2016 ) this would be:
https://<ADFS-SERVER>/FederationMetadata/2007-06/FederationMetadata.xml
_______________________________________________
This section contains a description for the websocket methods. As for now this API is considered incomplete.
onOpen
The function, which will be executed, when the websocket is opend. The code block can be found below:
webSocket.onopen = function(message) {[FunctionLogic]};
onClose
The function, which will be executed, when the websocket is beign closed. The code block can be found below:
webSocket.onclose = function(message) {[FunctionLogic]};
onError
The function, which will be exceuted, when the websocket throws an error. The code block can be found below:
webSocket.onerror = function(message) {[FunctionLogic]};
onMessage
The function, which will be executed, when the websocket returns a message. The code block can be found below:
webSocket.onmessage = function(message) {[FunctionLogic]};
close
This function closes the websocket.
webSocket.close();
send
A specific request will be send to the websocket and interpreted by the other side of the connection. In this case a connector:
webSocket.send([request]);
[FunctionLogic]
This parameter contains the function, which will be executed.
[request]
This parameter is a JSON object send to the respective function. The requests for the Connector can be found here.
_______________________________________________
The following sections contain information about how to use asynchronous connector subscriptions and unsubscriptions. For now, the subscription and unsubscription process can be initialized only programmatically and solely with the OPC/UA Connector.
_______________________________________________
After receiving a token, as described here, a websocket connection can be established with the application server with the following code:
var webSocket = null
webSocket = new WebSocket("ws://localhost:8080/client/1.0/connectorAsync/" + [ConnectorName] + "?SimplifierToken=" + [Token]);
[ConnectorName]
This parameter represents the connector, that the websocket connection will be established to.
[Token]
The generated token object.
_______________________________________________
An assistant is provided for maintaining OpenUI5 widgets. If you enter any UI5 control type in the Widget Customizer on the OpenUI5 tab and click the magic wand button, the template, properties, events, and aggregation is filled with the information of the control and all its ancestors.
_______________________________________________
A widget represents a specific element in the user interface (e.g. checkbox, button or login screen).
To customize a widget, click on the ‘Applications’ tile and choose the ‘Widgets’ tab.
Press the ‘+’ button on the right to add a new one.
If you want to create a new widget, you will be forwarded to the Widget Customizer. There you’ll have 4 different tabs:
The first one describes all global settings of the widget which are independent of UI5 or Angular (e.g. category).
The OpenUI5, Angular and Angular 2 tabs contain the specific parameters and settings for each framework.
Later on, the Simplifier will choose the right parameters depending on your application type.
Take a look at the constructor details in its API reference and search for the control/widget you want to create in the Simplifier.
Now add a name and optionally a description, default binding-property, category and tags.
Switch to the tab OpenUI5 and enter the widget type. It has to be the same as the UI5 control name. Use the wizard, to extract the widget data automatically.
So the template for the widget was filled in as well as the properties with the data type and default value.
The events and the aggregations with content type. If the aggregations shall contain more than one control, they are marked as multiple.
After hitting the “Save” button, you’ve successfully created a new widget.
Within the overview, you can edit, take a look at the details, delete or copy a widget or take a look at the description, category, tags, and if it’s deprecated or not.
_______________________________________________
Call for WRITE operations (the name TIA_WRITE is the arbitrarily chosen name for this call)
For the WRITE Connector Call, you need to configure the “operationType ” and the “nodeId” (consisting of 2 parameters: identifier and namespaceIndex). Furthermore, you need to define the operationTarget and the value.
operationType: Defines which operation you want to execute, in this case, “WRITE”.
Parameter Name: operations/arrayItem[0]/operationType
Constant Value: WRITE
Data Type: String
nodeID: Defines the identification of the OPC/UA node. It is split in 2 parameter:
operationTarget:
Parameter Name: operations[0]/operationTarget
Constant Value: Choose between
values The values, which are going to be written into the nodes.
Parameter Name: operations[0]/value
Data Type: String
The position of the values will equal the position of the node. For example, if node a is on the first position and node b on the second, whereas value x is on the first and value y on the second position then value x will be written into node a and value y into node b.
NOTE: The specific commands are NOT defined here!
Output parameters
You can return all output parameter like this:
Parameter Name: /
Data Type: String
If you want to get only selected output parameter, use the following syntax:
Parameter Name: operationsResult/[0]/newValue/value (exemplary)
Data Type: depends on the parameter you want to be returned.
For now, only the complete unformatted JSON will be returned.
_______________________________________________
Simplifier Academy
Courses & Documentation
PDF generated July 30, 2019 at 7:23 AM