In der Haus-Automatisation eignet sich MQTT (Message Queuing Telemetry Transport) perfekt.
Hardware:
-
- Arduino
-
- Ethernet-Shield
-
- Dallas/Maxim DS1820
Der One-Wire-Temperatur-Sensor DS1820 habe ich an Pin D2 angeschlossen.
Die Anbindung an FHEM erfolgt wie im Wiki beschrieben an die MQTT-Bridge
Auf dem Arduino wird das Skript geladen:
/********************************************************************
* Temperatur-Sensor
*
* MQTT-Client mit DS18x20 Sensor
*
*
*/
#include // Serial Peripheral Interface
#include // Ethernet Bibliothek
#include // MQTT Bibliothek
#include // OneWire
#include // 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 );
}
Die Verdrahtung:

Der Aufbau hier mit einem Arduino UNO

MQTT Debugging
https://klsys.com/2017/09/fhem-und-arduino/