Skip to main content

14.9 Sample Data

The Sample Data feature loads a prebuilt business scenario into TDengine IDMP with a single click. No real data source is required to experience the full product workflow. During loading, the tool automatically creates the data model from a JSON configuration file and writes simulated time-series data into the TDengine time-series database. The system includes several typical industry scenario packages out of the box, and users can also build custom packages to match specific business requirements.

This feature is especially useful for system integrators and pre-sales engineers. After understanding a customer's operational environment, they can quickly assemble a demo that closely matches the customer's real scenario, helping the customer verify the relevant IDMP capabilities and value earlier in the evaluation cycle.

Sample Data is accessed from Admin Console → Sample Data.

14.9.1 Usage Instructions

14.9.1.1 Command-Line Mode

Environment Requirements

ComponentRequirement
JavaJDK 8 or later
TDengineInstalled and accessible
IDMPInstalled and accessible
JSON FileSample data configuration

Tool Location

Inside the TDasset Docker container:

/app/tda-generator-command.jar

Basic Commands

Generate sample data
java -jar tda-generator-command.jar -f init.json
Clean up sample data
java -jar tda-generator-command.jar -f init.json -c
warning

For testing environments only.

14.9.1.2 GUI Mode

In the IDMP management interface, open the Sample Data module, select or upload a JSON configuration file, then click Save or Cancel to complete the operation.

14.9.2 Configuration Guide (JSON)

14.9.2.1 Overall Structure

{
"info": {},
"TDasset": {},
"datasource": {},
"databases": [],
"enumerations": [],
"templates": [],
"trees": {}
}

14.9.2.2 info - Sample Data Scenario Information

Used only for display in the IDMP UI.

{
"id": "smart_meters",
"name": "Smart Meters",
"description": "Smart meter sample scenario",
"file": "init.json",
"image": "smart_meters.jpg"
}
  • name: Scenario name (must be unique in the sample data list)
  • description: Scenario description
  • file: Must match the filename

14.9.2.3 TDasset — IDMP Connection

Effective only in command-line mode.

{
"url": "http://localhost:8010/api/v1",
"user": "admin",
"password": "123456"
}
  • url: IDMP access URL
  • user: IDMP username
  • password: IDMP login password

14.9.2.4 datasource — TDengine Connection

{
"db": {
"host": "127.0.0.1",
"port": 6041,
"user": "root",
"password": "taosdata"
},
"max_active": 20,
"min_idle": 3,
"max_lifetime": 1800000,
"idle_timeout": 600000,
"keep_alive_time": 30000,
"connection_timeout": 30000,
"validation_timeout": 5000,
"validation_query": "SELECT 1"
}
  • db: TDengine connection details
  • max_active: Maximum active connections in pool
  • min_idle: Minimum idle connections in pool
  • Other parameters refer to TDengine JDBC connection pool documentation

14.9.2.5 databases — Database Definition

{
"name": "idmp_sample_utility",
"drop": "yes",
"vgroups": 1,
"precision": "ms",
"replica": 1,
"duration": "10d",
"keep": 3650
}
  • name: Database name
  • drop: Whether to drop existing database (recommended for testing only)
  • vgroups: Initial number of vgroups
  • precision: Timestamp precision (default: ms)
  • replica: Replication factor (default: 1)
  • duration: Data file storage duration (default: 10d)
  • keep: Data retention days (default: 3650)
  • Other parameters refer to TDengine database creation documentation

14.9.2.6 enumerations - Enumeration Type Definition

Enumeration types are used for attributes whose values come from a finite set. Enumeration types declared in the enumerations section are automatically imported into the system before element templates and element attributes are created. If an enumeration type with the same name already exists but is missing some values, the missing values are automatically added during loading.

[
{
"name": "Device Status",
"code": "device_status",
"description": "Device operating status",
"valueType": "Varchar",
"valueLength": 64,
"values": [
{
"name": "Running",
"value": "1",
"description": "Device is running"
},
{
"name": "Stopped",
"value": "2",
"description": "Device is stopped"
},
{
"name": "Fault",
"value": "3",
"description": "Device fault",
"subValues": [
{
"name": "Hardware Fault",
"value": "3.1",
"description": "Hardware-related fault"
},
{
"name": "Software Fault",
"value": "3.2",
"description": "Software-related fault"
}
]
}
]
}
]
  • name: Enumeration type name (must be unique)
  • code: Enumeration type code (defaults to enum)
  • description: Enumeration type description
  • valueType: Data type of enumeration values, such as Varchar, Int, etc. (defaults to Varchar)
  • valueLength: Length of enumeration values (defaults to 64)
  • values: List of enumeration values
    • name: Enumeration value name
    • value: Actual enumeration value
    • description: Enumeration value description
    • subValues: Sub-value list, supports multi-level nesting for hierarchical relationships

