E-Mails versenden mit sSMTP

Es gib immer mal wieder die Situation mit einem Linux System E-Mails zu versenden. Das können zu hohe Temperaturen der Festplatte, störungen von Cronjob oder eine IP, die aufgrund von falschen Login versuchen auffällt. Natürlich ist dieser Service auch bei anderen Diensten wie FHEM interessant. 

Man könnte sich eine E-Mail senden lassen wenn ein bestimmter Bewegungsmelder aktiv wird.  Oder die Temperatur der Gefriertruhe steigt wegen einem defekt. Hier kann auch sSMTP einspringen und eine E-Mail versenden. Die Einsatzmöglichkeiten sind unglaublich vielfältig.

Und diese Möglichkeiten gibt es mit sSMTP mit relativ wenig Aufwand.

Installation von sSMTP

Wie immer, wer sein Linux liebt der updatet als erstes 🙂

apt-get update && apt-get upgrade -V

Nun kann man die beiden Pakete von sSMTP installieren

apt-get install ssmtp mailutils

Nun wird als erster Schritt die generelle Einrichtung von sSMTP vorgenommen

nano /etc/ssmtp/ssmtp.conf

Gebt in diesem File euer E-Mail Konto sowie die entsprechenden Ports eures E-Mail Anbieters an.

root=DEINE@EMAIL.DE
mailhub=DEIN-EMAIL.SERVER.DE:PORT(ist bei jedem Anbieter anders!)
hostname=localhost
UseTLS=Yes
UseSTARTTLS=Yes
AuthUser=DEIN-EMAIL-LOGIN-BENUTZER
AuthPass=DEIN-EMAIL-PASSWORT
FromLineOverride=yes

Wer mehr zu den einzelnen Eintragen wissen möchte kann sich gerne mal die man von sSMTP ansehen.  Linux versteht man nur durch lesen :).

man ssmtp

Nun müssen wir Linux nur noch mitteilen welche Benutzer eigentlich sSMTP nutzen dürfen.

Dazu öffnen wir das Benutzer File des sSMTP

nano /etc/ssmtp/revaliases

In diesem File müssen alle Benutzer des jeweiligen Linux System eingetragen werden die gerne eine Email versenden möchten. Bitte achtet drauf auch hier die richtigen PORTs mit anzugeben.

root:DEINE@EMAIL-ADRESSE.DE:smtp.EMAIL-ADRESSE.de:587 (Je nach Anbeiter)
www-data:WWW-USER@SEINE-EMAIL.DE:smtp.IRGENDWAS.DE:PORT

Zum Schluss schicken wir nun mal eine Test E-Mail 😀

echo "Mail-Inhalt" | mail -s "Betreff" EMAIL@AN-DIE-GESENDET-WERDEN-SOLL.DE

So das waren die Grundlagen. Nun ist dein Linux System in der Lage E-Mails zu versenden. War ja eigentlich gar nicht so viel Aufwand!

DHT22 / AM2302-Luftfeuchte und Temperatursensor

Dieser Sensor dient zum Messen der Luftfeuchtigkeit und der Temperatur. Durch seinen günstigen Preis bietet sich der AM2302 fuer diese Aufgabe an. Da er sowohl mit 3,3V oder 5V betrieben werden kann eignet er sich zum Betrieb an einem Raspberry oder Arduino.

Durch seine OneWire Technologie reicht ein PIN am Board um Luftfeuchtigkeit und Temperatur zu ermitteln. Die Abfrage der Messwerte erfolgt somit seriell als Bitreihenfolge.

Technische Daten:

  • Betriebsspannung: DC 3.3-5.5V
  • Luftfeuchtigkeitsmessbereich : 0 bis 100% relative Luftfeuchte
  • Feuchtemessgenauigkeit: ±2% RH
  • Temperaturbereich: -40 bis +80 C
  • Temperaturmessgenauigkeit ±0.5
  • OneWire Ausgang an Pin 2

  • Maße: 28mm x 12mm x 10mm

Beispielprogramm fuer einen Arduino Uno

    // Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
 
#include "DHT.h"
 
#define DHTPIN 7     // what digital pin we're connected to
 
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
 
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(57600);
  Serial.println("DHTxx test!");
 
  dht.begin();
}
 
void loop() {
  // Wait a few seconds between measurements.
  delay(2000);
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
 
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
 
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

Quelle ladyada, public domain

Mehr infos unter Github.

Arduino Relaiskarte per MQTT Befehl steuern

Die Hausautomatisierung benötigt sehr viele Aktoren. In diesem Bereich gibt es sehr viele Produkte der großen Hersteller. Leider auch entsprechend teuer. Hier möchte ich ein Projekt vorstellen das über einen Arduino (WeMos D1) eine Relaiskarte ansteuert. zur Steuerung verwende ich das MQTT Protokoll. Natürlich alles per WiFi. Es wird nur noch die Versorgungsspannung und der Laststromkreis benötig.

5 Minuten Probeaufbau

Gesteuert wird nun das Relais A mit folgendem Befehl:

Ebenso einfach geht das Aus schalten des Relais

Relais B reagiert folglich auf

Das Relais ist nun im kompletten Heimnetzwerk erreichbar.

Code Snipes

DS18b20 mehrer Temperatursensoren auslesen

Da jeder DS18b20 mit einer eigenen HEX Adresse ansprechbar ist können mit einem einfachen Script mehrere Fühler abgefragt werden. Der Vorteil bei dem One Wire Aufbau besteht darin das nur ein PIN benötigt wird,

#include <OneWire.h>
#include <DallasTemperature.h>

//Datenkabel ist am Digitalpin 2 angeschlossen
#define ONE_WIRE_BUS 3

// oneWire Bus initialisieren
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
}


void loop(void)
{
  sensors.requestTemperatures();
  
  Serial.println(sensors.getTempCByIndex(0)); // SENSOR 1
  Serial.println(sensors.getTempCByIndex(1)); // SENSOR 2
  Serial.println(sensors.getTempCByIndex(2)); // SENSOR 3
}

1/2/4/8/16 Kanal Relais 5V/12V

Anschluss an den Arduino

Manche Relaiskarten sind LOW aktiv. Durch den verbauten Optokoppler werden die Relais aktiviert wenn man den PIN des Arduino auf „LOW“ setzt.

digitalWrite(RELAIS-PIN,LOW);

Wenn einem das aber unlogisch erscheint und man auf den ersten Blick ein LOW auch als „Das Relais zieht nicht an“ verknüpft kann man den Befehl negieren. Das ist eine reine Vereinfachung bei der Programmierung.

digitalWrite(RELAIS-PIN,!LOW);

Das ! vor der LOW macht aus dem LOW Befehl eigentlich einen HIGH.

DS18s20 parallel messen

Der DS18s20 bietet dank der „1-Wire“ Technologie die Möglichkeit mehrer Sensoren an einem PIN abzufragen. Dazu werden alle DS18s20 einfach parallel geschalten. Unterscheiden kann der Arduino die einzelneren Sensoren dank der HEX Adressen. 

Wie kann man die Adressen auslesen?

Der Sketch zum auslesen der Daten ist auch sehr übersichtlich.

#include <OneWire.h>
#include <DallasTemperature.h>

float wert_sensor_1;
float wert_sensor_2;
float wert_sensor_3;
long vorhermillis = millis();

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/*
Sensoradressen eingeben
*/

DeviceAddress Adresse_Sensor1 = { 0x28, 0xFF, 0xFE, 0x3E, 0xA1, 0x16, 0x04, 0x6B }; 
DeviceAddress Adresse_Sensor2 = { 0x28, 0xFF, 0x3B, 0x91, 0xA1, 0x16, 0x05, 0xF6 }; 
DeviceAddress Adresse_Sensor3 = { 0x28, 0xFF, 0x7F, 0x77, 0xA1, 0x16, 0x05, 0x40 }; 


void setup () 
{        
    Serial.begin(9600);
    sensors.begin();
             
    sensors.setResolution(Adresse_Sensor1, 12); // set the resolution
    sensors.setResolution(Adresse_Sensor2, 12); // set the resolution
    sensors.setResolution(Adresse_Sensor3, 12); // set the resolution
}

void loop () 
{  
 if (millis() - vorhermillis > 1000)
 {  
   vorhermillis = millis();
   sensors.requestTemperatures();
   wert_sensor_1 = sensors.getTempC(Adresse_Sensor1);
   wert_sensor_2 = sensors.getTempC(Adresse_Sensor2);
   wert_sensor_3 = sensors.getTempC(Adresse_Sensor3);
   Serial.print("Sensor 1 : ");
   Serial.println(wert_sensor_1);
   Serial.print("Sensor 2 : ");
   Serial.println(wert_sensor_2);
   Serial.print("Sensor 3 : ");
   Serial.println(wert_sensor_3);   
 }
}

DS18b20 Adresse auslesen

Man kann mehrer DS18b20 parallel schalten. Im jedoch jeden einzelnen auslesen zu koennen benötigt man die jeweilige HEX Adresse des Temp. Fühler.

Mit dem diesem Sketch kann man an PIN 3 des Arduino die Adresse des Fühlers im Seriellen Monitor anzeigen.


#include <OneWire.h>

OneWire  ds(3);  // Anschluss an PIN 3

void setup(void) {
  Serial.begin(9600);
  discoverOneWireDevices();
}

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.print("Nach 1 Leitung Sensor suchen\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rGefunden \'1-Wire\' fuehler mit der Adresse:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC is not valid!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rDas war es... mehr kommmt nicht:)\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}