           setLeds1(red, ledSolid);
           doorState = doorBlocked;
         }
+      }
+      // hold the door open if button pressed
+      // TODO: another possibility would be to fall-through to doorBlocked
+      // and close the door instead. which way is better?
+      if (swTrigger == LOW) {
+        motorFree();
+        debug(currentMillis, F("Button switch triggered - door blocked\r\n"));
+        setLeds1(red, ledSolid);
+        doorState = doorBlocked;
+        swTrigger = HIGH;
       }
       break;
 

  switch(doorState) {
    case doorClosed:
      // wait until a button is pressed or the front switch opens
      if (swFront == HIGH || swTrigger == LOW) {
        if (swFront == HIGH) {
          // maybe someone tried to pull the door open
          // TODO: or the door slams too fast into the end-stop and rebounds. align profile & inertial reality
          debug(currentMillis, F("Front switch triggered - opening door\r\n"));
          initDrive(backward, accelProfileLow);
        } else {
          debug(currentMillis, F("Button switch triggered - opening door\r\n"));
          initDrive(backward, accelProfileHigh);
          swTrigger = HIGH; // re-arm swTrigger
        }
        setLeds2(white, black, EXTRAPIX, ledBackward);
        doorState = doorOpening;

  accelProfile = profile;
  accelProfileIdx = 0;
  drivePWM = accelProfile[0].startPWM;
  driveMillis = driveProfileMillis = driveTotalMillis = 0;

  switch(motorDir) {
    case forward:
