MachineSignals
MachineSignals started as ICS, an internal Industrial Control Systems project, before the rebrand. The hardware is real: Arduino Uno sensor nodes talk over an nRF24L01 mesh (RF24Network/RF24Mesh), each carrying a DS2401 chip for a hardware-unique ID, reading a DHT11 for temperature and humidity, up to three analog pressure sensors, and an interrupt-driven optical counter for production pulses. An ESP32 gateway (TinyGSM plus PubSubClient) bridges the mesh to MQTT, publishing to the same v1/telemetry topics the backend’s hardware listener subscribes to.
Behind the gateway, two NestJS services share one MySQL database and one Mosquitto broker: an HTTP API and a worker that consumes the MQTT stream. A third service, dedicated to time-series data, keeps its own in-memory buckets and exposes them to the Vue/Vuetify dashboard over a WebSocket, so sensor charts update live without polling.
The dashboard’s headline number is OEE: Availability times Efficiency times Quality, computed straight from the raw optical, temperature, humidity, pressure, and current sensor stream, with no synthetic scoring behind it.
Standing the stack up surfaced two real bugs, not staged ones. A gate-registration race let two nodes claiming the same serial number collide. On any node with more than one optical sensor, the OEE calculation read the GUID from the first sensor in the list instead of the sensor actually being measured: one node with five optical sensors reported 19,102% efficiency before the fix. Both are patched and running on the stand today.
OEE tells you a machine went down after the fact. We’re building toward catching it before: a maintenance-log table now records every planned and unplanned service event per node, the labeled data an anomaly-detection model needs and the one thing an IIoT platform can’t retrofit later. Vibration sensing is next.