Referencing Enumeration Types in Attributes

When an element template attribute or element attribute needs to use an enumeration type, set type to Enumeration and reference the enumeration value via defaultValue using the name path format:

{
"name": "Status",
"type": "Enumeration",
"defaultValue": "Device Status.Running"
}
  • defaultValue format is EnumerationTypeName.EnumerationValueNamePath
  • For hierarchical enumeration values, the name path is joined with dots, e.g., Device Status.Fault.Hardware Fault
  • During loading, the system automatically resolves the name path to internal IDs — no manual ID specification is needed
  • If an enumeration type with the same name already exists but is missing the referenced value, the value is automatically added during loading

14.9.2.7 templates - Element Template Configuration

Template configuration includes two parts: 1. general information such as the name, naming rule, and location; 2. the property list defined in super_tables, including generated data settings, CSV data source settings, and the definitions of metric and tag. Metrics can also define data generation functions.

{
"name": "Smart Meter",
"leaf": true,
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "child table name"
},
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"super_tables": [
{
"name": "electricity_meters",
"start_timestamp": "2026-07-11 08:00:00+08:00",
"time_step": 600000,
"non_stop_mode": false,
"insert_rows": 1440,
"batch_insert_num": 500,
"insert_interval": 0,
"history_window": {
"start_timestamp": "2026-07-05 08:00:00+08:00",
"duration": "2d"
},
"metrics": [
{
"name": "current",
"title": "Current",
"description": "Current information",
"type": "Float",
"tdType": "metric",
"uomClass": "Current",
"uom": "A",
"displayDigits": 2,
"fun": "4*sin(x)+random(2)+4"
}
],
"tags": [
{
"name": "location",
"title": "Address",
"description": "Address information",
"namingPattern": "${KEYWORD1}",
"type": "Varchar",
"length": 50,
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"tdType": "tag",
"tree": true
}
]
}
]
}
  • name: Template name (must be unique)
  • leaf: Whether this is a leaf node template (true for leaf, false for path)
  • namingPattern: Naming rule
  • keywordsDesc: Keyword description for naming
  • location: Location attribute range (altitude, latitude, longitude)
  • super_tables: Super table configuration list
    • name: Super table name
    • start_timestamp: Data start timestamp (string; null = 4 days ago). Supports timezone offsets (e.g. 2025-06-10 20:00:00.000+08:00, 2025-06-10T20:00:00.000Z); parses as system default timezone if no offset is present.
    • time_step: Time step in milliseconds
    • non_stop_mode: false = fixed rows; true = continuous real-time simulation; combined with a csv block it enables CSV historical data replay, see 14.9.2.8 CSV Data Source Configuration
    • insert_rows: Total rows to insert
    • batch_insert_num: Rows per batch
    • insert_interval: Interval between batches (ms; 0 = no delay)
    • history_window: Optional; backfills a historical time range before the main write phase. See 14.9.2.8.1 history_window - Historical Data Window.
    • metrics: List of metric attributes
      • name: Metric name
      • title: Metric title
      • description: Metric description
      • type: Data type (Float, Double, Int, BigInt, Varchar, and other TDengine supported types)
      • tdType: Field role — metric for measurements, tag for tags
      • uomClass: Unit category
      • uom: Unit name
      • displayDigits: Decimal places displayed
      • fun: Data generation function; supports basic math and random(); x represents the time variable
    • tags: List of tag attributes (same structure as metrics)

14.9.2.8 csv - CSV Data Source Configuration

When data for a super table should be loaded from an existing CSV file instead of generated by formulas, add a csv block under that super_tables entry. CSV mode only changes the data source; metrics, tags, and trees are still defined in the same way.

