Began Framework start

This commit is contained in:
2026-03-17 09:10:25 -05:00
parent c1603c24b0
commit 2db1253693
1277 changed files with 66669 additions and 1 deletions

View File

@@ -0,0 +1,7 @@
{
"permissions": {
"allow": [
"Bash(find c:/Git/framework-ignition-docker/ignition -type f -name *)"
]
}
}

1
.gitignore vendored
View File

@@ -25,6 +25,7 @@ ignition/data/
# Test results (generated output, not source)
testing/results/
# IDE / Editor
.vscode/
.idea/

View File

@@ -14,6 +14,22 @@ The PLC I/O Testing Platform is the first project built on this framework.
- Jython 2.7 inside Ignition; Python 3.10+ for external tooling
- Claude Code on the Linux host (VS Code Remote to Docker host)
## API Key / Secrets Policy
**Source of truth**: `~/.config/ignition-dev/secrets.env` (chmod 600, never committed)
**Template**: `.env.example` in repo root — update this when adding new secrets
### Rules
- All secrets via environment variables — no hardcoded values in any file
- Docker Compose references host env vars: `VAR=${VAR}` pattern
- Python scripts use `python-dotenv` + `os.environ["KEY"]` (loud failure on missing)
- `.env` at project root is a symlink to secrets file — listed in .gitignore
- CI secrets live in Gitea repository secrets settings
### Required Variables
See `.env.example` for full list.
## Language Rules
### Jython 2.7 (Inside Ignition)

View File

@@ -15,7 +15,69 @@ Reusable scaffold for Ignition SCADA + Docker projects, designed to work with Cl
- Traefik v3 (optional reverse proxy)
- Gitea for source control
## Getting Started
## First-Time Setup
### Prerequisites
- Docker + Docker Compose installed on the host (Ubuntu 24 recommended)
- Git repo cloned to the host machine
### 1. Create the secrets file
```bash
cp docker/gw-secret/GATEWAY_ADMIN_PASSWORD.example docker/gw-secret/GATEWAY_ADMIN_PASSWORD
# Edit the file and set a real password — this file is gitignored
nano docker/gw-secret/GATEWAY_ADMIN_PASSWORD
```
### 2. Create the environment file
```bash
cp docker/.env.example docker/.env
# Edit values as needed (Ignition version, memory, hostname, Postgres password)
nano docker/.env
```
Key variables in `.env`:
| Variable | Default | Description |
|---|---|---|
| `IGNITION_VERSION` | `8.3.3` | Ignition image version |
| `GATEWAY_MAX_MEMORY` | `8192` | Gateway JVM heap in MB |
| `GATEWAY_NAME` | `framework` | Gateway name shown in designer |
| `GATEWAY_HOSTNAME` | `ignition.localhost` | Public hostname (Traefik routing) |
| `POSTGRES_PASSWORD` | `changeme` | PostgreSQL password |
### 3. Build and start the stack
```bash
cd docker
docker compose build # builds the custom Ignition image
docker compose up -d # starts all services in background
```
### 4. Verify services are healthy
```bash
docker compose ps # all services should show "healthy" or "running"
curl -s http://localhost:8088/StatusPing # should return "RUNNING"
```
### 5. Open the gateway
- Ignition gateway: http://localhost:8088
- Traefik dashboard: http://localhost:8080
- Via hostname (requires local DNS or /etc/hosts): http://ignition.localhost
> **Note:** On first boot the gateway skips the setup wizard (`commissioning.json` pre-commissions it).
> Log in with username `admin` and the password from `gw-secret/GATEWAY_ADMIN_PASSWORD`.
### 6. Connect Ignition Designer
Open Ignition Designer Launcher, add gateway at `http://<host-ip>:8088`, and open the **Framework** project. The project files in `ignition/project/` are live-mounted — changes saved in Designer write directly to Git-tracked files.
---
## Development
See [CLAUDE.md](CLAUDE.md) for project directives, canonical patterns, and directory layout.

2
docker/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.env
gw-secret/GATEWAY_ADMIN_PASSWORD

View File

@@ -0,0 +1,9 @@
<?xml version="1.1" encoding="UTF-8"?>
<!--
Ignition gateway configuration backup.
Mount this file read-only for initial config seeding only.
After first boot, Ignition manages its own config — do not overwrite a live gateway.xml.
To generate this file: Gateway > Config > Backup/Restore > Download Backup
-->
<ConfigurationUpdate />

View File

@@ -0,0 +1,19 @@
{
"server": {
"host": "0.0.0.0",
"port": 5020
},
"registers": {
"holding": {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 0
},
"coils": {
"0": false,
"1": false
}
}
}

View File

@@ -0,0 +1,10 @@
-- PostgreSQL initialization script.
-- Runs ONCE on first container start when the data volume is empty.
-- Add schema, extensions, and seed data here.
-- Enable useful extensions
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- Ignition stores its own schema; this file is for project-specific tables.
-- Add project tables below this line.

View File

@@ -0,0 +1,10 @@
# Traefik Dynamic Configuration
Place `.yml` files here for dynamic routing rules, middleware, and TLS configuration.
Traefik watches this directory and reloads automatically — no restart required.
## Examples
- `tls.yml` — TLS certificates and stores
- `middlewares.yml` — reusable middleware (auth, rate limiting, headers)
- `routers.yml` — additional route rules beyond Docker labels

View File

@@ -0,0 +1,13 @@
http:
routers:
ignition:
entryPoints:
- web
rule: "Host(`ignition.localhost`)"
service: ignition
services:
ignition:
loadBalancer:
servers:
- url: "http://ignition:8088"

View File

@@ -0,0 +1,19 @@
api:
dashboard: true
insecure: true # Dashboard on :8080 — restrict in production
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
docker:
exposedByDefault: false
file:
directory: /etc/traefik/dynamic
watch: true
log:
level: INFO

View File

