/********************************************************************
 *  Temperatur-Sensor
 *  
 *  MQTT-Client mit DS18x20 Sensor
 *  
 *  Messwert wird als MQTT-Nachricht an einen MQTT-Broker verschickt
 *  
 *  Beispiel:  {"Temperatur":"17.50"}
 *  
 *  01.03.2018  Jürgen Mayer, DL8MA - Weinstadt
 *  
 */
#include <SPI.h>                                                        // Serial Peripheral Interface
#include <Ethernet.h>                                                   // Ethernet Bibliothek
#include <PubSubClient.h>                                               // MQTT Bibliothek
#include <OneWire.h>                                                    // OneWire
#include <DallasTemperature.h>                                          // Dallas Temperatursensor

#define ONE_WIRE_BUS 2


IPAddress server(192, 168, 178, 122);                                   // MQTT-Broker
char inTopic[] = "DL8MA";                                               // Topic

byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };

char msg[100];                                                          // Buffer

OneWire oneWire(ONE_WIRE_BUS);                                          // TEmperatursensor einbinden
DallasTemperature sensors(&oneWire);

EthernetClient ethClient;                                               // Ethernet-Client aktivieren
PubSubClient client(ethClient);                                         // MQTT-Klasse

void reconnect() {                                                      // automatischer Reconnect 
  while (!client.connected()) {
    Serial.print("Versuch des MQTT Verbindungsaufbaus...");

    if (client.connect("arduinoClient")) {
      Serial.println("Erfolgreich verbunden!");
      client.publish( inTopic,"Temperatursensor");

      client.subscribe(inTopic);
    } else { 
      Serial.print("Fehler, rc=");
      Serial.print(client.state());
      Serial.println(" Nächster Versuch in 5 Sekunden");
      delay(5000);
    }
  }
}

void setup()
{
  Serial.begin(9600);                 
  sensors.begin();                                                      // Sensor initialisieren
  client.setServer(server, 1883);                                       // Adresse des MQTT-Brokers setzen
  Ethernet.begin(mac );                                                 // Ethernet-Vebindung aufbauen
  delay(1000);

}

void loop()
{  

  static char floatStr[15];
  String payLoad;
  String tempWertString;
  float  tempWertFloat;
  
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  sensors.requestTemperatures();                                        // Temperatur messen

  tempWertFloat = sensors.getTempCByIndex(0);                           // Messwert holen
  dtostrf( tempWertFloat,7, 2, floatStr);                               // Zahlenwert in String wandeln
  tempWertString = floatStr;
  tempWertString.trim();
  payLoad = "{\"Temperatur\":\"";                                       // Nachricht zusammenbauen
  payLoad = payLoad + tempWertString + "\"}";                           // Messwert dazufügen
  payLoad.toCharArray(msg, 100 );                                       // für publish-Funktion umwandeln

  client.publish( inTopic, msg );                                       // MQTT-Nachricht an Brocker senden

  Serial.println( msg );                                                

  delay( 1000 );
  
}