Info: Tasmota

https://tasmota.github.io/docs/

Tasmota ist eine kostenlose alternative Firmware für Geräte die auf dem ESP8266 Chip basieren. Ich verwende sie auf den D1 mini genauso wie auf Sonoffs. Ich steuere darüber mein Licht (Hue, Yeelight, LED-Streifen, …) und lese die Sensoren (Bewegung, Lux, Luftqualität, Wasserstand, Boden- und Luftfeuchtigkeit) aus. Alle Ereignisse und Werte verwalte ich über einen MQTT-Broker. Aufgrund der vielen Schnittstellen insbesondere der MQTT-Anbindung sind Tasmota keine Grenzen gesetzt. Abgesehen davon, dass man natürlich den Quellcode individualisieren kann.

Nachfolgend sind wichtige Infos verlinkt:

Projekt: Smart-Home-Zentrale

Ich steuere mein Smart-Home über Node-Red im ioBroker. Beide Systeme bieten die Möglichkeit, über einen integrierten Web-Server, Dashboards darzustellen. Da diese per Browser aufrufbar sind, kann man jedes ins Heimnetz eingebundene Gerät zur Darstellung verwenden.

Das Smartphone zu verwenden ist naheliegend. Manchmal wäre es jedoch hilfreich, mal kurz eine Übersicht zu sehen, ohne erst das Smartphone freizuschalten, den Browser zu starten und ggf. auch noch auf die Webseite zu warten.

Ich habe mich für ein an die Wand angebrachtes Tablet entschieden. Mein altes Nexus 7 aus dem Jahr 2013, inzwischen 7 Jahre alt. Da es lange herum lag, war der Akku hinüber und da ich das USB-Kabel vermutlich nicht immer vorsichtig heraus gezogen habe, hat der Anschluss einen Wackelkontakt gehabt. Beides habe ich ausgetauscht. Die Halterung habe ich mir ausgedruckt. Ich werde sicherlich bald auf ein 10″ Gerät ausweichen, aber es erfüllt seinen Zweck und ist bedienbar.

Für eine Remote-Verwaltung mit Kiosk-Modus unter Android habe ich mich dann für die App Fully entschieden. Sie bietet extrem viele Möglichkeiten (Fully-Homepage).

Hier sind nur die Möglichkeiten aufgelistet, die ich nutze:

  • Bewegungserkennung über Kamera schaltet das Display automatisch an/ aus, wenn jemand vor dem Tablet steht
  • Kiosk-Modus
  • Remote-Administration
  • MQTT-Integration
  • REST-Interface

REST-Interface

Das REST-Interface kann verwendet werden, um das Gerät über das lokale Netz zu steuern. Die Basis-URL ist immer http://ip-address:2323. Man kann zusätzlich type=json im Querystring angeben, um eine kurze Antwort im JSON-Format zu bekommen.

Device Info and Basic Features

// Device Info
/?cmd=deviceInfo&password=[pass]

// Basic features
/?cmd=loadStartURL&password=[pass]
/?cmd=loadURL&url=[url]&password=[pass]
/?cmd=clearCache&password=[pass]
/?cmd=clearWebstorage&password=[pass] 
/?cmd=clearCookies&password=[pass]  (ver. 1.28+)
/?cmd=restartApp&password=[pass] 
/?cmd=exitApp&password=[pass] 
/?cmd=screenOn&password=[pass]
/?cmd=screenOff&password=[pass]
/?cmd=forceSleep&password=[pass] 

// Simulate motion 
/?cmd=triggerMotion&password=[pass]

Get Stats, Screenshot and Camshot

// Load full usage stats CSV file
/?cmd=loadStatsCSV&password=[pass]

// Get screenshot image (PNG)
/?cmd=getScreenshot&password=[pass]

// Get camshot image (requires Motion Detection)
/?cmd=getCamshot&password=[pass] 

TTS and Multimedia

// Text to speech
/?cmd=textToSpeech&text=[text]&password=[pass] 
/?cmd=textToSpeech&text=[text]&locale=[locale]&password=[pass] 
/?cmd=textToSpeech&text=[text]&locale=[locale]&engine=[engine]&password=[pass] 

