====== 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.