@@ -0,0 +1,16 @@
# Project-specific service additions and overrides.
# Add Modbus simulators and other project-specific containers here.
# Do NOT modify docker-compose.yml directly for per-project changes.
#
# Example Modbus simulator:
#
# services:
# modbus-sim-pumps:
# image: oitc/modbus-server:latest
# ports:
# - "5020:5020"
# volumes:
# - ./config/modbus/pumps.json:/app/config.json
# restart: unless-stopped
services: {}

118
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,118 @@
x-default-logging: &default-logging
logging:
driver: json-file
options:
max-size: "100m"
max-file: "5"
x-ignition-opts: &ignition-opts
<<: *default-logging
build:
context: .
args:
IGNITION_VERSION: ${IGNITION_VERSION:-8.3.3}
dockerfile: ./gw-build/Dockerfile
image: framework-ignition:${IGNITION_VERSION:-8.3.3}
env_file: gw-init/gateway.env
secrets:
- gateway-admin-password
name: framework
services:
ignition:
<<: *ignition-opts
container_name: ignition
pull_policy: missing
depends_on:
traefik:
condition: service_healthy
postgres:
condition: service_healthy
command: >
-n ${GATEWAY_NAME:-framework} -m ${GATEWAY_MAX_MEMORY:-1024}
ports:
- "8088:8088"
- "8043:8043"
- "62541:62541"
- "1883:1883"
volumes:
- ignition-data:/usr/local/bin/ignition/data
- ./gw-config:/usr/local/bin/ignition/data/config:rw
- ./gw-commission/commissioning.json:/usr/local/bin/ignition/data/commissioning.json:ro
- ../ignition/project:/usr/local/bin/ignition/data/projects/framework:rw
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8088/StatusPing"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
labels:
- "traefik.enable=true"
- "traefik.http.routers.ignition.entrypoints=web"
- "traefik.http.routers.ignition.rule=Host(`${GATEWAY_HOSTNAME:-ignition.localhost}`)"
- "traefik.http.services.ignition.loadbalancer.server.port=8088"
networks:
- proxy
restart: unless-stopped
postgres:
<<: *default-logging
image: postgres:16-alpine
container_name: postgres
volumes:
- postgres-data:/var/lib/postgresql/data
- ./config/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
environment:
POSTGRES_DB: ignition
POSTGRES_USER: ignition
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ignition"]
interval: 10s
timeout: 5s
retries: 5
networks:
- proxy
restart: unless-stopped
traefik:
<<: *default-logging
image: traefik:v3
container_name: traefik
ports:
- "80:80"
- "443:443"
- "8080:8080"
command:
- --configFile=/etc/traefik/traefik.yml
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./config/traefik/dynamic:/etc/traefik/dynamic:ro
healthcheck:
test: ["CMD", "traefik", "healthcheck", "--ping"]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=web"
- "traefik.http.routers.traefik.rule=Host(`traefik.localhost`)"
- "traefik.http.routers.traefik.service=api@internal"
networks:
- proxy
restart: unless-stopped
networks:
proxy:
name: proxy
secrets:
gateway-admin-password:
file: gw-secret/GATEWAY_ADMIN_PASSWORD
volumes:
ignition-data:
postgres-data:

View File

@@ -0,0 +1,17 @@
ARG IGNITION_VERSION=8.3.3
FROM inductiveautomation/ignition:${IGNITION_VERSION}
USER root
RUN apt-get update && apt-get install -y \
iputils-ping \
htop \
nano \
net-tools \
traceroute \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Uncomment to install third-party modules:
# COPY modules/*.modl /usr/local/bin/ignition/user-lib/modules/
EXPOSE 8088 8043 62541 1883

View File

@@ -0,0 +1,5 @@
{
"connections.useSsl": "false",
"eulaSetup.eula": "B3RM3rHPH6fHm8owWAEx/YnCk04FsYkXTDX8DOl4zQI=",
"isCommissioned": "COMMISSIONED"
}

13
docker/gw-config/.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Ignition runtime-generated gateway config — do not commit
local/
resources/
certificates/
keystore/
*.idb
db/
metricsdb/
autobackup/
jar-cache/
*.log
logs/
.resources/

View File

View File

@@ -0,0 +1,8 @@
ACCEPT_IGNITION_EULA=Y
GATEWAY_ADMIN_USERNAME=admin
GATEWAY_ADMIN_PASSWORD_FILE=/run/secrets/gateway-admin-password
GATEWAY_PUBLIC_ADDRESS=${GATEWAY_HOSTNAME}
IGNITION_EDITION=standard
TZ=America/Chicago
GATEWAY_MODULES_ENABLED=all
DISABLE_QUICKSTART=true

View File

@@ -0,0 +1 @@
changeme

44
ignition/.gitignore vendored Normal file
View File

@@ -0,0 +1,44 @@
*.gwbk
my-db/
frontend-gateway/config/resources/.resources
backend-gateway/config/resources/.resources
# Database files
**/db/
**/metricsdb/
**/autobackup/
**/db_backup_sqlite.idb
**/valueStore.idb
# Cache and temporary files
**/jar-cache/
**/request
**/response
*.tmp
*.bak
**/var
# Log files
*.log
**/logs
# Certificates and security
**/certificates/
**/keystore/
# Runtime configuration (environment-specific)
**/config/local
**/config/resources/local
# Gateway-specific runtime files
**/.container-init.conf
# Backup and converted files
**/conversion-report.txt
**.digest.json
# Project conversion artifacts
**/projects/conversion-report.txt
**/migration-log-*.md
**/.resources/

View File

@@ -0,0 +1,13 @@
{
"pages": {
"/": {
"title": "Main",
"viewPath": "Page/Main"
}
},
"sharedDocks": {
"cornerPriority": "top-bottom",
"left": [],
"top": []
}
}

View File

@@ -0,0 +1,9 @@
{
"files": [
"config.json"
],
"overridable": true,
"restricted": false,
"scope": "G",
"version": 1
}

View File

@@ -0,0 +1,8 @@
{
"custom": {},
"general": {
"navigation": {
"enableHistoryNavigation": true
}
}
}

