Greenhouse delay

Ya know I think I may have finally figured it out. Think I'll share in case someone else is trying to do the same. the DS3231 library is from rinkydink.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <Sabertooth.h>

Sabertooth ST1[2] = { Sabertooth(128), Sabertooth(129) } ;
LiquidCrystal_I2C lcd(0x27,20,4) ;
DS3231  rtc(SDA, SCL) ;

Time  t ;

unsigned long currentMillis;
unsigned long interval = 5000UL;
unsigned long startfun;
unsigned long startMillis;

boolean closed_state = 0 ;
boolean open_state = 1 ;
boolean opening_state = 0 ;
boolean closing_state = 0 ;

int Hor ;
int Min ;
int Sec ;

boolean relay_on = false ;
boolean relay_off = true ;

int induct = A0 ;
//int inductB = A1 ;
int Relay = 8 ;
int val = 0 ;

//....................................
void setup() 
{ Serial.begin(9600) ;
  Wire.begin() ;
  rtc.begin() ;
  SabertoothTXPinSerial.begin(9600) ;
  Sabertooth::autobaud(SabertoothTXPinSerial) ;
  lcd.init() ;
  lcd.begin(20,4) ;
  lcd.backlight() ;
  pinMode(Relay,OUTPUT) ;
  digitalWrite(Relay,HIGH) ;
  startMillis = millis();
  lcd.setCursor(0,0) ;
  lcd.print("Flowers") ;
  delay(2000) ;
  lcd.clear() ; }
  
//....................................  
void loop() 
{ val = analogRead(induct) ;
  currentMillis = millis() ;
  
  t = rtc.getTime() ;
  Hor = t.hour ;
  Min = t.min ;
  Sec = t.sec ;
  if ((currentMillis - startMillis) >= 1000UL){
  lcd.setCursor(0,0) ;
  lcd.print("Time: ") ;
  lcd.print(rtc.getTimeStr()) ;
  lcd.setCursor(0,1) ;
  lcd.print("Date: ") ;
  lcd.print(rtc.getDateStr()) ;
  startMillis = currentMillis ;}
    
//.................................... 
if( Hor == 7 &&  (Min == 30 || Min == 31))

{ OpenFunc () ; }

//....................................
if(Hor == 19 && (Min == 30 || Min == 31))

{ CloseFunc () ; }}

//....................................
void OpenFunc(){
  if (relay_off and closed_state){
      digitalWrite(Relay,LOW) ;
      startfun = currentMillis;
      relay_on = true ;
      relay_off = false;
} else {
  if((currentMillis - startfun)>= interval){
      if (relay_on){
          lcd.setCursor(0,3) ;
          lcd.print("Opening...") ;
          closed_state = false ;
          opening_state = true ;
          ST1[0].motor(1, 60) ;
          ST1[1].motor(1, 60) ;
  
          if (val <= 500 or (Hor == 7 && Min == 31 && Sec == 55)){
              ST1[0].motor(1, 0) ;
              ST1[1].motor(1, 0) ;
              delay(3500) ;
              opening_state = false ;
              open_state = true ;
              digitalWrite(Relay,HIGH) ;
              relay_off = true ;
              lcd.clear() ;
              lcd.setCursor(8,3) ;
              lcd.print("Open") ; 
              relay_on = false ;
           }
         }
       }
     }
   }

//....................................
void CloseFunc(){
  if (relay_off and open_state){
      digitalWrite(Relay,LOW) ;
      startfun = currentMillis ;
      relay_on = true ;
      relay_off = false;
} else {
  if((currentMillis - startfun)>= interval){
      if (relay_on){
          lcd.setCursor(0,3) ;
          lcd.print("Closing...") ;
          open_state = false ;
          closing_state = true ;
          ST1[0].motor(1, -60) ;
          ST1[1].motor(1, -60) ;
 
          if (val <=500 or (Hor == 19 && Min == 31 && Sec == 55)){
              ST1[0].motor(1, 0) ;
              ST1[1].motor(1, 0) ;
              delay(3500) ;
              closing_state = false ;
              closed_state = true ;
              digitalWrite(Relay,HIGH) ;
              relay_off = true ;
              lcd.clear() ;
              lcd.setCursor(7,3) ;
              lcd.print("Closed.") ;
              relay_on = false ;
            }
          }
        }
      }
    }

thanks for your suggestions Paul