An open vocabulary for normalizing industrial equipment telemetry across manufacturers, protocols, and platforms.
366 canonical fields. 16,908 vendor tag mappings. 18 OEM families. MIT licensed.
Industrial equipment from N manufacturers produces telemetry in N incompatible
formats. A spindle speed is S1_ActualVelocity on one controller,
SP_SPEED [RPM] on another, and Rotational_Speed_1/min on a third. All three
are the same physical quantity, and nothing in the data says so.
Every integration solves this again from scratch. The mapping table gets rebuilt per vendor, per site, per project, then thrown away when the project ends.
This repository is the dictionary: the agreed target vocabulary that vendor-specific tags get translated into.
| Vertical | Fields | Covers |
|---|---|---|
cnc |
82 | CNC machine tools |
robotics |
53 | Robotics |
additive |
6 | Additive manufacturing |
vehicle |
64 | Vehicles and off-highway |
amr |
10 | Autonomous mobile robots |
universal |
151 | Universal (cross-vertical) |
Every field has a name and a vertical. Where the source data supports it, a field also has a type, a unit, and an example value. Each field lists the real vendor tags observed to map onto it, and which OEM families those tags came from.
{
"field": "spindle_speed_rpm",
"type": "integer",
"unit": "rpm",
"description": "Speed of the spindle, in rpm.",
"vertical": "cnc",
"example_value": 3400,
"mapped_from": ["Act Sp Speed (RPM)", "SP_SPEED [RPM]", "SPRPM (1/min)",
"Rotational_Speed_1/min", "spindle_velocity[rpm]", "S1_ActualVelocity"],
"oem_coverage": ["brother", "dmg_mori", "fanuc", "haas", "heidenhain",
"hurco", "mazak", "mitsubishi", "siemens", "tornos"],
"mapping_count": 307
}schema/
fields.json all 366 canonical fields, full metadata
fields.csv same data, one row per field
oem-mappings/ {raw_tag: canonical_field} per OEM family
verticals/ field lists per machine class
docs/
FIELD_REFERENCE.md every field, documented
INTEGRATION_GUIDE.md how to use this in your project
CONTRIBUTING.md how to submit mappings and fields
WHY_CANONICAL.md why two decades of standards did not close this
Use these field names in your agents, dashboards, automations, and integrations. When every system uses the same names, interoperability stops being a project.
import json, urllib.request
URL = ("https://raw.githubusercontent.com/FoundryNet/canonical-schema"
"/main/schema/fields.json")
schema = json.load(urllib.request.urlopen(URL))
by_name = {f["field"]: f for f in schema["fields"]}
# Reverse index: any known vendor tag to its canonical field
lookup = {tag: f["field"] for f in schema["fields"] for tag in f["mapped_from"]}
print(lookup.get("S1_ActualVelocity")) # spindle_speed_rpmSee docs/INTEGRATION_GUIDE.md for adapter patterns, validation, and unit handling.
1,865 of the 16,908 mappings are attributed to a named OEM family. The rest are generic, cross-vendor, and multilingual tag variants that belong to no single manufacturer.
| OEM family | Vendor tags | Canonical fields touched |
|---|---|---|
abb |
17 | 4 |
brother |
27 | 23 |
caterpillar |
21 | 19 |
dmg_mori |
43 | 20 |
doosan |
25 | 23 |
fanuc |
759 | 66 |
haas |
240 | 34 |
heidenhain |
44 | 33 |
hurco |
17 | 15 |
komatsu |
8 | 8 |
kuka |
44 | 6 |
mazak |
46 | 19 |
mitsubishi |
30 | 29 |
octoprint |
17 | 17 |
okuma |
34 | 18 |
siemens |
440 | 56 |
tornos |
29 | 25 |
universal_robots |
24 | 3 |
This comes out of a production mapping corpus. That corpus was built to answer one question, "what canonical field does this tag mean?", so its descriptive metadata is uneven. The files record which values were measured and which were inferred, rather than presenting a uniform guess:
- Types. 172 of 366 fields have a type. 101 of those are marked
observed, meaning the type came from real sample values. The rest are inferred from a unit or a name suffix. 194 fields are markedunspecifiedbecause there was no basis to state one. - Units. 58 of 366 fields carry a unit.
declaredmeans a vertical pack states it.derivedmeans the field-name suffix implies it. A missing unit means unknown, not dimensionless. - Descriptions. These are generated from the field name and unit. They are editorial rather than extracted, and they are the easiest thing to improve.
- Process manufacturing.
schema/verticals/process.jsonlists 74 process fields for pharma, food and beverage, and chemical equipment. None of them have vendor tag mappings yet, so they are not counted in the 366.
Every field carries type_source and unit_source so you can filter down to
only what was measured. Closing these gaps is what
CONTRIBUTING.md is for.
The schema is the dictionary. Translating arbitrary vendor telemetry into it, including tags that have never been seen before, is a separate problem. That is what the Forge kernel does, and it is a commercial product that is not part of this repository.
The schema is free. The translation is the product.
MIT. See LICENSE. Use it in commercial products, fork it, vendor it, embed it. Attribution is appreciated and not required.
Built by Foundry Labs.