{
"name": "vehicles",
"csv": {
"file": "csv/vehicles.csv",
"timestamp_column": "ts",
"sub_table_column": "sub_table_name"
},
"metrics": [
{
"name": "speed",
"title": "Speed",
"description": "Speed information",
"type": "SmallInt",
"tdType": "metric"
}
]
}
  • file: CSV file path. Absolute and relative paths are supported. If omitted, the default path is <super_table_name>.csv.
  • timestamp_column: Timestamp column name. The default value is ts. Values in this column are written directly as row timestamps. Not required in historical data replay mode, where this column is ignored.
  • sub_table_column: Required. This column provides the target sub-table name, and it must exist in the CSV header.
  • The CSV header must contain timestamp_column (optional in replay mode), sub_table_column, and one column for each metrics.name. Extra columns are allowed, but the current import pipeline does not use them.
  • In one-shot import mode (non_stop_mode omitted or false), start_timestamp, time_step, insert_rows, batch_insert_num, and insert_interval are no longer required. Imported timestamps and row counts come directly from the CSV content.
  • Setting non_stop_mode to true enables CSV historical data replay mode, which continuously simulates real-time data based on the CSV content. See below.

CSV Historical Data Replay

By default, a CSV data source is imported once: each row is written with its original timestamp from the timestamp_column, and no new data is produced after the import completes. To continuously simulate real-time data based on the historical values in a CSV file, set non_stop_mode to true on the super table to enable historical data replay mode:

{
"name": "meters",
"time_step": 60000,
"non_stop_mode": true,
"csv": {
"file": "csv/meters.csv",
"sub_table_column": "sub_table_name"
},
"metrics": [
{
"name": "current",
"title": "Current",
"description": "Current information",
"type": "Float",
"tdType": "metric"
}
]
}

How replay mode differs from one-shot import:

  • Metric values are read in a loop: the system reads the CSV row by row and starts over from the beginning after reaching the end, without ever stopping.
  • Timestamps are generated by the system: instead of reading the CSV timestamp column, row timestamps start from start_timestamp (defaults to 4 days ago) and advance by time_step (in milliseconds, defaults to 1000) per row, so the CSV file does not need a timestamp column.
  • Historical backfill plus real-time writes: rows whose timestamps lag behind the current time are backfilled quickly; once the replay catches up with the current time, it keeps writing at the pace of time_step, simulating data produced in real time.

Constraints and runtime behavior:

  • All replay-enabled CSV super tables must belong to the same database.
  • Replay super tables can be mixed with one-shot import CSV super tables in the same configuration. The system finishes all one-shot imports first, then starts the replay.
  • While the replay is running, the sample stays in the data generation state and can be paused and resumed on the Sample Data page. On resume, the system reads the timestamp of the last replayed row from the database and continues the replay from that point, without duplicates or gaps.
  • Unloading the sample scenario or running the command-line cleanup (-c) automatically terminates the replay process. When loading from the command line, the tool exits once the import completes and the replay process keeps running in the background.
  • To quickly backfill a recent historical range before the main replay starts, configure history_window on the same super table. See the next section.

14.9.2.8.1 history_window - Historical Data Window

history_window is an optional block under super_tables. It backfills a slice of historical time-series data (Phase 0) before the main write phase (Phase 1). Rows written during the history phase do not count toward insert_rows.

{
"name": "public_point",
"start_timestamp": "2026-07-11 08:00:00+08:00",
"time_step": 60000,
"non_stop_mode": true,
"history_window": {
"start_timestamp": "2026-07-05 08:00:00+08:00",
"duration": "2d"
},
"csv": {
"file": "csv/public_point.csv",
"sub_table_column": "sub_table_name"
},
"metrics": []
}

Fields

  • start_timestamp: Start of the history backfill window. Same format as the super-table-level start_timestamp (timezone offsets supported; omitted or null defaults to four days before the current time).
  • duration: Required. Length of the history window. Compact forms are supported: 30m, 24h, 6d, 2w, and so on.

The window is left-closed and right-open: [start_timestamp, start_timestamp + duration). In the example above, history covers six days from 2026-07-05 08:00:00; the instant 2026-07-11 08:00:00 is excluded.

Execution order and row count

  1. Phase 0 (history): Runs first when the window is valid and overlap short-circuit does not apply (see below).
  2. Phase 1 (main): Then runs using the super-table start_timestamp, insert_rows, non_stop_mode, and other existing settings.

History row count is duration ÷ time_step (integer division). It is independent of insert_rows.

Overlap handling

Let history_end = history_window.start_timestamp + duration. If history_end > the super-table start_timestamp, the windows overlap:

  • The separate history phase is not run, and no standalone history taosgen config is generated.
  • The main write / CSV replay start becomes min(history_window.start_timestamp, start_timestamp), so writing continues from the earlier of the two.

