class SenderInterface { async connect() { throw new Error('connect() must be implemented by sender classes'); } send(command) { throw new Error('send() must be implemented by sender classes'); } getStatus() { throw new Error('getStatus() must be implemented by sender classes'); } disconnect() { throw new Error('disconnect() must be implemented by sender classes'); } /** * Emergency Stop: Bewegung sofort stoppen (best-effort). * Standard-Implementierung: no-op (wird übersprungen). * Override in TelnetSenderGRBL → sendet '!' (FluidNC Feed Hold). * Override in ShellyEmergencyStop → schneidet Strom ab. * @returns {Promise<{ok: boolean, skipped?: boolean}>} */ async emergencyStop() { return { ok: true, skipped: true }; } /** * Alarm-Unlock: Controller nach Strom-Neustart entsperren. * Standard-Implementierung: no-op (wird übersprungen). * Override in TelnetSenderGRBL → sendet '$X'. * @returns {Promise<{ok: boolean, skipped?: boolean}>} */ async alarmUnlock() { return { ok: true, skipped: true }; } } module.exports = SenderInterface;