   setbackLockout>
   cttBasic;
 
-#define ENABLE_MODELLED_RAD_VALVE
-#define ENABLE_NOMINAL_RAD_VALVE
 // Internal model of controlled radiator valve position.
 OTRadValve::ModelledRadValve NominalRadValve(
   &cttBasic,

        OTV0P2BASE::CLI::resetCLIActiveTimer();
        // Process the input received, with action based on the first char...
        switch(buf[0]) {
            // Explicit request for help, or unrecognised first character.
            // Avoid showing status as may already be rather a lot of output.
            default: case '?': { dumpCLIUsage(); break; }
            // Exit/deactivate CLI immediately.
            // This should be followed by JUST CR ('\r') OR LF ('\n')
            // else the second will wake the CLI up again.
            case 'E': { OTV0P2BASE::CLI::makeCLIInactive(); break; }
            // Show/set generic parameter values (eg "G N [M]").
            case 'G': { OTV0P2BASE::CLI::GenericParam().doCommand(buf, n); break; }
            // Reset or display ID.
            case 'I': { OTV0P2BASE::CLI::NodeIDWithSet().doCommand(buf, n); break; }
            // Status line stats print and TX.
            case 'S': {
                Serial.print(F("Resets: "));
                const uint8_t resetCount = eeprom_read_byte((uint8_t *)V0P2BASE_EE_START_RESET_COUNT);
                Serial.print(resetCount);
                Serial.println();
                // Show stack headroom.
                OTV0P2BASE::serialPrintAndFlush(F("SH ")); OTV0P2BASE::serialPrintAndFlush(OTV0P2BASE::MemoryChecks::getMinSPSpaceBelowStackToEnd()); OTV0P2BASE::serialPrintlnAndFlush();
                // Default light-weight print and TX of stats.
//                bareStatsTX();  // FIXME No way this won't overflow!
                break; // Note that status is by default printed after processing input line.
            }
            // Switch to FROST mode OR set FROST/setback temperature (even with temp pot available).
            // With F! force to frost and holiday (long-vacant) mode.  Useful for testing and for remote CLI use.
            case 'F': {
                valveMode.setWarmModeDebounced(false); // No parameter supplied; switch to FROST mode.
                break;
            }
            /**
            * Set secret key.
            * @note  The OTRadioLink::SimpleSecureFrame32or0BodyTXV0p2::resetRaw3BytePersistentTXRestartCounterCond
            *        function pointer MUST be passed here to ensure safe handling of the key and the Tx message
            *        counter.
            */
            case 'K': { OTV0P2BASE::CLI::SetSecretKey(OTRadioLink::SimpleSecureFrame32or0BodyTXV0p2::resetRaw3BytePersistentTXRestartCounterCond).doCommand(buf, n); break; }
            // Switch to WARM (not BAKE) mode OR set WARM temperature.
            case 'W':{
                valveMode.cancelBakeDebounced(); // Ensure BAKE mode not entered.
                valveMode.setWarmModeDebounced(true); // No parameter supplied; switch to WARM mode.
                break;
            }
            // Zap/erase learned statistics.
            case 'Z': { OTV0P2BASE::CLI::ZapStats().doCommand(buf, n); break; }
        }
        // Else show ack of command received.
        Serial.println(F("OK"));

    // and which should also allow some energy-saving sleep.
    if(OTV0P2BASE::CLI::isCLIActive()) {
        const uint8_t stopBy = nearOverrunThreshold - 1;
        char buf[BUFSIZ_pollUI];
        OTV0P2BASE::ScratchSpace s((uint8_t*)buf, sizeof(buf));
        pollCLI(stopBy, 0 == TIME_LSD, s);
    }

    panic();
#if defined(EST_CPU_DUTYCYCLE)
    const unsigned long usEnd = micros();
    // Nominal loop time should be 2s x 1MHz clock, ie 2,000,000 if CPU running all the time.