When history_end == start_timestamp, there is no overlap and the history phase still runs on its own.

Behavior by data source

Data sourcenon_stop_modeHistory phase behavior
Formula generation (no csv)AnyGenerate metric values from history_window.start_timestamp, advancing by time_step
CSV one-shot importfalseImport CSV rows whose timestamp_column falls in the history window, using the original CSV timestamps
CSV replaytrueLoop metric values from the CSV; timestamps start at history_window.start_timestamp and advance by time_step (same as main replay; the CSV time column is not used)
tip

For CSV replay super tables (non_stop_mode: true), history_window.start_timestamp sets where historical backfill begins on the timeline, not the timestamps stored in the source CSV. This is useful when the CSV contains older timestamps but the demo should align with a recent time range.

Resume behavior

When a sample resumes from a checkpoint or after pause, the history_window phase is not run again. Only the main phase continues (including CSV replay), consistent with current production behavior.

Runtime order (with CSV)

When history windows and CSV replay coexist in one configuration, the system runs all history imports first (including each table's history_window), then all one-shot CSV imports, and finally starts CSV replay processes.

14.9.2.9 trees - Element Tree and Child Table Generation

{
"value": "Public Utility",
"visible": "true",
"children": [
{
"template": "location-1-smart_meters",
"values": "Beijing",
"children": [
{
"template": "location-2-smart_meters",
"values": "Haidian",
"children": [
{
"template": "Smart Meter",
"values": "em[1,5]"
}
]
}
]
}
]
}
  • visible: Whether the root node is visible
  • template: Template name (must match one defined in templates)
  • values: Assigns values to naming keywords; supports ranges like em[1,5] → em1 to em5
  • children: Child node list

This section:

  • Builds the element tree
  • Automatically creates sub-tables
  • Automatically binds TAG values

14.9.2.10 panels / analyses - Element Name References in Panels and Analyses

Beyond the data model, sample data can also preload panels, dashboards, and analyses, defined with the panels, dashboards, and analyses fields under a template entry in templates or under a tree node in trees.

Because elements do not exist yet when the configuration file is written, these configurations reference elements and templates by name, resolved to actual IDs during loading:

  • Reference fields take names: rootElementId and elementTemplate.rootElement take an element name; elementTemplate.id and otherElementTemplateId take a template name.
  • Expression references: fields such as attributeExpression, expression, and filter use the <element name>|attributes['<attribute name>'] syntax to reference attributes of other elements.
  • #ELEMENT_NAME placeholder: #ELEMENT_NAME in name and fileName is replaced with the owning element's name.
"analyses": [
{
"name": "Vehicle statistics",
"elementTemplate": {
"id": "Vehicle",
"rootElement": "Vehicle Scenario"
},
"rootElementId": "Vehicle Scenario"
}
]

Note: element names referenced by panels or analyses must be unique within the scenario; a duplicate or missing name causes the load to fail.

14.9.2.11 Full Example

Expand to view the complete JSON example
{
"info": {
"id": "smart_meters",
"name": "Utilities",
"description": "A smart metering monitoring system that collects real-time data from electricity and water meters to enable precise energy management and anomaly detection.",
"file": "smart_meters-en.json",
"image": "smart_meters.png"
},
"TDasset": {
"url": "http://127.0.0.1:6042",
"user": "",
"password": ""
},
"datasource": {
"db": {
"host": "127.0.0.1",
"port": 6041,
"user": "root",
"password": "taosdata",
"version": "3.3.6.0",
"useTokenForAuth": false,
"enableSsl": false
},
"max_active": 10,
"min_idle": 3,
"max_lifetime": 1800000,
"idle_timeout": 600000,
"keep_alive_time": 30000,
"connection_timeout": 30000,
"validation_timeout": 5000,
"validation_query": "SELECT 1"
},
"databases": [
{
"name": "idmp_sample_utility",
"drop": "yes",
"buffer": 10,
"cachesize": "",
"cachemodel": "'none'",
"comp": null,
"duration": "10d",
"wal_fsync_period": 3000,
"maxrows": 4096,
"minrows": 100,
"stt_trigger": 2,
"keep": "3650d,3650d,3650d",
"pages": 256,
"pagesize": 4,
"precision": "ms",
"replica": 1,
"vgroups": 1,
"single_stable": 0,
"table_prefix": 0,
"table_suffix": 0,
"tsdb_pagesize": 4,
"wal_retention_period": 3600,
"wal_retention_size": 0,
"keep_time_offset": 0,
"compact_interval": "0d",
"compact_time_range": "0d,0d",
"compact_time_offset": "0h",
"dnodes": ""
}
],
"enumerations": [
{
"name": "Meter Status",
"code": "meter_status",
"description": "Meter operating status",
"valueType": "Varchar",
"valueLength": 64,
"values": [
{
"name": "Normal",
"value": "0",
"description": "Normal operation"
},
{
"name": "Abnormal",
"value": "1",
"description": "Operating abnormally"
}
]
}
],
"templates": [
{
"name": "Electricity meter",
"description": "This is electricity meter information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "child table name"
},
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"leaf": true,
"super_tables": [
{
"name": "electricity_meters",
"start_timestamp": null,
"time_step": 600000,
"non_stop_mode": false,
"slice_size": 10,
"insert_rows": 1440,
"batch_insert_num": 500,
"insert_interval": 0,
"metrics": [
{
"name": "current",
"title": "Current",
"description": "current info",
"type": "Float",
"tdType": "metric",
"uomClass": "Electric Current",
"uom": "A",
"displayDigits": 2,
"fun": "4*sin(x)+random(2)+4"
},
{
"name": "voltage",
"title": "Voltage",
"description": "voltage info",
"type": "Int",
"tdType": "metric",
"uomClass": "Electric Potential",
"uom": "V",
"fun": "10*sin(x)+10*random(4)+200"
},
{
"name": "power",
"title": "Power",
"description": "power info",
"type": "Float",
"tdType": "metric",
"uomClass": "Power",
"uom": "W",
"defaultValue": 100
},
{
"name": "phase",
"title": "Phase",
"description": "phase info",
"type": "Float",
"tdType": "metric",
"displayDigits": 2,
"traits": [
{
"traitType": "Limits",
"traitLimitsType": "Minimum",
"defaultValue": "0"
},
{
"traitType": "Limits",
"traitLimitsType": "Maximum",
"defaultValue": "1"
}
]
},
{
"name": "status",
"title": "Status",
"description": "Meter operating status",
"type": "Enumeration",
"tdType": "metric",
"defaultValue": "Meter Status.Normal"
}
],
"tags": [
{
"name": "location",
"title": "Location",
"description": "location info",
"namingPattern": "${KEYWORD1}",
"type": "Varchar",
"length": 50,
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"tdType": "tag",
"tree": true
},
{
"name": "unit",
"title": "Unit",
"description": "Unit information",
"type": "tinyint",
"tdType": "tag"
},
{
"name": "floor",
"title": "Floor",
"description": "Floor information",
"type": "tinyint",
"tdType": "tag"
},
{
"name": "device_id",
"title": "Device ID",
"description": "Device ID information",
"type": "Nchar",
"length": 20,
"tdType": "tag"
}
]
}
]
},
{
"name": "Water meter",
"description": "This is water meter information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "child table name"
},
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"leaf": true,
"super_tables": [
{
"name": "water_meters_01",
"start_timestamp": "2025-06-10 20:00:00.000+08:00",
"time_step": 600000,
"non_stop_mode": false,
"slice_size": 10,
"insert_rows": 1440,
"batch_insert_num": 500,
"insert_interval": 0,
"metrics": [
{
"name": "rate",
"title": "Flow rate",
"description": "rate info",
"type": "Float",
"tdType": "metric",
"uomClass": "Volume Flow Rate",
"uom": "l/s",
"displayDigits": 2,
"fun": "4*sin(x)+random(2)+4"
},
{
"name": "pressure",
"title": "Water pressure",
"description": "pressure info",
"type": "Int",
"tdType": "metric",
"uomClass": "Pressure",
"uom": "kPa",
"traits": [
{
"traitType": "Limits",
"traitLimitsType": "Minimum",
"defaultValue": "0"
},
{
"traitType": "Limits",
"traitLimitsType": "Maximum",
"defaultValue": "400"
}
]
}
],
"tags": [
{
"name": "location",
"title": "Location",
"description": "location info",
"namingPattern": "${KEYWORD1}",
"column": "$(databases[0]).$(super_tables[1]).location",
"location": {
"altitude": {
"min": -10985,
"max": 10000
},
"latitude": {
"min": -90,
"max": 90
},
"longitude": {
"min": -180,
"max": 180
}
},
"type": "Varchar",
"length": 50,
"tdType": "tag",
"tree": true
}
]
}
]
},
{
"name": "location-1-smart_meters",
"description": "Tree path template information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "name"
}
},
{
"name": "location-2-smart_meters",
"description": "Tree path template information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "name"
}
},
{
"name": "location-3-smart_meters",
"description": "Tree path template information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "name"
}
},
{
"name": "location-4-smart_meters",
"description": "Tree path template information",
"namingPattern": "${KEYWORD1}",
"keywordsDesc": {
"KEYWORD1": "name"
}
}
],
"trees": {
"value": "Utilities",
"visible": true,
"children": [
{
"template": "location-1-smart_meters",
"values": "California",
"children": [
{
"template": "location-2-smart_meters",
"values": "Los Angeles County",
"children": [
{
"template": "location-3-smart_meters",
"values": "Los Angeles",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-[1,5]",
"values": "em-[1,5]",
"unit": [
1,
1,
1,
2,
2
],
"floor": [
2,
2,
2,
2,
2
],
"device_id": "em20250220001000[1,5]"
}
]
},
{
"template": "location-3-smart_meters",
"values": "Long Beach",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-16",
"values": "em-16",
"unit": [
2
],
"floor": [
2
],
"device_id": "em202502200010016"
}
]
},
{
"template": "location-3-smart_meters",
"values": "Santa Clarita",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-17",
"values": "em-17",
"unit": [
2
],
"floor": [
2
],
"device_id": "em202502200010017"
}
]
}
]
},
{
"template": "location-2-smart_meters",
"values": "San Diego County",
"children": [
{
"template": "location-3-smart_meters",
"values": "San Diego",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-[11,15]",
"values": "em-[11,15]",
"unit": [
11,
11,
11,
11,
1
],
"floor": [
11,
12,
13,
14,
15
],
"device_id": [
"em202502200010011",
"em202502200010012",
"em202502200010013",
"em202502200010014",
"em202502200010015"
]
}
]
},
{
"template": "location-3-smart_meters",
"values": "Chula Vista",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-10",
"values": "em-10",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010010"
},
{
"template": "Water meter",
"child_table_names": "wm-1",
"values": "wm-1",
"device_id": "wm20250220001001"
}
]
},
{
"template": "location-3-smart_meters",
"values": "Oceanside",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-[6,9]",
"values": "em-[6,9]",
"unit": [
1,
1,
1,
1
],
"floor": [
2,
2,
2,
2
],
"device_id": "em20250220001000[6,9]"
}
]
}
]
},
{
"template": "location-2-smart_meters",
"values": "Orange County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-18",
"values": "em-18",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010018"
}
]
},
{
"template": "location-2-smart_meters",
"values": "Riverside County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-19",
"values": "em-19",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010019"
}
]
}
]
},
{
"template": "location-1-smart_meters",
"values": "New York",
"children": [
{
"template": "location-2-smart_meters",
"values": "Kings County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-20",
"values": "em-20",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010020"
}
]
},
{
"template": "location-2-smart_meters",
"values": "Queens County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-21",
"values": "em-21",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010021"
}
]
},
{
"template": "location-2-smart_meters",
"values": "New York County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-22",
"values": "em-22",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010022"
}
]
}
]
},
{
"template": "location-1-smart_meters",
"values": "Georgia",
"children": [
{
"template": "location-2-smart_meters",
"values": "Fulton County",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-23",
"values": "em-23",
"unit": [
1
],
"floor": [
2
],
"device_id": "em202502200010023"
}
]
},
{
"template": "location-2-smart_meters",
"values": "DeKalb County[1,2]",
"children": [
{
"template": "location-3-smart_meters",
"values": "Kensington",
"children": [
{
"template": "Electricity meter",
"child_table_names": "em-[24,25]",
"values": "em-[24,25]",
"unit": [
1,
1
],
"floor": [
2,
2
],
"device_id": [
"em202502200010024",
"em202502200010025"
]
}
]
}
]
}
]
}
]
}
}

14.9.3 Usage Recommendations

  • One JSON file per sample scenario
  • Use consistent prefixes for template names
  • Panels and analyses are linked by element name; keep referenced element names unique
  • Control child table count when using continuous data generation
  • To show historical trends on a recent timeline, configure history_window on the super table; if it overlaps the table-level start_timestamp, the system continues the main write from the earlier start instead of running a separate history backfill
  • Always confirm the environment before running cleanup operations