// Sounds and volume
/?cmd=setAudioVolume&level=[0-100]&stream=[1-10]&password=[pass]
/?cmd=playSound&url=[url]&loop=[true|false]&password=[pass]
/?cmd=stopSound&password=[pass]
/?cmd=playVideo&password=[pass]&url=[url]&loop=[0|1]&showControls=[0|1]&exitOnTouch=[0|1]&exitOnCompletion=[0|1]

Manage Settings

// Change any of 200+ Fully settings, look in Remote Admin for keys
// New setting will be applied immediately
/?cmd=setBooleanSetting&key=[key]&value=[true|false]&password=[pass] 
/?cmd=setStringSetting&key=[key]&value=[value]&password=[pass] 

// Import settings file (dat/json) from /sdcard
/?cmd=importSettingsFile&filename=[filename]&password=[pass]

File Management

// Download and upzip file to /sdcard
/?cmd=loadZipFile&url=[url]&password=[pass]

Links

Info: Luftqualitäts-Sensor MQ-135

Wikipedia

Ein Gassensor ist ein Chemosensor für die Detektion gasförmiger Substanzen. Der Anteil bestimmter chemischer Inhaltsstoffe des Gases wird vom Sensor in ein elektrisches Signal umgewandelt.

In fast jedem neu gebauten Automobil und in fast jedem Haushalt sind Gassensoren zu finden.

Technische Daten

  • Der MQ-135 Gassensor detektiert Benzol, Alkohol und Rauch
  • Die Ausgangsspannung steigt mit der Konzentration der gemessenen Gase an
  • Der MQ-135 hat einen analogen (AO) und einen digitalen (DO) Ausgang
  • Der Schwellenwert für den DO (high/low) lässt sich über ein Potentiometer regeln
  • Waveshare-Wiki
Betriebsspannung (Vcc)2,5-5 V
Ausgangsspannung (Output)3,3V high / 0 V low
Auflösung10~1000ppm
Genauigkeit≥ 3%
Reaktionszeit≤ 1s
Ansprechzeit nach Einschalten≤ 30s
Heizspannung5.0V±0.2V / 1.5±0.1V
Heizstrom≤ 180mA
Heizenergieleistung ca.350mW
Abmessungen Platine40 mm x 21 mm
Lochdurchmesser2 mm
Daten zum MQ-135

Funktion

Der Sensor hat eine hohe Empfindlichkeit und schnelle Reaktionszeit, benötigt allerdings einige Minuten bis er genaue Messwerte ausgibt, da der Sensor sich erst aufheizen muss. Die Daten können am PIN AO ausgewertet werden. Über den PIN DO erhält man lediglich ein low oder high, je nach Kalibrierung durch das Potentiometer auf der Rückseite.

Weiter unten sind meine Testwerte zu sehen. Zunächst sind diese Werte nicht interpretierbar. Ich habe daher versucht mit meinen Testwerten eine Referenz zu erstellen. Anhand dieser Referenz kann man dann bestimmen, ab welchem Wert die Luft gut oder schlecht ist und z.B. über eine LED den Zustand optisch signalisieren (grün = gut, rot = schlecht).

Verkabelung

D1 miniMQ-135
5V5VVcc
GNDGNDGND
analoger AusgangA0AO
digitaler Ausgang DO

Firmware

Wie auch bei den meisten anderen Projekten verwende ich hier die Software Tasmota auf einem D1 mini.

Konfiguration:

Ich habe A0 mit dem Eintrag „Analog“ versehen, da der Sensor von Tasmota leider nicht direkt unterstützt wird.

Am analogen Ausgang verändert sich die Spannung je nach Luftverschmutzung.

Testwerte

Da ich mit den ausgegebenen Werten bisher nichts anfangen kann, benötige ich Referenzwerte, die ich mir aus den Testwerten erhoffe.

Kurzzeittest (1-2 Stunden):

