Aujourd'hui, nous parlons de MQTT (Message Queuing Telemetry Transport), un protocole très couramment utilisé dans le domaine du smarthome. Nous voulons équiper l'Envy de l'offre d'aujourd'hui avec ce protocole afin de pouvoir le connecter facilement aux systèmes Smarthome. Nous apprendrons également à connaître l'un de ces liens. Nous allons connecter l'Envy au panneau de contrôle du Smarthome décrit dans le livre Smarthome.
Un message MQTT est constitué d'un sujet et des données associées. Le sujet est structuré de manière hiérarchique, comme un chemin d'accès à un répertoire. Les niveaux individuels sont séparés par des barres obliques. Des caractères de remplacement peuvent être utilisés. Le fonctionnement du MQTT est décrit en détail dans le chapitre 6 du livre Smarthome.
Les données sont représentées sous la forme d'un objet au format JSON (Java Script Object Notation). L'avantage de ce format est que toutes les données sont transmises sous forme de chaînes de caractères lisibles. Les valeurs et unités mesurées sont représentées comme les propriétés d'un objet. Nous allons définir les propriétés suivantes pour le Envy.
- - capteur Nom du capteur (configurable)
- t Valeur de la température de SHT30
- tu Unité pour la température "°C" ou "°F" (configurable)
- h Humidité de SHT30
- hu Unité d'humidité fixée "%".
- g Concentration en gaz du MQ2
- gu Unité de concentration de gaz fixée "ppm
Comme mentionné dans la liste, le nom du capteur et l'unité de température souhaitée doivent être configurables. En outre, le type de gaz à examiner doit également être configurable. Pour que l'Envy puisse se connecter au WLAN et ensuite au courtier MQTT, nous avons besoin des données d'accès au WLAN, de l'adresse du courtier, des données d'accès au courtier, du sujet MQTT et du taux de répétition de la mesure (par exemple une mesure/minute). Toutes ces valeurs devraient également être configurables.
Comme l'Envy n'a pas d'éléments d'entrée et d'affichage, la configuration peut se faire via des constantes codées en dur dans le programme ou plus élégamment via le navigateur. Pour la configuration via le navigateur, il existe la bibliothèque WebConfig, qui peut fournir un formulaire web librement configurable via un serveur web. Cette bibliothèque est également décrite dans le livre Smarthome à partir de la page 168.
Comme il n'est pas possible de se connecter au WLAN sans configuration, nous allons d'abord démarrer un point d'accès dans ce cas, qui délivrera la page web de configuration via l'adresse 168.178.4.1. Nous pouvons alors entrer les données d'accès et relancer l'Envy. Si l'Envy a une configuration et peut se connecter au WLAN, aucun point d'accès n'est lancé. L'accès à la page de configuration est alors possible via l'adresse que l'Envy reçoit lorsqu'il se connecte au WLAN.
Comme cette procédure peut être utilisée chaque fois qu'un ESP8266 doit fournir des valeurs mesurées via le MQTT, une bibliothèque a été développée en relation avec le livre Smarthome qui fournit un fichier d'inclusion qui effectue toutes les tâches décrites ci-dessus. La bibliothèque est incluse dans le matériel du livre, mais peut également être téléchargée sur GitHub. La fonction de ce fichier auxiliaire est également décrite dans le livre qui commence à la page 176.
Cela nous amène à notre croquis pour l'Envie. Les bibliothèques suivantes doivent être installées.
- ClosedCube_SHT31D.h pour le SHT30 de gestion de la bibliothèque Arduino
- MQUnifiedsensorh pour le capteur de gaz de gestion de la bibliothèque Arduino
- ESP8266_MQTT_Conf.h à partir du fichier ZIP de GitHub
- ArduinoJson.h pour le format JSON de gestion de la bibliothèque Arduino
- PubSubClient.h pour le protocole MQTT de gestion de la bibliothèque Arduino
Une fois toutes ces bibliothèques sont installées, le croquis peut être compilée.
Serial.printf("Temperatur = %f %s Feuchtigkeit = %f %% Gaskonzentration = %f ppm\n",temperature,unit.c_str(),humidity,gas); #include "ESP8266_MQTT_Conf.h" //Includedatei enthält alles für WiFi, Konfiguration und MQTT
#include <Wire.h> //Notwendig für SHT30
#include "ClosedCube_SHT31D.h" //Bibliothek für SHT30
#include <MQUnifiedsensor.h> //Bibliothek für Gassensor
//Parameter für den Gassensor
/************************Hardware Related Macros************************************/
#define Board ("ESP8266")
#define Pin (A0) //Analog input
/***********************Software Related Macros************************************/
#define Type ("MQ-2") //MQ2
#define Voltage_Resolution (3.3)
#define ADC_Bit_Resolution (10) // For arduino UNO/MEGA/NANO
#define RatioMQ2CleanAir (9.83) //RS / R0 = 9.83 ppm
//Spezifische Einträge für das Konfigurationsformular
String param = "["
"{"
"'name':'thema',"
"'label':'MQTT Thema Temp.',"
"'type':"+String(INPUTTEXT)+","
"'default':'envy'"
"},"
"{"
"'name':'sensor',"
"'label':'Name des Sensors',"
"'type':"+String(INPUTTEXT)+","
"'default':'SHT30'"
"},"
"{"
"'name':'typ',"
"'label':'Welches Gas?',"
"'type':"+String(INPUTSELECT)+","
"'default':'1',"
"'options':["
"{'v':0,'l':'Wasserstoff'},"
"{'v':1,'l':'LPG'},"
"{'v':2,'l':'Kohlenmonoxyd'},"
"{'v':3,'l':'Alkohol'},"
"{'v':4,'l':'Propan'}"
"]},"
"{"
"'name':'fahrenheit',"
"'label':'Fahrenheit',"
"'type':"+String(INPUTCHECKBOX)+","
"'default':'0'"
"}"
"]";
//SHT Sensor Instanz
ClosedCube_SHT31D sht;
//MQ2 Sensor Instanz
MQUnifiedsensor MQ2(Board, Voltage_Resolution, ADC_Bit_Resolution, Pin, Type);
//Einstellwerte für verschiedene Gase
const float gase[5][2] {
{987.99,-2.162}, //Wasserstoff
{574.25,-2.222}, //LPG
{36974,-3.109}, //Kohlenmonoxyd
{3616.1,-2.675}, //Alkohol
{658.71,-2.168} //Propan
};
//Daten an den MQTT Broker senden
void publishData() {
//Daten von SHT30 lesen die hohe Wiederholbarkeit verringert das Rauschen.
//Der Parameter 50 gibt den Timeout an
SHT31D result = sht.readTempAndHumidityPolling(SHT3XD_REPEATABILITY_HIGH, 50);
//Messwerte in Variable übernehmen
float humidity = result.rh;
float temperature = result.t;
String unit = "°C";
temperature = temperature - 6; //Korrektur wegen Erwärmung durch Gassensor und Controller. //Falls Fahrenheit gewählt wurde, die Temperatur umrechnen
if (conf.getBool("fahrenheit")) {
temperature= temperature * 1.8 +32;
unit="°F";
}
//Messwerte vom Gassensor
MQ2.update(); // Update die Spannung am Analogeingang wird gemessen
float gas=MQ2.readSensor(); //Die Gaskonzentration in ppm ermitteln
char buffer[1000]; //Buffer für die JSON Zeichenkette
//Der temporäre Speicher für das JSON Dokument wird angelegt
//Wir reservieren 500 Zeichen
StaticJsonDocument<500> doc;
//Das JSON Objekt wird mit Daten befüllt
doc["sensor"]=conf.getValue("sensor"); //Name des Sensors
doc["t"]=temperature; //Temperatur
doc["tu"]=unit; //Einheit
doc["h"]=humidity; //Feuchte
doc["hu"]="%";
doc["g"]=gas; //Gaskonzentration
doc["gu"]="ppm";
//Aus dem Objekt wird die JSON Zeichenkette im Buffer gebildet
uint16_t n = serializeJson(doc, buffer);
//Kontrollausgabe
Serial.println(buffer);
//Der Messwert wird mit dem Thema an den Broker gesendet
if (!client.publish(conf.getValue("thema"), buffer, n)) {
Serial.print("Fehler beim Senden an MQTT Server = ");
Serial.println(client.state());
}
}
void setup() {
Serial.begin(74880); //Damit auch Bootmeldungen des ESP8266 angezeigt werden
//I2C Bus starten
Wire.begin();
//Start des SHT30
sht.begin(0x44);
//Seriennummer des SHT30 anzeigen
Serial.print("Serial #");
Serial.println(sht.readSerialNumber());
//Die Setupfunktion in der Include Datei aufrufen
//WLAN und Konfiguration werden vorbereitet
//Verbindung zum MQTT Broker wird hergestellt
//Der Parameter param enthält zusätzliche Formulareinträge
//für das Konfigurationsformular, true bedeutet dass wir einen
//Sensor haben
ESP_MQTT_setup(param,true);
//Callbackfunktion zum Senden der Daten registrieren
onPublish = publishData;
//Das Regressionsmodell für die Gaskonzentration wird gewählt
MQ2.setRegressionMethod(1); //_PPM = a*ratio^b
int gas = conf.getInt("typ");
//Die Parameter für das in der Konfiguration gewählte
//Gas werden gesetzt
MQ2.setA(gase[gas][0]); MQ2.setB(gase[gas][1]);
//Gas Sensor Bibliothek initialisieren
MQ2.init();
//Gassensor kalibrieren
Serial.print("Calibrating please wait.");
float calcR0 = 0;
for(int i = 1; i<=10; i ++)
{
MQ2.update(); // Update data, the arduino will be read the voltage on the analog pin
calcR0 += MQ2.calibrate(RatioMQ2CleanAir);
Serial.print(".");
}
MQ2.setR0(calcR0/10);
Serial.println(" done!.");
if(isinf(calcR0)) {Serial.println("Warning: Conection issue founded, R0 is infite (Open circuit detected) please check your wiring and supply"); while(1);}
if(calcR0 == 0){Serial.println("Warning: Conection issue founded, R0 is zero (Analog pin with short circuit to ground) please check your wiring and supply"); while(1);}
}
void loop() {
//Schleifenfunktion der eingebundenen Hilfsdatei aufrufen
//Sorgt dafür, dass die Messwerte in regelmäßigen
//Zeitabständen ermittelt und an den Broker gesendet werden
ESP_MQTT_loop();
}
L'avertissement du compilateur selon lequel une bibliothèque peut ne pas être compatible avec le conseil peut être ignoré.
Comme de très nombreuses fonctions sont implémentées dans le fichier inclus, le code reste gérable. La fonction la plus importante est la fonction de rappel publishData(), qui est appelée chaque fois que de nouvelles données provenant des capteurs doivent être transférées au courtier. Dans la fonction de configuration, les capteurs sont préparés et ensuite la configuration du fichier d'inclusion est appelée. Dans la boucle principale, seule la fonction de boucle du fichier d'inclusion est appelée. Dès le début, on définit la constante de chaîne param, qui contient la description de la forme des configurations spécifiques à l'Envy.
Nous pouvons maintenant télécharger le plan dans l'Envy. Pour cela, nous devons utiliser un adaptateur FDTI où nous connectons GND, TX et RX aux mêmes broches sur l'Envy.
Une fois le croquis est téléchargé, le programme peut être lancé. Comme aucune configuration n'existe encore, un point d'accès est lancé. Nous nous connectons à ce point d'accès avec un smartphone (aucun mot de passe n'est requis) et appelons l'adresse http://192.168.4.1 dans un navigateur. La page de configuration devrait maintenant être affichée.
Une fois la configuration sauvegardée et l'Envy redémarré, il envoie un télégramme de données au courtier MQTT à l'intervalle de mesure configuré. La figure montre les messages que le courtier reçoit.
Maintenant que l'Envy fournit ses valeurs mesurées sous forme de messages MQTT, nous voulons afficher les valeurs mesurées dans le panneau de contrôle du Smarthome sur l'AZ-Touch. Pour savoir comment accéder au panneau de contrôle du Smarthome et à son fonctionnement, vous pouvez consulter le livre Smarthome. Je veux seulement vous montrer une configuration appropriée pour afficher les données de l'Envy. Pour cela, il faut un panneau de contrôle Smarthome fonctionnel.
Note importante!!
Lorsque le livre a été terminé, le MOD AZ-Touch et l'écran de 2,8 pouces n'existaient pas encore. Il est donc nécessaire d'apporter de petites modifications aux croquis de SmarthomeZentrale_x.ino dans le matériel du livre. L'exception est le croquis SmarthomeZentrale_8.ino dans le dossier "New", qui contient déjà tous les changements pour le MOD AZ-Touch avec un affichage de 2,8 pouces. Les modifications à apporter sont décrites dans le fichier ReadMe.txt.
Dans le Smarthome Central, nous ajoutons une nouvelle page blanche. Sur cette page, nous ajoutons trois widgets de barre de couleur d'une largeur de 4 unités et d'une hauteur de 14 unités. Les illustrations montrent les valeurs réglées:
Comme les limites ne sont pas adaptées, nous ajusterons également les paramètres spécifiques des widgets. Les chiffres indiquent les valeurs adaptées :
La page d'affichage de l'Envy devrait alors ressembler à ceci :
Amusez-vous bien avec l’AZ-Envy.
10 commentaires
Holger Siefert
Hallo,
bei der Auswahl von CO bekomme ich stark schwankende Werte. An der “frischen Luft” schwankt der Messwert im Sekundentakt zwischen 30 und 60 ppm. Im Innenraum ist es ähnlich. Kann dazu jemand etwas sagen?
Dirk Overhoff
Super, vielen Dank für die Rückmeldung, ich habe es aber zwischenzeitlich mit dem ESP tool geschafft, den Speicher zu leeren. Das funktioniert nun. Aber: Gibt es Erfahrungen mit der Integration/Konfiguration im IO-Broker? Das Envy scheint nicht mit den bekannten Adaptern: MQTT Broker/Client, Sonoff und Shelly zu kommunizieren. Kann der Port des Servers am Envy eingestellt werden, bzw. welcher wird standardmäßig adressiert? Beste Grüße, Dirk
Gerald Lechner
Hallo Dirk,
in der Arduino IDE bei Werkzeug /Erase Flash den Eintrag “All Flash Content” wählen und mit dieser Einstellung den Sketch hochladen. Damit werden alle gespeicherten Daten gelöscht.
Dirk Overhoff
Hallo,
nach der Speicherung Konfiguration des WIFI and MQTT Servers kann die Envy Config Seit nicht im neuen WLAN mit der DHCP assignierten IP aufgerufen werden. Nach dem Überschreiben des Speichers geht das Envy nicht auf die config ip 192.168.1.4 und den Access point zurück. Stattdessen wird die MAC Adresse weiterhin im vorher konfigurierten Wlan angezeigt. Da ich den Webserver nicht erreichen kann ist eine recovery nicht möglich. Gibt es eine Möglichkeit das system vollständig zu resetten?
Beste Grüße, Dirk
Norbert
Hallo,
die SmarthomeZentrale ist interessant, leider kann die sich nicht mit dem MQTT-Server verbinden, da der User und Password fehlt.
Gibt es da eine Lösung ?
Gruß Norbert
Jan
Alles klar – vielen Dank für die Info – probiere die Beispiele mal aus…
Grüße, Jan
Bernd Albrecht
Die Frage bezieht sich auf den Sensor MQ-2, der auch separat im Sortiment von AZ-Delivery verkauft wird. Auf der Produktseite gibt es dazu weiterführende Dokumentation.
https://www.az-delivery.de/en/products/gas-sensor-modul?pos=1&_sid=d98f89d48&ss=r
Kurz und knapp: Der Sensor liefert (nur) einen analogen Wert, der ungefähr einer bestimmten Gaskonzentration entspricht. Der Messtechniker nennt so etwas „Schätzeisen“. Wenn Sie nur den analogen Wert messen ( analogRead(A0) ) und einen Schwellenwert für einen Alarm festlegen, dann wird auch bei Rauch dieser Alarm ausgelöst.
Erfahrungswert: Bei einem 10-bit ADC (max. Wert 1023) liegt der Wert für normales Raumklima bei 70 – 110. Wenn Sie den Schwellenwert dann auf 200 festlegen, wird Alarm ausgelöst, wenn ein Schnapsglas in der Nähe verschüttet wird oder der offene Kamin nicht richtig zieht.
Jan
Hallo,
wie kann ich mir den Rauch(Smoke) ausgeben lassen?
Ihr bietet nur die Gase an…
Danke,
Jan
Gerald Lechner
Hallo Thomas,
Du hast nichts falsch gemacht. Beim Upload der Files auf GitHub ist etwas schief gelaufen und damit war das ZIP File bis auf die Readme Datei leer. Das ist jetzt behoben. Bitte nochmals runterladen.
Sorry Gerald
Thomas Ücok
Hallo,
die ESP8266_MQTT_Conf.h befindet sich nicht in dem GITHub Download. Oder mache ich da etwas
falsch ?
Gruß
Thomas Ücok