View File

@@ -0,0 +1,9 @@
{
"files": [
"props.json"
],
"overridable": true,
"restricted": false,
"scope": "G",
"version": 1
}

View File

@@ -0,0 +1,9 @@
{
"files": [
"props.json"
],
"overridable": true,
"restricted": false,
"scope": "G",
"version": 1
}

View File

@@ -0,0 +1,21 @@
# env: Jython 2.7 (Ignition — gateway/client script library)
# Access via: project.devices.<function>()
def getStatus(deviceTagPath):
"""
Read current status tags for a device UDT instance.
deviceTagPath: str — path to the device UDT root tag
Returns: dict with device status values
"""
raise NotImplementedError("getStatus not yet implemented")
def sendCommand(deviceTagPath, command, value=True):
"""
Write a command to a device UDT instance.
deviceTagPath: str — path to the device UDT root tag
command: str — command member name (e.g. 'Start', 'Stop')
value: bool/int/float — value to write
"""
raise NotImplementedError("sendCommand not yet implemented")

View File

@@ -0,0 +1,12 @@
{
"attributes": {
"hintScope": 2
},
"files": [
"code.py"
],
"overridable": true,
"restricted": false,
"scope": "A",
"version": 1
}

View File

@@ -0,0 +1,22 @@
# env: Jython 2.7 (Ignition — gateway/client script library)
# Access via: project.testing.<function>()
def runScenario(scenarioPath):
"""
Load and execute a test scenario from the given path.
scenarioPath: str — path to scenario JSON file or scenario ID
Returns: dict with keys 'passed', 'results', 'errors'
"""
raise NotImplementedError("runScenario not yet implemented")
def validateResults(expected, actual, tolerance=0.0):
"""
Compare actual tag values against expected outcomes.
expected: dict — {tagPath: expectedValue}
actual: dict — {tagPath: actualValue}
tolerance: float — allowable numeric deviation
Returns: dict with keys 'passed', 'failures'
"""
raise NotImplementedError("validateResults not yet implemented")

View File

@@ -0,0 +1,12 @@
{
"attributes": {
"hintScope": 2
},
"files": [
"code.py"
],
"overridable": true,
"restricted": false,
"scope": "A",
"version": 1
}

View File

@@ -0,0 +1,29 @@
# env: Jython 2.7 (Ignition — gateway/client script library)
# Access via: project.util.<function>()
import json
import system
def formatTag(tagPath, value):
"""
Format a tag value for display or logging.
tagPath: str — tag path (used for context)
value: any — raw tag value
Returns: str
"""
return "{}: {}".format(tagPath, value)
def validateJson(jsonStr):
"""
Parse and validate a JSON string.
jsonStr: str — JSON text to validate
Returns: parsed object on success
Raises: ValueError on invalid JSON
"""
try:
return json.loads(jsonStr)
except ValueError as e:
logger = system.util.getLogger("util")
logger.error("Invalid JSON: {}".format(str(e)))
raise

View File

@@ -0,0 +1,12 @@
{
"attributes": {
"hintScope": 2
},
"files": [
"code.py"
],
"overridable": true,
"restricted": false,
"scope": "A",
"version": 1
}

View File

@@ -0,0 +1,7 @@
{
"description": "",
"enabled": true,
"inheritable": false,
"parent": "",
"title": "Framework"
}

44
reference/Docker/.gitignore vendored Normal file
View File

@@ -0,0 +1,44 @@
*.gwbk
my-db/
frontend-gateway/config/resources/.resources
backend-gateway/config/resources/.resources
# Database files
**/db/
**/metricsdb/
**/autobackup/
**/db_backup_sqlite.idb
**/valueStore.idb
# Cache and temporary files
**/jar-cache/
**/request
**/response
*.tmp
*.bak
**/var
# Log files
*.log
**/logs
# Certificates and security
**/certificates/
**/keystore/
# Runtime configuration (environment-specific)
**/config/local
**/config/resources/local
# Gateway-specific runtime files
**/.container-init.conf
# Backup and converted files
**/conversion-report.txt
**.digest.json
# Project conversion artifacts
**/projects/conversion-report.txt
**/migration-log-*.md
**/.resources/

0
reference/Docker/.gitmodules vendored Normal file
View File

View File

@@ -0,0 +1,86 @@
version: "3.8"
x-default-logging: &default-logging
logging:
options:
max-size: "100m"
max-file: "5"
driver: json-file
x-ignition-opts: &ignition-opts
<<: *default-logging
image: inductiveautomation/ignition:${IGNITION_VERSION:-latest}
env_file: gw-init/gateway.env
secrets:
- gateway-admin-password
name: PCTest
services:
pctp-proxy:
image: traefik:v2.11
container_name: pctp-proxy
restart: always
ports:
- 80:80
command:
- --configFile=/etc/traefik/traefik.yml
labels:
traefik.enable: "true"
traefik.http.routers.pctp-proxy.entrypoints: "web"
traefik.http.routers.pctp-proxy.rule: "Host(`pctp-proxy.localtest.me`)"
traefik.http.routers.pctp-proxy.service: "api@internal"
volumes:
- ./traefik-config/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik-config/dynamic.yml:/etc/traefik/dynamic.yml:ro
networks:
- proxy
healthcheck:
test: [ "CMD", "traefik", "healthcheck", "--ping" ]
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
PCTPgateway:
depends_on:
pctp-proxy:
condition: service_healthy
<<: *ignition-opts
build:
context: .
args:
- IGNITION_VERSION=${IGNITION_VERSION:-8.3.2}
dockerfile: ./gw-build/Dockerfile # Edit this file to add new third party modules
user: 0:0
container_name: PCTPgateway
pull_policy: missing
labels:
traefik.enable: "true"
traefik.http.routers.PCTPgateway.entrypoints: "web"
traefik.http.routers.PCTPgateway.rule: "Host(`${GATEWAY1_HOSTNAME}`)"
traefik.http.services.PCTPgateway.loadbalancer.server.port: "8088"
ports:
- 8088:8088 # Main Ignition Web Port
- 1883:1883 # Main MQTT Port
- 8060:8060 # Main Ignition Gateway Port
# Reference Ignition Documentation for reference to these commands and their uses.
command: >
-n PCTestingPlatform -m ${GATEWAY_MAX_MEMORY:-1024}
volumes:
- ./projects:/usr/local/bin/ignition/data/projects:rw
- ./gw-config:/usr/local/bin/ignition/data/config:rw
- ./gw-commission/commissioning.json:/usr/local/bin/ignition/data/commissioning.json
networks:
- proxy
networks:
proxy:
name: proxy
# external: true
secrets:
gateway-admin-password:
file: gw-secret/GATEWAY_ADMIN_PASSWORD
volumes:
logs:
driver: local

