Problem with MQTT, Ethernet or Arduino Code ?

Hey guys. I am now writing here, because no one answered to my question on the german forum.

My Problem: I am using OpenHAB on a Raspberry Pi which is connected to my arduino mega via ethernet. The arduino is supposed to get commands of the pi and then switch lights with wireless sockets. The problem that I have is that the arduino does not work anymore after 2 or 3 hours. So now I am asking where the problem might be.

Here is the first bit of my code:

#include <SPI.h>
#include <UIPEthernet.h>
#include "PubSubClient.h"
#include <RCSwitch.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// unkommemntieren um Debug-Modus zu aktivieren
//#define DEBUG

// --------------------------------
// Ethernet Server
// http://arduino.cc/de/Reference/Ethernet
// --------------------------------
EthernetClient ethClient;


// --------------------------------
// MQTT Client
// http://knolleary.net/arduino-client-for-mqtt/
// --------------------------------
byte MQTTserver[] = { 192, 168, 0, 1 };
PubSubClient MQTTClient(MQTTserver, 1883, callback, ethClient);

unsigned long time;
long previoustime = 0;
long MQTTTimer = 7200000;  //2 Stunden


// --------------------------------
// LED Leiste
// --------------------------------
// Pins des RGB LED Lichts
int LEDredPIN=12;
int LEDgreenPIN=10;
int LEDbluePIN=11;

// Übermittelte Farbwerte
int LEDredValue = 0;
int LEDgreenValue = 0;
int LEDblueValue = 0;

// Gerade gesetzte Farbe
int LEDredCurrent = 0;
int LEDgreenCurrent = 0;
int LEDblueCurrent = 0;

// Timervariable für eine Verzögerung. Als alternative zu delay was die verarbeitung anhält.
int LEDtimer = 0;
int LEDendTimer = 50; 


// --------------------------------
// RC-Switch
// https://code.google.com/p/rc-switch/
// --------------------------------
RCSwitch RCsender = RCSwitch();
String rcID = ""; // Übermittelte ID
String rcCommand = ""; // Übermittelter Befehl
char rcID1[6]; // ID erster Teil
char rcID2[6]; // ID zweiter Teil


// --------------------------------
// Temperatur
// http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
// http://www.pjrc.com/teensy/td_libs_OneWire.html
// --------------------------------
#define SENSOR_PIN 2  // Any pin 2 to 12 (not 13) and A0 to A5
OneWire temp(SENSOR_PIN);

unsigned long TEMPtimer;
unsigned long TEMPendTimer = 300000; // Schleifendurchläufe bis neue Abfrage startet

float tempC;

#define TEMPERATURE_PRECISION 9
DallasTemperature sensors(&temp);
DeviceAddress insideThermometer; // Variable zum zwischenspeichern der Adresse eines Sensors


//================================================================================================================
void setup()
//================================================================================================================
{

#ifdef DEBUG
  Serial.begin(9600);
  Serial.println("Basestation v1.0");
#endif

  // --------------------------------
  // LED Leiste
  // --------------------------------
  // Setzen der PINS als Ausgang
  pinMode(LEDbluePIN, OUTPUT);
  pinMode(LEDredPIN, OUTPUT);
  pinMode(LEDgreenPIN, OUTPUT);

  // Bei start Farbe Blau setzen
  analogWrite(LEDredPIN, 0);
  analogWrite(LEDgreenPIN, 0);
  analogWrite(LEDbluePIN, 10);


  // --------------------------------
  // RC-Switch
  // --------------------------------
  RCsender.enableTransmit(40); //Arduino Pin #40
  RCsender.setRepeatTransmit(15);

  // --------------------------------
  // Temperatur
  // --------------------------------
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12);
  byte addr[8];
  temp.search(addr);
  temp.reset_search();
  
  
  // --------------------------------
  // Ethernet Server
  // --------------------------------
  // Initialisierung des Ethernets
  Ethernet.begin(addr);
  if (Ethernet.begin(addr) == 0) {
    // Wenn DHCP fehlschlägt dann rot setzen und aufhören
    analogWrite(LEDredPIN, 100);
    analogWrite(LEDgreenPIN, 0);
    analogWrite(LEDbluePIN, 0);
    while (true);
  }
  else {
    // Wenn DHCP OK ist dann grün setzen
    LEDgreenValue = 10;

#ifdef DEBUG
    Serial.print("IP-Adresse:");
    Serial.println(Ethernet.localIP());
#endif

  }
  }

This is the last bit:

//================================================================================================================
void loop(){
  //================================================================================================================

  // --------------------------------
  // MQTT Client
  // --------------------------------
  // Aufbau der Verbindung mit MQTT falls diese nicht offen ist.
  time = millis();
  if (!MQTTClient.connected()) {
    MQTTClient.connect("Basestation");
    // Abonieren von Nachrichten mit dem angegebenen Topics
    // MQTTClient.subscribe("/haus/moritz/ledkugel/RED/#");
    // MQTTClient.subscribe("/haus/moritz/ledkugel/GREEN/#");
    // MQTTClient.subscribe("/haus/moritz/ledkugel/BLUE/#");
    MQTTClient.subscribe("/haus/moritz/ledkugel/#");

    // RC Steckdosen Commands
    MQTTClient.subscribe("/haus/RC/#");
  }
  
  Ethernet.maintain();
 /* if(time - previoustime > MQTTTimer){
    previoustime = time;
    MQTTClient.disconnect();
    delay(100);
    MQTTClient.connect("Basestation");
    MQTTClient.subscribe("/haus/moritz/ledkugel/#");
    MQTTClient.subscribe("/haus/RC/#");
  } */


  // --------------------------------
  // LED Leiste
  // --------------------------------
  if (LEDtimer <= LEDendTimer) LEDtimer++;
  else {
    LEDtimer = 0;

    if (LEDredValue < LEDredCurrent) LEDredCurrent--;
    else if (LEDredValue > LEDredCurrent) LEDredCurrent++;

    if (LEDgreenValue < LEDgreenCurrent) LEDgreenCurrent--;
    else if (LEDgreenValue > LEDgreenCurrent) LEDgreenCurrent++;

    if (LEDblueValue < LEDblueCurrent) LEDblueCurrent--;
    else if (LEDblueValue > LEDblueCurrent) LEDblueCurrent++;
  }

  analogWrite(LEDredPIN, LEDredCurrent);
  analogWrite(LEDgreenPIN, LEDgreenCurrent);
  analogWrite(LEDbluePIN, LEDblueCurrent);


  // --------------------------------
  // RC Steckdosen
  // --------------------------------

  if (rcID.length() == 10) {

#ifdef DEBUGDEBUG
    Serial.println("ID : " + rcID);
#endif

    rcID.toCharArray(rcID1,6);
    rcID = rcID.substring(5,10);
    rcID.toCharArray(rcID2,6);

    if (rcCommand == "ON")RCsender.switchOn(rcID1, rcID2);
    if (rcCommand == "OFF")RCsender.switchOff(rcID1, rcID2);
    rcID = "";
  } 
  // if (rcID.length() == 10)

  if (rcID.length() == 5) {

#ifdef DEBUG
    Serial.println("ID : " + rcID);
#endif

    rcID.toCharArray(rcID1,6);
    rcID = rcID.substring(5,10);
    rcID.toCharArray(rcID2,6);

    if (rcCommand == "ON") RCsender.switchOn(rcID1, 1);
    if (rcCommand == "OFF")RCsender.switchOff(rcID1, 1);

    rcID = "";
  } 
  // if (rcID.length() == 6)

  // --------------------------------
  // Temperatur
  // --------------------------------
  if (TEMPtimer <= TEMPendTimer) TEMPtimer++;
  else {
    TEMPtimer = 0;
    sensors.requestTemperatures();

    // Bei Änderungen zum vorherigen Wert Publizieren
    if (tempC != sensors.getTempCByIndex(0) ) {
      tempC = sensors.getTempC(insideThermometer);
      char tempbuf[4];
      dtostrf(tempC, 2, 2, tempbuf);
      //client.connect("Arduino-Mega");
      MQTTClient.publish("/haus/moritz/temperatur", tempbuf);

#ifdef DEBUG
      Serial.println("Temp: " + tempbuf);
#endif

    } // TEMPSensor

  }  // else TEMPtimer

  // --------------------------------
  // MQTT Client Loop
  // --------------------------------
  MQTTClient.loop(); // Schleife für MQTT

}

//================================================================================================================
// Callback Funktion von MQTT. Die Funktion wird aufgerufen
// wenn ein Wert empfangen wurde.
//================================================================================================================
void callback(char* topic, byte* payload, unsigned int length) {

  TEMPtimer = 0; // Wenn eine Nachricht kommt wird der Timer
  // für die Temperatur auf 0 gesetzt um den Ablauf nicht zu Verzögern

  // Zähler
  int i = 0;
  // Hilfsvariablen für die Convertierung der Nachricht in ein String
  char message_buff[100];

  // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';

  // Konvertierung der nachricht in ein String
  String msgString = String(message_buff);
  String topString = String(topic);

#ifdef Debug
  Serial.println("Topic: " + topString);
  Serial.println("Msg : " + msgString);
#endif

  // --------------------------------
  // RC Steckdose
  // --------------------------------
  // Wenn das Topic mit "/haus/RC/" anfängt dann ID und Message ermitteln und schalten
  if (topString.startsWith("/haus/RC/")) {
    rcID = topString.substring(topString.lastIndexOf('/') + 1);
    rcCommand = msgString;
  } // if (topString.startsWith("/openHAB/wzRC/"))

  // --------------------------------
  // LED Leiste
  // --------------------------------
  // Überprüfung des Topics und setzen der Farbe je nach übermittelten Topic
  if (topString == "/haus/moritz/ledkugel/RED") LEDredValue = round(msgString.toInt() * 2.55);
  if (topString == "/haus/moritz/ledkugel/GREEN") LEDgreenValue = round(msgString.toInt() * 2.55);
  if (topString == "/haus/moritz/ledkugel/BLUE") LEDblueValue = round(msgString.toInt() * 2.55);

} // void callback()