Blynk sht31 and relay control problem

I want to check the relay but temperature and humidity values ​​are not read in the blynk program. This is my code. Where am I doing wrong?

//#define USE_SPARKFUN_BLYNK_BOARD    // Uncomment the board you are using
#define USE_NODE_MCU_BOARD        // Comment out the boards you are not using
//#define USE_WITTY_CLOUD_BOARD
//#define USE_CUSTOM_BOARD          // For all other ESP8266-based boards -
                                    // see "Custom board configuration" in Settings.h

#define APP_DEBUG        // Comment this out to disable debug prints

#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>
#include "BlynkProvisioning.h"
#include <FS.h>                   //this needs to be first, or it all crashes and burns...
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <SPI.h>
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_Sensor.h>

Adafruit_SHT31 sht31 = Adafruit_SHT31();



int relaytemp= 12;
int relayhum= 5;
int relayfan= 4;
int led1;
float settemp=37.6;
float sethum=55;
float calibretemp=0;
float calibrehum=0;
float workingintervaltemp=0.2;
float workingintervalhum=0.5;


float t = sht31.readTemperature();
float h = sht31.readHumidity();
//for LED status
BlynkTimer timer;



BLYNK_WRITE(V0)
{
  settemp=param.asFloat();
  Serial.println(settemp);
}
BLYNK_WRITE(V1)
{
  sethum=param.asFloat();
  Serial.println(sethum);
}
BLYNK_WRITE(V2)
{
  workingintervaltemp=param.asFloat();
  Serial.println(workingintervaltemp);
}
BLYNK_WRITE(V3)
{
  workingintervalhum=param.asFloat();
  Serial.println(workingintervalhum);
}
BLYNK_WRITE(V4)
{
  calibretemp=param.asFloat();
  Serial.println(calibretemp);
}
BLYNK_WRITE(V5)
{
  calibrehum=param.asFloat();
  Serial.println(calibrehum);
}

BLYNK_CONNECTED()
{
  Serial.println("Reconnected, syncing with cloud.");
  Blynk.syncVirtual(V5);
  Blynk.syncVirtual(V4);
  Blynk.syncVirtual(V3);
  Blynk.syncVirtual(V2);
  Blynk.syncVirtual(V1);
  Blynk.syncVirtual(V0);
  
}




void setup() {
   BlynkProvisioning.begin();
   Serial.begin(115200);
   sht31.begin(0x44);
  
   pinMode(12,OUTPUT);
   pinMode(5,OUTPUT);
   pinMode(4,OUTPUT);

  
  timer.setInterval(1000, Sendsensor);
  timer.setInterval(1000, relay);


}

void Sendsensor()
{
   float t = sht31.readTemperature();
   float h = sht31.readHumidity();

  Blynk.virtualWrite(V7, h+calibrehum);
  Blynk.virtualWrite(V6, t+calibretemp);
  
  
}


void relay()
{

  WidgetLED led1 (V8);
  float t = sht31.readTemperature();
  if(settemp>t+calibretemp)
  {
  digitalWrite(relaytemp, HIGH);
  
  led1.on();
  }
  else if(settemp+workingintervaltemp<=t+calibretemp)
  {
  digitalWrite(relaytemp, LOW);
  led1.off();
  }

  WidgetLED led2 (V9);
  WidgetLED led3 (V10);
  float h = sht31.readHumidity();
  if(sethum>h+calibrehum)

  {
  digitalWrite(relayhum, HIGH);
  digitalWrite(relayfan, LOW);
  led2.on();
  led3.off();
  }

  else if(sethum+workingintervalhum<=h+calibrehum)
  {
  digitalWrite(relayhum, LOW);
  digitalWrite(relayfan, HIGH);
  led2.off();
  led3.on();
  }
  
  
  }
  
void loop() {
  // This handles the network and cloud connection
  BlynkProvisioning.run();
  timer.run(); 
 
}