View File

@@ -0,0 +1,21 @@
# Use the official Ignition image
ARG IGNITION_VERSION=8.3.2
FROM inductiveautomation/ignition:${IGNITION_VERSION}
# COPY ./gw-build/Tag-CICD.modl /usr/local/bin/ignition/user-lib/modules/
#COPY ./gw-build/MQTT-Distributor-signed.modl /usr/local/bin/ignition/user-lib/modules/
USER root
# Update the package list and install utilities
RUN apt-get update && apt-get install -y \
iputils-ping \
htop \
nano \
net-tools \
traceroute \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Expose required ports
EXPOSE 8088 1883

View File

@@ -0,0 +1,5 @@
{
"isCommissioned": "COMMISSIONED",
"connections.useSsl": "false",
"eulaSetup.eula": "B3RM3rHPH6fHm8owWAEx/YnCk04FsYkXTDX8DOl4zQI="
}

View File

@@ -0,0 +1 @@
90514a51-8092-4e68-bf3e-f73d1a9c8c8e

View File

@@ -0,0 +1,25 @@
{
"ackPipeline": "",
"activePipeline": "",
"alarmOnActivity": true,
"alarmOnMetrics": false,
"alarmOnTasks": true,
"connectedClientsError": 100,
"connectedClientsWarning": 50,
"connectionError": 15,
"connectionWarning": 5,
"cpuError": 90,
"cpuWarning": 70,
"dbConnUtilError": 100,
"dbConnUtilWarning": 80,
"errPerHourError": 60,
"errPerHourWarning": 20,
"errPerMinError": 5,
"errPerMinWarning": 2,
"errorPriority": "High",
"memError": 90,
"memWarning": 70,
"perspectiveSessionsError": 100,
"perspectiveSessionsWarning": 50,
"warningPriority": "Low"
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:15Z"
},
"lastModificationSignature": "2d0dd4ede91ff9ee109ca4c38e38775a0ebdcaa3eb46addc636b4fb7d8bb78e0"
}
}

View File

@@ -0,0 +1,17 @@
{
"agentSettings": {
"forwardLeasedLicense": false,
"httpConnectTimeout": 10,
"httpReadTimeout": 60,
"sendStatsInterval": 30
},
"controllerSettings": {
"archiveLocationMode": "Automatic",
"backupRetentionAge": 0,
"backupRetentionTimeUnit": "Days",
"eventTableName": "agent_events",
"lowDiskThresholdMB": 1024,
"maxRetainedBackupCount": 5
},
"installMode": "NotInstalled"
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:15Z"
},
"lastModificationSignature": "4d119665f7debe30d86559e6368db9496874414ab0f17c8d19342d2cbf81a040"
}
}

View File

@@ -0,0 +1,39 @@
{
"defaultDeviceRolePermissionMappings": [
{
"permissions": [
"Browse",
"Read"
],
"role": "Anonymous"
},
{
"permissions": [
"Browse",
"Read",
"Write",
"Call"
],
"role": "AuthenticatedUser"
}
],
"defaultTagProviderRolePermissionMappings": [
{
"permissions": [
"Browse",
"Read"
],
"role": "Anonymous"
},
{
"permissions": [
"Browse",
"Read",
"Write",
"Call"
],
"role": "AuthenticatedUser"
}
],
"tagProviderRolePermissionMappings": {}
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:13Z"
},
"lastModificationSignature": "e09f4a2ee6de083c3c1cc9bd81d3a1603d46e986bf579575927afc00c9dea3e4"
}
}

View File

@@ -0,0 +1,22 @@
{
"profile": {
"type": "LogixDriver"
},
"settings": {
"advanced": {
"automaticRebrowseEnabled": true,
"cipConnectionSize": 500,
"cipConnectionTimeout": 16000,
"concurrentRequests": 4,
"identityRequestFrequency": 5000,
"slotNumber": 0
},
"connectivity": {
"connectionPath": "",
"hostname": "172.30.35.69",
"localAddress": "",
"port": 44818,
"timeout": 2000
}
}
}

View File

@@ -0,0 +1,18 @@
{
"scope": "A",
"description": "",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "unknown",
"timestamp": "2026-02-18T14:46:02Z"
},
"uuid": "44708f58-efb8-4d3b-bd10-2ed295802753",
"lastModificationSignature": "63fd7a3af102fba27c2576ff0586704badf352b282a4f36f4c6a3b3ff975ca85"
}
}

View File

@@ -0,0 +1,4 @@
{
"defaultAuthProfileCreated": true,
"defaultOpcUaConnectionCreated": true
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "unknown",
"timestamp": "2025-10-20T13:06:05Z"
},
"lastModificationSignature": "6b0dec069693bc118091cdc6e368b6c38c20c12481aa0a43e0ea144d2997a64a"
}
}

View File

