{
    "key": "pump-5v-mini",
    "kind": "actuator",
    "model": {
        "aliases": [
            "pump-5v-mini"
        ],
        "device_class": "pump"
    },
    "driver": {
        "runtime": {
            "init": {
                "args": {
                    "chip": "{gpio_chip}",
                    "line": "{control_pin}",
                    "active_low": "{active_low}"
                },
                "class": "drivers.gpio_switch.GPIOSwitch"
            },
            "apt_packages": [
                "python3-libgpiod"
            ],
            "pip_packages": [
                "gpiod"
            ],
            "python_module": "drivers.gpio_switch"
        },
        "targets": [
            "raspberrypi"
        ],
        "verified": {
            "by": null,
            "os": null,
            "date": null,
            "board": null,
            "reviewed_by": null,
            "evidence_url": null
        },
        "interface": "gpio-digital",
        "connection": {
            "pins": [
                {
                    "role": "control",
                    "notes": "Drives a MOSFET or relay.",
                    "required": true
                }
            ],
            "supply_voltage": "5V load, 3.3V logic",
            "level_shift_required": null
        },
        "constraints": {
            "warmup_seconds": null,
            "read_timeout_seconds": null,
            "min_read_interval_seconds": null
        },
        "failure_modes": [
            "An inductive load generates a reverse voltage spike when de-energised. A flyback diode across the load is mandatory or the switching device fails, often shorted and permanently on.",
            "Coil current exceeds any GPIO pin. A driver transistor or relay is required between the pin and the load.",
            "Holding a solenoid energised heats the coil continuously. Sustained duty needs either a rated continuous-duty part or an enforced maximum on time.",
            "Running dry destroys the impeller seal within minutes. A pump command needs an enforced maximum on time independent of whatever asked for it."
        ]
    },
    "source": "platform-seed",
    "status": "draft",
    "platform": {
        "name": "5V Mini Submersible Water Pump",
        "states": [
            {
                "label": "On",
                "command": "ON",
                "payload": "ON",
                "parameter": null,
                "sort_order": 1,
                "description": "Start the pump"
            },
            {
                "label": "Off",
                "command": "OFF",
                "payload": "OFF",
                "parameter": null,
                "sort_order": 2,
                "description": "Stop the pump"
            },
            {
                "label": "Pulse",
                "command": "PULSE",
                "payload": "{\"duration_ms\": 3000}",
                "parameter": {
                    "name": "duration",
                    "required": true,
                    "data_type": "integer",
                    "range_max": 30,
                    "range_min": 1,
                    "unit_symbol": "s"
                },
                "sort_order": 3,
                "description": "Run pump for a specified duration in milliseconds then stop automatically"
            }
        ],
        "protocol": "gpio",
        "description": "Small 5V DC submersible water pump. GPIO or relay controlled. Used for irrigation, fountains and liquid dispensing.",
        "manufacturer": null,
        "model_number": "PUMP-5V-MINI",
        "actuator_type": "pump",
        "datasheet_url": null,
        "command_topic_suffix": "command/pump",
        "response_topic_suffix": "response/pump"
    },
    "revision": 1
}