TestWert
Terrasse (aussen)28
Arbeitszimmer46
Schlafzimmer38
Badezimmer43
Wohnzimmer42
Wohnzimmer (nach Lüftung)29
Haustürkein Empfang 🙂
Mit Feuerzeuggas besprüht170
Mit Zigarettenrauch bepustet90
MQ-135 Sensor-Testwerte

Langzeittest (24 Stunden)

Der Sensor lag 24 Stunden im Wohnzimmer. Das Schlafzimmer ist über den Flur vom Wohnzimmer erreichbar. Die unten im Bild erwähnte Terrassentür befindet sich im Schlafzimmer. Die frische Luft zieht aber scheinbar komplett durch die Wohnung.

24-Stunden-Test Wohnzimmer

Mal wieder zeigt sich, dass Rauchen nicht gut ist.

Auf der Terrasse hat der Sensor in 24 Stunden durchgängig 27 oder 28 ausgegeben.

Testergebnis

Nach Betrachtung dieser Werte würde ich zunächst folgendes annehmen:

TypWertHinweis
Wertebereich~ 0 – 200 (vermutlich mehr)erkennbar bisher von 28 – 170
Frischluft~ 30 Außen betrug der Wert 27 – 28
Schwellwert für Lüftung~ 40Ab diesen Wert soll das System zur Lüftung der Wohnung auffordern (das wäre dann bei jeder rauchenden Zigarette in der Wohnung)
Schwellwert für schlechte Luft~ 45/50Ab diesem Wert soll das System dringlich zur Lüftung der Wohnung auffordern
Schwellwert für Gefahr~ 80Ab diesem Wert soll eine Art Alarm ausgelöst werden
Wertebereich LED-Streifen25 (grün) – 80 (rot)innerhalb dieses Wertebereiches soll der LED-Streifen von grün nach rot fließend umschwenken
Brainstorming für die Verarbeitung der Werte

Über Node-Red würde ich bei Signalwerten im Wertebereich des LED-Streifen, diesen von grün nach rot mit fließenden Farbübergängen schalten.

In einem Display lässt sich natürlich der exakte Wert darstellen.

ToDo

  • Gehäuse designen/ drucken
    • Platz für:
  • Sensoren auf Vergleichbarkeit testen
  • ins Gehäuse integrierter LED-Streifen soll „Luftgüte“ anzeigen (rot bis grün, fließend)
  • ins Gehhäuse integriertes Display soll von Tasmota ausgegebenen Wert darstellen
  • kombinierbare Sensoren:
    • DHT (Temperatur/Feuchtigkeit)
      • macht das Sinn wegen der Hitze des MQ-135? Ggf. abgetrennt ins Gehäuse
    • PIR (Bewegung), dann ggf. auch Lux-Sensor
      • Bewegungsereignisse werden eh überall benötigt, ersspart ggf. zusätzliche Sensoren

Info: PIR Sensor HC-SR501

Wikipedia

PIR-Sensoren (Pyroelektrische Sensoren) beruhen auf der namensgebenden Pyroelektrizität. PIR-Sensoren reagieren nicht wie andere Temperatursensoren auf ein bestimmtes zeitlich konstantes Temperaturniveau, sondern nur auf die Veränderung der Temperatur.

PIR-Sensoren werden unter anderem bei Bewegungsmeldern eingesetzt um die ausgestrahlte Wärmestrahlung auf einige Meter Entfernung zu detektieren. Damit können verschiedene Aktionen ausgelöst werden, beispielsweise das Aktivieren einer Beleuchtung oder das Auslösen einer Alarmmeldung.  

Technische Daten

BezeichnungHC-SR501
Reichweite~ 3-7m
Erfassungswinkel ~ 140°
Betriebsspannung (Vcc)4.5-20V
Ruhestrom65 µA
Ausgangsspannung (Output)3,3V high / 0 V low
Schaltzeit5 … 200 Sekunden
Blockade-Zeit2,5 Sekunden
Betriebstemperatur-15 … 70°
Abmessungen Platine32 x 24 mm
Schrauben Lochabstand28 mm
Lochdurchmesser2 mm
Durchmesser Sensorlinse23 mm
Daten zum HC-SR501

Funktion