@@ -0,0 +1,30 @@
{
"advanced": {
"exposedTagsEnabled": false,
"gdsPushEnabled": false,
"maxSessionCount": 100
},
"authentication": {
"anonymousAccessAllowed": false,
"authenticationProfile": "opcua-module"
},
"endpoint": {
"bindAddresses": [
"localhost"
],
"bindPort": 62541,
"endpointAddresses": [
"\u003chostname\u003e",
"\u003clocalhost\u003e"
],
"messageSecurityModes": [
"SignAndEncrypt"
],
"securityPolicies": [
"Basic256Sha256"
]
},
"redundancy": {
"readOnlyWhenInactive": false
}
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:14Z"
},
"lastModificationSignature": "a4b5cf8263097ff0c91244ddb1c23158bb608ee41de0029b62d01c9f9cd5be56"
}
}

View File

@@ -0,0 +1,4 @@
{
"entrypoint": "index.css",
"isPrivate": false
}

View File

@@ -0,0 +1,8 @@
@import "./variables.css";
@import "../light/fonts.css";
@import "../dark/globals.css";
@import "../light/app/index.css";
@import "../light/common/index.css";
@import "../light/designer/index.css";
@import "../light/palette/index.css";
@import "../dark/palette/index.css";

View File

@@ -0,0 +1,19 @@
{
"scope": "G",
"description": "The dark-cool theme for Perspective.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json",
"index.css",
"variables.css"
],
"attributes": {
"lastModification": {
"actor": "theme-manager",
"timestamp": "2025-10-20T13:05:12Z"
},
"lastModificationSignature": "0cb4f65dadeba1cd623f749481e20ac0c5b8ec25e0a615c7914d7a9fcd28dd43"
}
}

View File

@@ -0,0 +1,15 @@
@import "../dark/variables.css";
:root {
/* Neutrals */
--neutral-10: #121619; /* cool-100 */
--neutral-20: #21272A; /* cool-90 */
--neutral-30: #343A3F; /* cool-80 */
--neutral-40: #4D5358; /* cool-70 */
--neutral-50: #697077; /* cool-60 */
--neutral-60: #878D96; /* cool-50 */
--neutral-70: #A2A9B0; /* cool-40 */
--neutral-80: #C1C7CD; /* cool-30 */
--neutral-90: #DDE1E6; /* cool-20 */
--neutral-100: #F2F4F8; /* cool-10 */
}

View File

@@ -0,0 +1,4 @@
{
"entrypoint": "index.css",
"isPrivate": false
}

View File

@@ -0,0 +1,8 @@
@import "./variables.css";
@import "../light/fonts.css";
@import "../dark/globals.css";
@import "../light/app/index.css";
@import "../light/common/index.css";
@import "../light/designer/index.css";
@import "../light/palette/index.css";
@import "../dark/palette/index.css";

View File

@@ -0,0 +1,19 @@
{
"scope": "G",
"description": "The dark-warm theme for Perspective.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json",
"index.css",
"variables.css"
],
"attributes": {
"lastModification": {
"actor": "theme-manager",
"timestamp": "2025-10-20T13:05:12Z"
},
"lastModificationSignature": "2f2c76d6d3497ecc6adc0ab1dacf8effc208bc209d6a2613e21dd0c9808e4825"
}
}

View File

@@ -0,0 +1,15 @@
@import "../dark/variables.css";
:root {
/* Neutrals */
--neutral-10: #171414; /* warm-100 */
--neutral-20: #272525; /* warm-90 */
--neutral-30: #3C3838; /* warm-80 */
--neutral-40: #565151; /* warm-70 */
--neutral-50: #736F6F; /* warm-60 */
--neutral-60: #8F8B8B; /* warm-50 */
--neutral-70: #ADA8A8; /* warm-40 */
--neutral-80: #CAC5C4; /* warm-30 */
--neutral-90: #E5E0DF; /* warm-20 */
--neutral-100: #F7F3F2; /* warm-10 */
}

View File

@@ -0,0 +1,4 @@
{
"entrypoint": "index.css",
"isPrivate": false
}

View File

@@ -0,0 +1,7 @@
@import "./variables.css";
@import "../light/fonts.css";
@import "../light/globals.css";
@import "../light/app/index.css";
@import "../light/common/index.css";
@import "../light/designer/index.css";
@import "../light/palette/index.css";

View File

@@ -0,0 +1,19 @@
{
"scope": "G",
"description": "The light-cool theme for Perspective.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json",
"index.css",
"variables.css"
],
"attributes": {
"lastModification": {
"actor": "theme-manager",
"timestamp": "2025-10-20T13:05:12Z"
},
"lastModificationSignature": "36d2dcad7c80e63e91f24406e77832251df70f52d38ebf6a2f5140a7525f2226"
}
}

View File

@@ -0,0 +1,15 @@
@import "../light/variables.css";
:root {
/* Neutrals */
--neutral-10: #F2F4F8; /* cool-10 */
--neutral-20: #DDE1E6; /* cool-20 */
--neutral-30: #C1C7CD; /* cool-30 */
--neutral-40: #A2A9B0; /* cool-40 */
--neutral-50: #878D96; /* cool-50 */
--neutral-60: #697077; /* cool-60 */
--neutral-70: #4D5358; /* cool-70 */
--neutral-80: #343A3F; /* cool-80 */
--neutral-90: #21272A; /* cool-90 */
--neutral-100: #121619; /* cool-100 */
}

View File

@@ -0,0 +1,4 @@
{
"entrypoint": "index.css",
"isPrivate": false
}

View File

@@ -0,0 +1,7 @@
@import "./variables.css";
@import "../light/fonts.css";
@import "../light/globals.css";
@import "../light/app/index.css";
@import "../light/common/index.css";
@import "../light/designer/index.css";
@import "../light/palette/index.css";

View File

@@ -0,0 +1,19 @@
{
"scope": "G",
"description": "The light-warm theme for Perspective.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json",
"index.css",
"variables.css"
],
"attributes": {
"lastModification": {
"actor": "theme-manager",
"timestamp": "2025-10-20T13:05:12Z"
},
"lastModificationSignature": "4433241a2a353fad351e1fe8db51837c6ca9116ee718638505c90c131ea9494e"
}
}

View File

