main
John Lauer Add prototype library assets with source provenance and explicit mounting/motion limits cc48557 6d ago
{
  "schema": "adom/component-states@1",
  "mpn": "CFM-4010-03-22",
  "kind": "fan",
  "default": "off",
  "variables": {
    "speed": {
      "type": "number",
      "unit": "rpm",
      "min": 0,
      "max": 12000,
      "default": 0,
      "description": "Simulated or valid measured rotor RPM; never infer from duty alone."
    }
  },
  "states": [
    {
      "id": "off",
      "label": "Off",
      "values": {
        "speed": 0
      },
      "motion": {
        "playing": false
      },
      "models": {
        "step": "cad/manufacturer.step",
        "glb": "states/fan-animated.glb"
      },
      "image": "hero.png",
      "description": "Runtime rotation binds speed in RPM; a static STEP cannot depict rotation."
    },
    {
      "id": "on",
      "label": "On",
      "values": {
        "speed": 8300
      },
      "motion": {
        "playing": true
      },
      "models": {
        "step": "cad/manufacturer.step",
        "glb": "states/fan-animated.glb"
      },
      "image": "hero.png",
      "description": "Runtime rotation binds speed in RPM; a static STEP cannot depict rotation."
    }
  ],
  "motion": {
    "schema": "adom/component-motion@1",
    "model": "states/fan-animated.glb",
    "sha256": "391a0c11c73d67a601e061df0a9e2ea002b1b164f66f4f97ae5122666d85eb5b",
    "nodes": {
      "assembly": "Fan.Assembly",
      "stationary": "Fan.Housing",
      "rotor": "Fan.RotorSpin"
    },
    "bindings": [
      {
        "id": "rotor",
        "node": "Fan.RotorSpin",
        "animation": "Fan.Rotor.Revolution",
        "variable": "speed",
        "unit": "rpm",
        "cycleDurationSeconds": 1,
        "revolutionsPerCycle": 1,
        "axisLocal": [
          0,
          0,
          1
        ],
        "mapping": "rpm-to-cycle-rate",
        "offBehavior": "pause-preserve-phase"
      }
    ],
    "presentation": {
      "previewTimeScale": 0.002,
      "labelRequiredWhenScaled": true,
      "heroCycle": {
        "idleSeconds": 4,
        "rampUpSeconds": 5,
        "runningSeconds": 2,
        "rampDownSeconds": 5,
        "source": "illustrative; not measured spin-up or coast-down"
      },
      "bakedHero": {
        "model": "hero.glb",
        "animation": "Fan.Hero.GentleCycle",
        "durationSeconds": 20,
        "scheduleSeconds": {
          "idle": 4,
          "rampUp": 5,
          "running": 2,
          "rampDown": 5,
          "rest": 4
        },
        "timeScale": 0.002065404475043029,
        "source": "Illustrative animation, not measured spin-up; exact two-turn phase continuity",
        "sha256": "475c84914e8de4d288ab4c525644da812537863835433a673e483920a3f75bd1"
      }
    },
    "telemetry": {
      "defaultSource": "simulated",
      "validRequired": true,
      "staleBehavior": "pause-and-label-unknown",
      "doesNotControlHardware": true
    }
  },
  "electrical": {
    "supply_V": 5,
    "nominal_rpm": 8300,
    "tach_pulses_per_revolution": 2,
    "source": "https://www.sameskydevices.com/product/resource/cfm-40.pdf"
  },
  "limitations": [
    "Animation direction not physically verified",
    "PWM frequency and zero-duty behavior require confirmation",
    "No airflow or thermal proof from animation",
    "Manufacturer CAD has bare leads; harness connector remains a separate assembly part"
  ]
}