<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
# DataEase

## 1. Product Overview

1. Introduction to DataEase

    DataEase is an open-source data visualization and analysis tool that provides a drag-and-drop interface, allowing users to easily create charts and dashboards. It supports multiple data sources such as MySQL, SQL Server, Hive, ClickHouse, and DM, and can be integrated into other applications. This tool helps users quickly gain insights from their data and make informed decisions. For more detailed information, please refer to [DataEase official website](https://www.fit2cloud.com/dataease/index.html)

    <div style="text-align: center;">
      <img src="/img/DataEase2.png" alt="" style="width: 60%;"/>
    </div>

2. Introduction to the DataEase-IoTDB Connector

   IoTDB can be efficiently integrated with DataEase through API data sources, and IoTDB data can be accessed through the Session interface using API data source plugins. This plugin supports customized data processing functions, providing users with greater flexibility and more diverse data operation options.
    <div style="text-align: center;">
      <img src="/img/DataEase-English2.png" alt="" style="width: 70%;"/>
    </div>

## 2. Installation Requirements

| **Preparation Content**              | **Version Requirements**                                                     |
| :-------------------- | :----------------------------------------------------------- |
| IoTDB                 | Version not required, please refer to [Deployment Guidance](../QuickStart/QuickStart_apache.md) |
| JDK                   | Requires JDK 11 or higher (JDK 17 or above is recommended for optimal performance)           |
| DataEase              | Requires v1 series v1.18 version, please refer to the official [DataEase Installation Guide](https://dataease.io/docs/v2/installation/offline_INSTL_and_UPG/)(V2.x is currently not supported) |
| DataEase-IoTDB Connector | Obtain the installation package                                           |

## 3. Installation Steps

Step 1: Unzip the installation package `iotdb-api-source-1.0.0.zip`

Step 2: After extracting the files, modify the `application.properties` configuration file in the `config` folder

- `server.port` can be modified as needed.
- `iotdb.nodeUrls` should be configured with the address and port of the IoTDB instance to be connected.
- `iotdb.user` should be set to the IoTDB username.
- `iotdb.password` should be set to the IoTDB password.

```Properties
# Port on which the IoTDB API Source listens 
server.port=8097
# IoTDB instance addresses, multiple nodeUrls separated by ;
iotdb.nodeUrls=127.0.0.1:6667
# IoTDB username
iotdb.user=root
# IoTDB password
iotdb.password=root
```

Step 3: Start up  DataEase-IoTDB Connector

- Foreground start

```Shell
./sbin/start.sh
```

- Background start (add - d parameter)

```Shell
./sbin/start.sh -d
```

Step 4: After startup, you can check whether the startup was successful through the log.

```Shell
 lsof -i:8097  // The port configured in the file where the IoTDB API Source listens
```

## 4. Instructions

### 4.1 Sign in DataEase

1. Sign in DataEase，access address: `http://[target server IP address]:80`
<div style="text-align: center;">
  <img src="/img/DataEase-English3.png" alt="" style="width: 70%;"/>
</div>

### 4.2 Configure data source

1. Navigate to "Data Source".
<div style="text-align: center;">
  <img src="/img/DataEase-English4.png" alt="" style="width: 70%;"/>
</div>

2.  Click on the "+" on the top left corner, choose "API" at the bottom as data source.
<div style="text-align: center;">
  <img src="/img/DataEase-English5.png" alt="" style="width: 70%;"/>
</div>

3. Set the "Display Name" and add the API Data Source.
<div style="text-align: center;">
  <img src="/img/DataEase-English6.png" alt="" style="width: 70%;"/>
</div>

4. Set the name of the Dataset Table, select "Post" as the Request Type, fill in the address with `http://[IoTDB API Source]:[port]/getData>`. If operating on the local machine and using the default port, the address should be set to `http://127.0.0.1:8097/getData`.
<div style="text-align: center;">
  <img src="/img/DataEase-English7.png" alt="" style="width: 70%;"/>
</div>

5. In the "Request parameters"-"Request Body" configuration, set the format as "JSON". Please fill in the parameters according to the following example：
    - timeseries：The full path of the series to be queried (currently only one series can be queried).
    - limit：The number of entries to query (valid range is greater than 0 and less than 100,000).

    ```JSON
    { 
        "timeseries": "root.ln.wf03.wt03.speed",
        "limit": 1000
    }
    ```
<div style="text-align: center;">
  <img src="/img/DataEase-English8.png" alt="" style="width: 70%;"/>
</div>

6. In the "Request parameters"-"Request Body" configuration, set "Basic Auth" as the verification method, and enter the IoTDB username and password.
<div style="text-align: center;">
  <img src="/img/DataEase-English9.png" alt="" style="width: 70%;"/>
</div>

7. In the next step, results are returned in the "data" section. For example, it returns `time`, `rownumber` and `value` as shown in the interface below. The date type for each field also need to be specified. After completing the settings, click the "Save" button in the bottom.
<div style="text-align: center;">
  <img src="/img/DataEase-English11.png" alt="" style="width: 70%;"/>
</div>

8. Save the settings to complete creating new API data source.
<div style="text-align: center;">
  <img src="/img/DataEase-English12.png" alt="" style="width: 70%;"/>
</div>

9. You can now view and edit the data source and its detailed information under "API"-"Data Source". 
<div style="text-align: center;">
  <img src="/img/DataEase-English13.png" alt="" style="width: 70%;"/>
</div>

### 4.3 Configure the Dataset

1. Create API dataset: Navigate to "Data Set"，click on the "+" on the top left corner, select "API dataset" and choose the directory where this dataset is located to enter the New API Dataset interface.
<div style="text-align: center;">
  <img src="/img/DataEase-English14.png" alt="" style="width: 49%;"/>
  <img src="/img/DataEase-English15.png" alt="" style="width: 49%;"/>
</div>

2. Select the newly created API data source and the corresponding dataset table, then define the DataSet Name. Save the settings to complete the creation of the dataset.
<div style="text-align: center;">
  <img src="/img/DataEase-English16.png" alt="" style="width: 49%;"/>
  <img src="/img/DataEase-English17.png" alt="" style="width: 49%;"/>
</div>

3. Select the newly created dataset and navigate to "Field Manage", check the required fields (such as `rowNum`) and convert them to dimensions.
<div style="text-align: center;">
  <img src="/img/DataEase-English18.png" alt="" style="width: 70%;"/>
</div>

4. Configure update frequency: Click on "Add Task" under "Update info" tag and set the following information:

    - Task Name: Define the task name
    
    - Update method: Select "Full update"
    
    - Execution frequency: Set according to the actual situation. Considering the data retrieval speed of DataEase, it is recommended to set the update frequency to more than 5 seconds. For example, to set the update frequency to every 5 seconds, select "Expression setting" and configure the cron expression as `0/5****?*`.
    Click on "Confirm" to save the settings.
<div style="text-align: center;">
  <img src="/img/DataEase-English19.png" alt="" style="width: 70%;"/>
</div>

5. The task is now successfully added. You can click "Execution record" to view the logs.
<div style="text-align: center;">
  <img src="/img/DataEase-English20.png" alt="" style="width: 70%;"/>
</div>

### 4.4 Configure Dashboard

1. Navigate to "Dashboard", click on "+" to create a directory, then click on "+" of the directory and select "Create Dashboard".
<div style="text-align: center;">
  <img src="/img/DataEase-English21.png" alt="" style="width: 70%;"/>
</div>

2. After setting up as needed, click on "Confirm". We will taking "Custom" setting as an example.
<div style="text-align: center;">
  <img src="/img/DataEase-English22.png" alt="" style="width: 70%;"/>
</div>

3. In the new dashboard interface, click on "Chart" to open a pop-up window for adding views. Select the previously created dataset and click on "Next".
<div style="text-align: center;">
  <img src="/img/DataEase-English23.png" alt="" style="width: 70%;"/>
</div>

4. Choose a chart type by need and define the chart title. We take "Base Line" as an example. Confirm to proceed.
<div style="text-align: center;">
  <img src="/img/DataEase-English24.png" alt="" style="width: 70%;"/>
</div>

5. In the chart configuration interface, drag and drop the `rowNum` field to the category axis (usually the X-axis) and the `value` field to the value axis (usually the Y-axis).
<div style="text-align: center;">
  <img src="/img/DataEase-English25.png" alt="" style="width: 70%;"/>
</div>

6. In the chart's category axis settings, set the sorting order to ascending, so that the data will be displayed in increasing order. Set the data refresh frequency to determine the frequency of chart updates. After completing these settings, you can further adjust other format and style options for the chart, such as color, size, etc., to meet display needs. Once adjustments are made, click the "Save" button to save the chart configuration.
>Since DataEase may cause the API data, originally returned in ascending order, to become disordered after automatically updating the dataset, it is necessary to manually specify the sorting order in the chart configuration.
<div style="text-align: center;">
  <img src="/img/DataEase-English26.png" alt="" style="width: 70%;"/>
</div>

7. After exiting the editing mode, you will be able to see the corresponding chart.
<div style="text-align: center;">
  <img src="/img/DataEase-English27.png" alt="" style="width: 70%;"/>
</div>