@@ -0,0 +1,16 @@
@import "../light/variables.css";
:root {
/* Neutrals */
--neutral-10: #F7F3F2; /* warm-10 */
--neutral-20: #E5E0DF; /* warm-20 */
--neutral-30: #CAC5C4; /* warm-30 */
--neutral-40: #ADA8A8; /* warm-40 */
--neutral-50: #8F8B8B; /* warm-50 */
--neutral-60: #736F6F; /* warm-60 */
--neutral-70: #565151; /* warm-70 */
--neutral-80: #3C3838; /* warm-80 */
--neutral-90: #272525; /* warm-90 */
--neutral-100: #171414; /* warm-100 */
}

View File

@@ -0,0 +1,6 @@
{
"chartRecordingEnabled": false,
"pruneAge": 7,
"pruneAgeUnits": "DAY",
"recordingsPerChart": 5
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:12Z"
},
"lastModificationSignature": "eab1a639fc49e2481d87059dabc0fd1cd167631e00b6eace412114b5ead515da"
}
}

View File

@@ -0,0 +1,7 @@
{
"title": "Core",
"description": "Core collection of locally managed Gateway configuration resources",
"enabled": true,
"inheritable": true,
"parent": "external"
}

View File

@@ -0,0 +1,16 @@
{
"appIcon": null,
"appIconName": null,
"appIconSize": null,
"backgroundColor": "#697077",
"buttonColor": "#0C7BB3",
"buttonTextColor": "#FFFFFF",
"enabled": false,
"favicon": null,
"faviconName": null,
"faviconSize": null,
"logo": null,
"logoName": null,
"logoType": null,
"textColor": "#FFFFFF"
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:07Z"
},
"lastModificationSignature": "a41dfd09a4de967190e8fca6f87b728bf451168e5eb47388ef29917412a1c629"
}
}

View File

@@ -0,0 +1,10 @@
{
"classname": "com.mysql.cj.jdbc.Driver",
"defaultPropInstructions": "There is an extensive list of extra connection properties available for MySQL Connector/J. See \u003ca href\u003d\u0027http://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html\u0027\u003ethe documentation\u003c/a\u003e for a table describing all connection properties.\u003cbr\u003eA default \u003ctt\u003eserverTimezone\u003c/tt\u003e value (taken from the gateway) will be appended to the connection string if one is not specified.",
"defaultProps": "zeroDateTimeBehavior\u003dCONVERT_TO_NULL;connectTimeout\u003d120000;socketTimeout\u003d120000;useSSL\u003dfalse;allowPublicKeyRetrieval\u003dtrue;rewriteBatchedStatements\u003dtrue;disableMariaDbDriver",
"defaultTranslator": "MYSQL",
"defaultValidationQuery": "SELECT 1",
"type": "MYSQL",
"urlFormat": "jdbc:mysql://localhost:3306/test",
"urlInstructions": "\u003cbr/\u003eThe format of the MySQL connect URL is:\u003cbr\u003e\u003ccode\u003ejdbc:mysql://\u003cb\u003ehost\u003c/b\u003e:\u003cb\u003eport\u003c/b\u003e/\u003cb\u003edatabase\u003c/b\u003e\u003c/code\u003e\u003cbr\u003eWith the three parameters (in bold) \u003cul style\u003d\"list-style-type:none;margin-left:10px;\"\u003e\u003cli\u003e\u003cb\u003ehost\u003c/b\u003e: The host name or IP address of the database server.\u003c/li\u003e\u003cli\u003e\u003cb\u003eport\u003c/b\u003e: The port that the database server is running on. MySQL default port is \u003cb\u003e3306\u003c/b\u003e.\u003c/li\u003e\u003cli\u003e\u003cb\u003edatabase\u003c/b\u003e: The name of the logical database that you are connecting to on the MySQL server.\u003c/li\u003e\u003c/ul\u003e"
}

View File

@@ -0,0 +1,13 @@
{
"scope": "A",
"description": "The official MySQL JDBC Driver, Connector/J.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"uuid": "af89f34e-7aa5-44a8-83f7-95f0ef9a16e0"
}
}

View File

@@ -0,0 +1,10 @@
{
"classname": "oracle.jdbc.driver.OracleDriver",
"defaultPropInstructions": "",
"defaultProps": "",
"defaultTranslator": "ORACLE",
"defaultValidationQuery": "SELECT 1 FROM DUAL",
"type": "ORACLE",
"urlFormat": "jdbc:oracle:thin:@localhost:1521:test",
"urlInstructions": "\u003cbr/\u003eThe format of the Oracle connect URL is:\u003cbr/\u003e\u003ccode\u003ejdbc:oracle:thin:@\u003cb\u003ehost\u003c/b\u003e:\u003cb\u003eport\u003c/b\u003e:\u003cb\u003eSID\u003c/b\u003e\u003c/code\u003e\u003cbr/\u003eWith the three parameters (in bold) \u003cul style\u003d\"list-style-type:none;margin-left:10px;\"\u003e\u003cli\u003e\u003cb\u003ehost\u003c/b\u003e: The host name or IP address of the database server.\u003c/li\u003e\u003cli\u003e\u003cb\u003eport\u003c/b\u003e: The port that the database server is running on. Oracle\u0027s default port is \u003cb\u003e1521\u003c/b\u003e.\u003c/li\u003e\u003cli\u003e\u003cb\u003eSID\u003c/b\u003e: the system ID that identifies the database to connect to.\u003c/li\u003e\u003c/ul\u003e"
}

View File

@@ -0,0 +1,13 @@
{
"scope": "A",
"description": "The Oracle Database JDBC driver.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"uuid": "6ee196ad-cd38-4123-bbd5-30a2c358493f"
}
}

View File

