====== OT Demo — GitOps Helm Chart ======
Simulated industrial OT environment deployed via Fleet on ZKS. All components run as Kubernetes pods in the ''ot-demo'' namespace and communicate over Kubernetes DNS.
----
===== GitOps Source =====
The Helm chart source for this demo is maintained in the ZEDEDA ZKS repository:
* [[https://github.com/ManCalAzure/zks/tree/main/demo/charts/inactive/ot-demo|OT Demo Helm Chart — GitHub]]
----
===== Architecture Flow =====
flowchart TD
subgraph Sensors["Sensor Simulators (zedmanny/mqtt-demo:hum-vib-v1)"]
S1[temp-sim]
S2[humidity-sim]
S3[press-sim]
S4[vibration-sim]
S5[gas-sim]
S6[rpm-sim]
S7[conveyor-actuator]
end
MQTT["MQTT Broker eclipse/mosquitto:1.4.8 :1883"]
vPLC["vPLC Sim - vplc_engine.py"]
subgraph Dashboards["Node-RED Dashboards"]
NR["node-red 172.16.8.252:1880/ui"]
NRO["node-red-ops 172.16.8.253:1880/ops"]
end
S1 & S2 & S3 & S4 & S5 & S6 & S7 -->|"factory/sensors/type"| MQTT
MQTT -->|"factory/sensors/+"| vPLC
vPLC -->|"factory/plc/state, alarms, cmd"| MQTT
MQTT -->|"factory/sensors/+ plc/state alarms"| NR
MQTT -->|"factory/sensors/+ alarms state conveyor"| NRO
NRO -->|"factory/plc/cmd/manual reset"| MQTT
----
===== Components =====
^ Pod ^ Image ^ Purpose ^
| ''mqtt-broker'' | ''eclipse/mosquitto:1.4.8'' | Central MQTT message bus on port 1883 |
| ''temp-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes temperature to ''factory/sensors/thermometer'' |
| ''humidity-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes humidity to ''factory/sensors/humidity'' |
| ''press-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes pressure to ''factory/sensors/press'' |
| ''vibration-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes vibration to ''factory/sensors/vibration'' |
| ''gas-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes gas level to ''factory/sensors/gas'' |
| ''rpm-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Publishes RPM to ''factory/sensors/rpm'' |
| ''conveyor-actuator'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Simulates conveyor actuator feedback |
| ''vplc-sim'' | ''zedmanny/mqtt-demo:hum-vib-v1'' | Evaluates sensor alarms, commands conveyor, publishes PLC state |
| ''node-red'' | ''nodered/node-red:latest'' | Sensor gauge dashboard + vPLC status widgets |
| ''node-red-ops'' | ''nodered/node-red:latest'' | Wind Turbine Ops Board with stop/run/reset controls |
----
===== vPLC Alarm Thresholds =====
^ Sensor ^ Warn ^ Trip ^ Mode ^
| thermometer | 37.5 °C | 40.0 °C | high |
| humidity | 75% | 85% | high |
| press | 1000 hPa | 500 hPa | low |
| vibration | 37.5 mm/s | 45.0 mm/s | high |
| gas | 850 PPM | 920 PPM | high |
When any sensor hits **TRIP**, the vPLC latches ''trip_latched=true'' and commands the conveyor to STOP. A manual **Reset Trip** from the Ops board clears the latch.
----
===== Access =====
^ Dashboard ^ URL ^
| Sensor Dashboard | [[http://172.16.8.252:1880/ui]] |
| Ops Board | [[http://172.16.8.253:1880/ops]] |
----
===== Chart Structure =====
ot-demo/
├── Chart.yaml
├── fleet.yaml # Fleet: namespace ot-demo, createNamespace: true
├── values.yaml # Images, IPs, sensor instances
├── files/
│ ├── vplc_engine.py # vPLC Python logic (mounted via ConfigMap)
│ ├── node-red-flows.json # Sensor dashboard flows
│ └── node-red-ops-flows.json # Ops board flows
└── templates/
├── mqtt-broker.yaml # Deployment + ConfigMap (mosquitto.conf) + Service
├── sensors.yaml # Deployment per sensors.instances entry
├── vplc.yaml # Deployment + ConfigMap (vplc_engine.py)
└── node-red.yaml # Deployments + ConfigMaps + LoadBalancer Services
----
===== Deployment Notes =====
* All pods resolve each other by service name (e.g. ''mqtt-broker'') via Kubernetes DNS within the ''ot-demo'' namespace.
* Node-RED flows and the vPLC script are embedded in ConfigMaps from the ''files/'' directory using ''.Files.Get''.
* The ''node-red-dashboard'' npm package is installed at container startup via the ''start_nodered.sh'' script.
* MetalLB must be installed manually (''kubectl apply -f metallb-native.yaml'') before the LoadBalancer IPs will be assigned.