main
John Lauer Publish 0.2.0 791d99c 11d ago
{
  "schema": "adom/component-states@1",
  "mpn": "MF40200V1-1000U-G99",
  "kind": "fan",
  "default": "off",
  "variables": {
    "speed": {
      "type": "number",
      "unit": "rpm",
      "min": 0,
      "max": 10000,
      "default": 0,
      "description": "Actual rotor speed in the declared data source, not requested supply or nominal speed."
    }
  },
  "states": [
    {
      "id": "off",
      "label": "Off",
      "summary": "Rotor stopped. No implicit coast-down model.",
      "models": {
        "step": "cad/MF40200V1-1000U-G99-ai-nominal.step",
        "glb": "cad/MF40200V1-1000U-G99-ai-nominal.glb"
      },
      "values": {
        "speed": 0
      },
      "motion": {
        "playing": false
      },
      "image": "artwork/fan-off.png",
      "when": {
        "text": "Explicit stopped state; unknown telemetry must not be presented as verified off."
      }
    },
    {
      "id": "on",
      "label": "On",
      "summary": "Rotating at the supplied speed variable.",
      "models": {
        "step": "cad/MF40200V1-1000U-G99-ai-nominal.step",
        "glb": "states/fan-animated.glb"
      },
      "values": {
        "speed": 7000
      },
      "motion": {
        "playing": true
      },
      "image": "artwork/fan-on.png",
      "when": {
        "text": "Explicit simulated rotor speed or valid measured tachometer RPM; supply presence alone is insufficient."
      }
    }
  ],
  "motion": {
    "schema": "adom/component-motion@1",
    "status": "proposed-extension",
    "model": "states/fan-animated.glb",
    "sha256": "629daff4b81acf3e45149202b41f425deffbcce23a0bbd003a48c08770d730cf",
    "requiredCapability": "component-motion@1",
    "nodes": {
      "assembly": "Fan.Assembly",
      "stationary": "Fan.Housing",
      "rotor": "Fan.Rotor"
    },
    "bindings": [
      {
        "id": "rotor",
        "node": "Fan.Rotor",
        "animation": "Fan.Rotor.Revolution",
        "variable": "speed",
        "unit": "rpm",
        "cycleDurationSeconds": 1,
        "revolutionsPerCycle": 1,
        "axisLocal": [
          0,
          0,
          1
        ],
        "pivotLocalMeters": [
          0,
          0,
          0
        ],
        "direction": "negative right-hand rotation about local Z; illustrative orientation",
        "mapping": "rpm-to-cycle-rate",
        "offBehavior": "pause-preserve-phase"
      }
    ],
    "presentation": {
      "defaultTimeScale": 1,
      "previewTimeScale": 0.02,
      "labelRequiredWhenScaled": true,
      "highRpmAliasingWarning": true
    },
    "telemetry": {
      "defaultSource": "simulated",
      "sources": [
        "simulated",
        "measured"
      ],
      "validRequired": true,
      "staleBehavior": "pause-and-label-unknown",
      "doesNotControlHardware": true
    }
  },
  "electrical": {
    "supply_V": 5,
    "nominal_rpm": 7000,
    "tach_pulses_per_revolution": 2,
    "source": "Sunon D04114960G-01 pages 3 and 8"
  },
  "pins": {
    "supply": "1 (red lead, library convention)",
    "ground": "2 (black lead)",
    "tach": "3 (yellow lead)"
  },
  "limitations": [
    "Motion extension pending ecosystem adoption",
    "STEP is static mechanical geometry; playback lives in GLB/runtime",
    "Rotor blades and supports are illustrative, not exact vendor geometry",
    "Rotation direction requires physical verification",
    "No airflow, inertia, thermal or safety proof from animation"
  ],
  "heroPresentation": {
    "schema": "adom/hero-state-presentation@1",
    "status": "authored-presentation-metadata",
    "model": "mf40200v1-1000u-g99-hero.glb",
    "animation": "Fan.Hero.GentleStateCycle",
    "node": "Fan.Rotor",
    "source": "simulated",
    "controlsHardware": false,
    "durationSeconds": 20,
    "loop": true,
    "schedule": [
      {
        "from": 0,
        "to": 4,
        "state": "off"
      },
      {
        "from": 4,
        "to": 8,
        "state": "spin-up",
        "easing": "smoothstep velocity"
      },
      {
        "from": 8,
        "to": 12,
        "state": "on"
      },
      {
        "from": 12,
        "to": 16,
        "state": "spin-down",
        "easing": "smoothstep velocity"
      },
      {
        "from": 16,
        "to": 20,
        "state": "off"
      }
    ],
    "peakRepresentedRpm": 7000,
    "peakVisualRpm": 15,
    "presentationTimeScale": 0.002142857142857143,
    "meaning": "Illustrative slow-motion state demonstration, not measured speed or a physical inertia model",
    "animationOff": "first frame stopped",
    "repeatSeam": "two complete turns; stopped at both ends",
    "stationary": [
      "Fan.Housing",
      "Fan.Connection"
    ]
  }
}