@@ -0,0 +1,10 @@
{
"classname": "org.sqlite.JDBC",
"defaultPropInstructions": "No extra connection parameters are recommended for SQLite",
"defaultProps": "",
"defaultTranslator": "SQLITE",
"defaultValidationQuery": "SELECT 1",
"type": "SQLITE",
"urlFormat": "jdbc:sqlite:C:/Path/To/File.db",
"urlInstructions": "\u003cbr/\u003eThe format of the SQLite connect URL is:\u003cbr/\u003e\u003ccode\u003ejdbc:sqlite:C:/Path/To/File.db\u003c/code\u003e\u003cbr/\u003e\u003ccode\u003ejdbc:sqlite:/path/on/linux/File.db\u003c/code\u003e\u003cbr/\u003e\u003cbr/\u003eUse \u003ccode\u003e${data}\u003c/code\u003e or \u003ccode\u003e${local}\u003c/code\u003e as a placeholder for the Ignition Gateway\u0027s data directory or local directory, respectively, as seen below:\u003cbr/\u003e\u003ccode\u003ejdbc:sqlite:${data}/File.db\u003c/code\u003e\u003cbr/\u003e\u003ccode\u003ejdbc:sqlite:${local}/Folder/File.db\u003c/code\u003e\u003cbr/\u003e\u003cbr/\u003eUse \u003ccode\u003ejdbc:sqlite::memory:\u003c/code\u003e for a temporary database.\u003cbr/\u003e"
}

View File

@@ -0,0 +1,13 @@
{
"scope": "A",
"description": "Driver for the popular embedded database system.",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"uuid": "4f5eb402-1b28-4d8c-9a30-fe8e3e6a986f"
}
}

View File

@@ -0,0 +1,26 @@
{
"alterTable": "ALTER TABLE {tablename} {alterdef}",
"alterTableColumnDef": "ADD COLUMN {columnname} {type}",
"autoIncTypeDef": "{type} NOT NULL AUTO_INCREMENT",
"blobType": "VARBINARY",
"boolType": "INT",
"columnQuoteChar": "\"",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP",
"datetimeType": "DATETIME",
"fetchKeyQuery": "",
"i1Type": "INT",
"i2Type": "INT",
"i4Type": "INT",
"i8Type": "BIGINT",
"limit": "LIMIT {limit}",
"limitClausePosition": "Back",
"primaryKeyDef": "PRIMARY KEY ({columnname})",
"r4Type": "FLOAT",
"r8Type": "DOUBLE",
"stringType": "VARCHAR(255)",
"supportsRGK": true,
"tableListFilter": "",
"textType": ""
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "59209bdb-2adc-483d-939b-c602111d8f61",
"lastModificationSignature": "c035ddd571c42f7317b1360809cb4c9fee371043291bfd07ad453a85eadcc5e6"
}
}

View File

@@ -0,0 +1,26 @@
{
"alterTable": "ALTER TABLE {tablename} ADD {alterdef}",
"alterTableColumnDef": "{columnname} {type}",
"autoIncTypeDef": "{type} IDENTITY(1, 1)",
"blobType": "VARBINARY",
"boolType": "INT",
"columnQuoteChar": "\"",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP",
"datetimeType": "DATETIME",
"fetchKeyQuery": "",
"i1Type": "INT",
"i2Type": "INT",
"i4Type": "INT",
"i8Type": "BIGINT",
"limit": "TOP {limit}",
"limitClausePosition": "Front",
"primaryKeyDef": "PRIMARY KEY CLUSTERED ({columnname})",
"r4Type": "FLOAT(10)",
"r8Type": "DOUBLE PRECISION",
"stringType": "NVARCHAR(255)",
"supportsRGK": true,
"tableListFilter": "",
"textType": "NVARCHAR(MAX)"
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "cc207fc7-6eae-457f-a836-9575e06c41d3",
"lastModificationSignature": "b4d265ed39bc3090bfb30e413a3963d1fd350c9a5059abe7c620b1d7788ae1e6"
}
}

View File

@@ -0,0 +1,26 @@
{
"alterTable": "ALTER TABLE {tablename} {alterdef}",
"alterTableColumnDef": "ADD COLUMN {columnname} {type}",
"autoIncTypeDef": "{type} NOT NULL AUTO_INCREMENT",
"blobType": "VARBINARY",
"boolType": "INT",
"columnQuoteChar": "`",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP",
"datetimeType": "DATETIME",
"fetchKeyQuery": "",
"i1Type": "INT",
"i2Type": "INT",
"i4Type": "INT",
"i8Type": "BIGINT",
"limit": "LIMIT {limit}",
"limitClausePosition": "Back",
"primaryKeyDef": "PRIMARY KEY ({columnname})",
"r4Type": "FLOAT",
"r8Type": "DOUBLE",
"stringType": "VARCHAR(255)",
"supportsRGK": true,
"tableListFilter": "",
"textType": "TEXT"
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "9ef2c8dd-c194-4910-9bda-ceb7ab5a5cef",
"lastModificationSignature": "a2d8271a65add0459e763a9a5da5ac345f9107b124b3b18b5bcdbaef43c0d4e6"
}
}

View File

