Why is only "Temp" send meny times

#include <SoftwareSerial.h>
#include <DHT.h>

#define DHTPIN 6 //DHT OneWire pin and its type
#define DHTTYPE DHT11

// Configure software serial port
SoftwareSerial sim800(3, 2);

// Variable to store text message
String textMessage;
String textMessage1;
// Create a variable to store Lamp state
String lampState1 = "off";
String lampState2 = "off";

// Relay connected to pin 4,5
const int relay1 = 4;
const int relay2 = 5;

DHT dht(DHTPIN, DHTTYPE);

void setup() {

// Set relay as OUTPUT
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);

// By default the relay is off
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);

// Initializing serial commmunication
Serial.begin(19200);
sim800.begin(19200);

delay(100); // Give time to your GSM shield log on to network
Serial.println("sim800 is ready to send receive sms");

sim800.print("AT+CMGF=1\r"); // Set module to send SMS data to serial out upon receipt
delay(100);
sim800.print("AT+CNMI=2,2,0,0,0\r");
delay(100);

dht.begin();

delay(100);
}

void loop() {

delay (200);

float h = dht.readHumidity(); // Read temperature as Celsius (the default)
float t = dht.readTemperature();

delay (200);

if (sim800.available() > 0) {
textMessage = sim800.readString();
Serial.print(textMessage);
delay(100);
}
if (textMessage.indexOf("On 1") >= 0) { // Turn on relay and save current state
digitalWrite(relay1, LOW);
lampState1 = "on";
Serial.println("Relay1 set to ON");
textMessage = "";
}
if (textMessage.indexOf("Off 1") >= 0) { // Turn off relay and save current state
digitalWrite(relay1, HIGH);
lampState1 = "off";
Serial.println("Relay1 set to OFF");
textMessage = "";
}

if (textMessage.indexOf("On 2") >= 0) { // Turn on relay and save current state
digitalWrite(relay1, LOW);
lampState2 = "on";
Serial.println("Relay2 set to ON");
textMessage = "";
}

if (textMessage.indexOf("Off 2") >= 0) { // Turn off relay and save current state
digitalWrite(relay1, HIGH);
lampState2 = "off";
Serial.println("Relay2 set to OFF");
textMessage = "";
}

if (textMessage.indexOf("State") >= 0) {
String message = "Relay 1 is " + lampState1 + ", Relay 2 is " + lampState2;
sendSMS(message);
Serial.write("Relay's resquest");
textMessage = "";
}

if (textMessage1.indexOf("Temp") >= 0) {
String message1 = "DHT11\nTemp = " + String(t, 1) + " C" + " \nHumidity = " + String(h, 1) + " %";
sendSMS(message1);
Serial.write("Temp request");
textMessage1 = "";
}

}
void sendSMS(String message) {
sim800.write("AT+CMGF=1\r\n"); // AT command to set sim800 to SMS mode
delay(100);
sim800.write("AT+CMGS="+27825732889"\r\n"); // change to your sim800's your phone number
delay(100);
sim800.println(message); // Send the SMS
delay(100);
sim800.println((char)26);
delay(5000);
// sim800.println("AT+CMGD=1,2");
sim800.print("AT+CMGDA="");
sim800.println("DEL ALL"");
delay(500);
Serial.println( "All Messages Deleted" );
}

while to you check that a message is available() before reading (i.e. readString()), the code processes textMessage whether it was just read or not.

it might be easier to simply return from loop() is NOT available, reading and processing the message otherwise

void loop() {
    delay (200);
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    delay (200);

    if (sim800.available() == 0)
        return;

    textMessage = sim800.readString();
    Serial.print(textMessage);
    delay(100);

    if (textMessage.indexOf("On 1") >= 0) {

Now it does not read any SMS send

since your original code processed TextMessage regardless of whether it was available() and readString(), are you sure a message is being correctly sent?

+CMT: "+27825732889","","20/04/26,11:39:48+08"
State
sim800 is ready to send receive sms
sim800 is ready to send receive sms
sim800 is ready to send receive sms
sim800 is ready to send receive sms
AT+CMGF=1

OK
AT+CNMI=2,2,0,0,0

OK
sim800 is ready to send receive sms
AT+CMGF=1

OK
AT+CNMI=2,2,0,0,0

OK

+CMT: "+27825732889","","20/04/26,11:43:51+08"
Temp

+CMT: "+27825732889","","20/04/26,11:44:14+08"
State
sim800 is ready to send receive sms
AT+CMGF=1

OK
AT+CNMI=2,2,0,0,0

OK

+CMT: "+27825732889","","20/04/26,11:45:29+08"
State
sim800 is ready to send receive sms
AT+CMGF=1

OK
AT+CNMI=2,2,0,0,0

OK

+CMT: "+27825732889","","20/04/26,11:47:22+08"
State

Answers I get back on serial
Does not do the sendSMS

Does not do the sendSMS

are you saying nothing is being transmitted?

why don't you just try to echo what you receive from sms on the Serial interface, as in your original code, without any further processing in loop()

if (sim800.available() == 0)
return;

If this is put in the original code as suggested

I can sms the Sim800 and it display on serial out that it is received, but no reply from sim800

the problem is only relevant to the Temp request otherwise everything works fine

Have written same code for 4 relays but without Temp request and it works fine

Im not a coder and my coding skills are very limited

Patrick

why is textMessage1 used for your "Temp" case

    if (textMessage.indexOf("State") >= 0) {
        String message = "Relay 1 is " + lampState1 + ", Relay 2 is " + lampState2;
        sendSMS(message);
        Serial.write("Relay's resquest");
        textMessage = "";
    }

    if (textMessage1.indexOf("Temp") >= 0) {

Cause I thought it might resolve the problem with Temp but it can be textMassage same as the "State" request

not sure that you agree that the code needs to check textMessage (no "1")

Thanks but cant get it to work correctly

post the latest version of code

#include <SoftwareSerial.h>
#include <DHT.h>

#define DHTPIN 6 //DHT OneWire pin and its type
#define DHTTYPE DHT11

// Configure software serial port
SoftwareSerial sim800(3, 2);

// Variable to store text message
String textMessage;

// Create a variable to store Lamp state
String lampState1 = "off";
String lampState2 = "off";

// Relay connected to pin 4,5
const int relay1 = 4;
const int relay2 = 5;

DHT dht(DHTPIN, DHTTYPE);

void setup() {

// Set relay as OUTPUT
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);

// By default the relay is off
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);

// Initializing serial commmunication
Serial.begin(19200);
sim800.begin(19200);

delay(100); // Give time to your GSM shield log on to network
Serial.println("sim800 is ready to send receive sms");

sim800.print("AT+CMGF=1\r"); // Set module to send SMS data to serial out upon receipt
delay(100);
sim800.print("AT+CNMI=2,2,0,0,0\r");
delay(100);

dht.begin();

delay(100);
}

void loop() {

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
delay (200);

textMessage = sim800.readString();
Serial.print(textMessage);
delay(100);

if (sim800.available() == 0)
return;

if (textMessage.indexOf("On 1") >= 0) {
textMessage = sim800.readString();
Serial.print(textMessage);
delay(100);
}
if (textMessage.indexOf("On 1") >= 0) { // Turn on relay and save current state
digitalWrite(relay1, LOW);
lampState1 = "on";
Serial.println("Relay1 set to ON");
textMessage = "";
}
if (textMessage.indexOf("Off 1") >= 0) { // Turn off relay and save current state
digitalWrite(relay1, HIGH);
lampState1 = "off";
Serial.println("Relay1 set to OFF");
textMessage = "";
}

if (textMessage.indexOf("On 2") >= 0) { // Turn on relay and save current state
digitalWrite(relay1, LOW);
lampState2 = "on";
Serial.println("Relay2 set to ON");
textMessage = "";
}

if (textMessage.indexOf("Off 2") >= 0) { // Turn off relay and save current state
digitalWrite(relay1, HIGH);
lampState2 = "off";
Serial.println("Relay2 set to OFF");
textMessage = "";
}

if (textMessage.indexOf("State") >= 0) {
String message = "Relay 1 is " + lampState1 + ", Relay 2 is " + lampState2;
sendSMS(message);
Serial.write("Relay's resquest");
textMessage = "";
}

if (textMessage.indexOf("Temp") >= 0) {
String message = "DHT11\nTemp = " + String(t, 1) + " C" + " \nHumidity = " + String(h, 1) + " %";
sendSMS(message);
Serial.write("Temp request");
textMessage = "";

}

}
void sendSMS(String message) {
sim800.write("AT+CMGF=1\r\n"); // AT command to set sim800 to SMS mode
delay(100);
sim800.write("AT+CMGS="+27825732889"\r\n"); // change to your sim800's your phone number
delay(100);
sim800.println(message); // Send the SMS
delay(100);
sim800.println((char)26);
delay(5000);
sim800.print("AT+CMGDA="");
sim800.println("DEL ALL"");
delay(500);
Serial.println( "All Messages Deleted" );

}

Program does not aswer to SMS request

why do you read the serial interface before checking if anything is available()? if anything was read, available() will be false

    textMessage = sim800.readString();
    Serial.print(textMessage);
    delay(100);
    if (sim800.available() == 0)
    return;
    delay(100);
    if (sim800.available() == 0)
        return;

    textMessage = sim800.readString();
    Serial.print(textMessage);