Die Einstellung des PIR-Moduls erfolgt über zwei Potentiometer und einen Jumper (siehe Bild oben).

Potentiometer

  • Potentiometer rechts („Hold Time“)
    • Haltezeit des Signals nach dem Erkennen einer Wärmequelle
  • Potentiometer links („Sensivity“)
    • Empfindlichkeit und damit auch die Reichweite

Jumper

Ich lese immer wieder, dass „neuere“ Versionen des HC-SR501 keinen Jumper mehr haben. Was dann aber die „default“-Einstellung ist, habe ich nicht verstanden.

Die Modelle, die ich bisher gefunden hatte, haben einen Jumper für die Arbeitsweise:

  • Trigger Methoden
    • L = unrepeatable trigger (ein Impuls innerhalb der Dauer der Haltezeit)
    • H = repeatable trigger (Impuls bei jeder erkannten Bewegung)

Ich habe unterschiedliche Erklärungen gefunden. Hier nun meine Erfahrung:

Beispieleinstellung:

  • Haltezeit = 30 Sekunden
  • Jumper = L

Das Modul setzt den Ausgang bei erkannter Bewegung auf high und hält dieses Signal für 30 Sekunden. Bei jeder neuen Bewegung starten die 30 Sekunden neu. Erst bei Ablauf von 30 Sekunden ohne Bewegung geht der Ausgang auf low.

  • Haltezeit = 30 Sekunden
  • Jumper = H

Das Modul setzt den Ausgang bei erkannter Bewegung auf high und hält das Signal 30 Sekunden. Unabhängig von erkannter Bewegung geht das Signal anschließend auf low. Wird neue Bewegung erkannt, beginnt die Prozedur erneut.

Meine Absicht ist es, jegliche Logik in Node-Red/ ioBroker abzubilden. Den Geräten lasse ich dabei wenig Spielraum. Die Haltezeit möchte ich also selber regeln und setze die Haltezeit am PIR-Sensor auf ein Minimum (rechtes Potentiometer ganz nach links drehen). Da das Minimum bei ca. 3-5 Sekunden liegt, kann ich fast jede Bewegung an das Smart-Home-System senden. Damit sich die Haltezeit nicht, wie oben beschrieben, verlängert, wähle ich die Jumperstellung „H“ (repeatable-Modus).

Betrieb mit 3.3V

Der Jumper-Pin auf der Platinen-Innenseite bietet die Möglichkeit der Stromversorgung mit 3,3V.

Meine Einstellungen

Da ich die Daten in Node-Red verarbeite und dort durch die Bewegung einen Timer starte, der bei weiteren Bewegungen zurück gesetzt wird, habe ich mich für folgende Einstellung entschieden:

  • Haltezeit auf Minimum (ca. 3-5 Sekunden)
  • Empfindlichkeit nach Bedarf
  • repeatable-Modus

Die minimalste Haltezeit ist ca. 3-5 Sekunden. Nach dieser Zeit kann neue Bewegung erkannt und das Signal weitergereicht werden. In Node-Red habe ich einen Timer auf 120 Sekunden konfiguriert. Dieser kann somit bei jeder neuen Bewegung zurück gesetzt werden. Bei bestimmten Ereignissen möchte ich diesen Timer auch zur Laufzeit verändern (verlängern/ verkürzen), ich muss mich dabei nicht auf den „Timer“ im PIR-Sensor verlassen und kann das ganze Geschehen selber verändern.

Gehäuse im 3D-Druck

Arduino Test-Code

int Status = 13;  // Digital pin D7
int sensor = 14;  // Digital pin D8

void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  pinMode(sensor, INPUT);   // declare sensor as input
  pinMode(Status, OUTPUT);  // declare LED as output
}

void loop() {
  // put your main code here, to run repeatedly:
  long state = digitalRead(sensor);
    if(state == HIGH) {
      digitalWrite (Status, HIGH);
      Serial.println("Motion detected!");
      delay(1000);
    }
    else {
      digitalWrite (Status, LOW);
      Serial.println("Motion absent!");
      delay(1000);
      }

}
Erstelle deine Website mit WordPress.com
Jetzt starten