@@ -0,0 +1,28 @@
{
"alterTable": "ALTER TABLE {tablename} ADD ({alterdef})",
"alterTableColumnDef": "{columnname} {type}",
"autoIncTypeDef": "{type} NOT NULL",
"blobType": "VARBINARY",
"boolType": "INT",
"columnQuoteChar": "\"",
"createAutoIncSequence": "CREATE SEQUENCE {tablename}_seq START WITH 1 INCREMENT BY 1",
"createAutoIncTrigger": "CREATE TRIGGER {tablename}_trig \nBEFORE INSERT ON {tablename} \nREFERENCING NEW AS NEW\nFOR EACH ROW \nBEGIN \n SELECT {tablename}_seq.NEXTVAL \n INTO :NEW.{columnname} FROM DUAL;\nEND;",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP FROM DUAL",
"datetimeType": "TIMESTAMP",
"fetchKeyQuery": "SELECT {tablename}_seq.CURRVAL FROM DUAL",
"i1Type": "INT",
"i2Type": "INT",
"i4Type": "INT",
"i8Type": "INT",
"limit": "ROWNUM \u003c\u003d {limit}",
"limitClausePosition": "Wrap",
"primaryKeyDef": "PRIMARY KEY ({columnname})",
"r4Type": "FLOAT",
"r8Type": "DOUBLE PRECISION",
"stringType": "VARCHAR2(255)",
"supportsRGK": false,
"tableListFilter": "SYS_INFO*;*SYSTEM*;WWV*;*$*;DBA*;LOGMNR*;ORDDCM*;APEX*;ALL_SA*;DATABASE*;DV_*;GSM*;HELP;MVIEW*;ORD_*;PRODUCT_PRIVS;REDO_*;SCHEDULER_*;SERVICE*;SI_*;SQLPLUS*;SYS_*;USER_SA*;VERIFY_HISTORY;VNCR;WLM_*;XML_*;CLOUD;REGION;CHANGE_LOG*",
"textType": "NCLOB"
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "4232bf13-511c-4e57-9eb8-b3a9ef67520d",
"lastModificationSignature": "cb24aeb5636e155629f2ebdfa8dff5e1bdefbcbfc1f39bebb07bd440cb52977a"
}
}

View File

@@ -0,0 +1,26 @@
{
"alterTable": "ALTER TABLE {tablename} {alterdef}",
"alterTableColumnDef": "ADD COLUMN {columnname} {type}",
"autoIncTypeDef": "SERIAL NOT NULL",
"blobType": "BYTEA",
"boolType": "INT",
"columnQuoteChar": "\"",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP",
"datetimeType": "TIMESTAMP",
"fetchKeyQuery": "",
"i1Type": "INT",
"i2Type": "INT",
"i4Type": "INT",
"i8Type": "BIGINT",
"limit": "LIMIT {limit}",
"limitClausePosition": "Back",
"primaryKeyDef": "PRIMARY KEY ({columnname})",
"r4Type": "FLOAT",
"r8Type": "DOUBLE PRECISION",
"stringType": "VARCHAR(255)",
"supportsRGK": true,
"tableListFilter": "",
"textType": "TEXT"
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "6a71b7d7-8bec-437a-a7b7-51b07991b4d8",
"lastModificationSignature": "fcee927e84147d6ef01d0c1ca425d7816619de89cf682657ab595d90c2087849"
}
}

View File

@@ -0,0 +1,26 @@
{
"alterTable": "ALTER TABLE {tablename} {alterdef}",
"alterTableColumnDef": "ADD COLUMN {columnname} {type}",
"autoIncTypeDef": "INTEGER PRIMARY KEY",
"blobType": "BLOB",
"boolType": "INTEGER",
"columnQuoteChar": "\"",
"createIndex": "CREATE INDEX {indexname} ON {tablename}({columnname})",
"createTable": "CREATE TABLE {tablename} ({creationdef}{primarykeydef})",
"currentTimeQuery": "SELECT CURRENT_TIMESTAMP",
"datetimeType": "TEXT",
"fetchKeyQuery": "",
"i1Type": "INTEGER",
"i2Type": "INTEGER",
"i4Type": "INTEGER",
"i8Type": "INTEGER",
"limit": "LIMIT {limit}",
"limitClausePosition": "Back",
"primaryKeyDef": "",
"r4Type": "REAL",
"r8Type": "REAL",
"stringType": "TEXT",
"supportsRGK": true,
"tableListFilter": "",
"textType": "TEXT"
}

View File

@@ -0,0 +1,17 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:20Z"
},
"uuid": "aee9329e-7194-48e6-9217-54d7dbc20da2",
"lastModificationSignature": "abb73132a87017752132ba272dc66f3e6a54dccfdb6a4ffdcb9cdfcc90316ccc"
}
}

View File

@@ -0,0 +1,5 @@
{
"historianName": "Edge Historian",
"projectName": "Edge",
"visualizationName": "VISION"
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "default",
"timestamp": "2025-10-20T13:05:07Z"
},
"lastModificationSignature": "67cadf1521ff462a2fadf0e9438ab88c0d580aad8d55e2f00138fc285c38af9e"
}
}

View File

@@ -0,0 +1,3 @@
{
"proxyRules": []
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "8.3-migration",
"timestamp": "2025-10-20T13:05:06Z"
},
"lastModificationSignature": "379de83da348c0df53236575f29f2ece21334cfacec190bb81e2fbf41859794d"
}
}

View File

@@ -0,0 +1,39 @@
{
"queueSettings": [
{
"description": "Generic Gateway Network queue",
"friendlyName": "Default Queue",
"maxActive": -1,
"queueId": "_default_",
"timeoutMillis": 60000
},
{
"description": "Handles gateway network diagnostic information messages",
"friendlyName": "Diagnostic Info Queue",
"maxActive": -1,
"queueId": "diagnosticInfoQueue",
"timeoutMillis": 300000
},
{
"description": "Handles results for remote service calls over the Gateway Network",
"friendlyName": "Call Results Queue",
"maxActive": -1,
"queueId": "_rpcReturn_",
"timeoutMillis": 60000
},
{
"description": "Handles messages that take up to an hour to deliver",
"friendlyName": "Long Wait Queue",
"maxActive": -1,
"queueId": "longWaitQueue",
"timeoutMillis": 3600000
},
{
"description": "Forwards requests through a proxy Gateway",
"friendlyName": "Proxy Queue",
"maxActive": -1,
"queueId": "_proxy_",
"timeoutMillis": 3600000
}
]
}

View File

@@ -0,0 +1,16 @@
{
"scope": "A",
"version": 1,
"restricted": false,
"overridable": true,
"files": [
"config.json"
],
"attributes": {
"lastModification": {
"actor": "8.3-migration",
"timestamp": "2025-10-20T13:05:05Z"
},
"lastModificationSignature": "37e4da2e07ee109e30f7aabc61a6dc1f3d065e2a4cfd6b80447666427dd3b7ac"
}
}

Some files were not shown because too many files have changed in this diff Show More