DHT22 -> ESP8266 (ESP-01) <=Wlan=> Mosquitto <- Fhem <- MQTT <- MQTT_Device

Begonnen von Papaloewe, 28 März 2015, 19:52:13

Vorheriges Thema - Nächstes Thema

schka17

Zitat von: ken016 am 24 April 2015, 08:39:28

Bin also bis zu dem Punkt vom Starter Beitrag:
-"Im fhem die zus. notwendigen MQTT perl Komponenten installiert."
-"In fhem eine MQTT-Verbindung definiert und danach ein MQTT-Device."

An diesen beiden Aussagen hänge ich aktuell.
Könnte mir jemand da Unterstützung geben?
Herzlichen Dank.

grüße
Ken

nun, steht alles schön beschrieben in der Commandref, du musst ein IO Device anlegen,

http://fhem.de/commandref.html#MQTT

dort sind auch die Vorrausetzungen beschrieben.

dann ein MQTTDevice

http://fhem.de/commandref.html#MQTT_DEVICE

Ich bin dann bei dem autosubscribes auf die topics ein bischen "gestolpert", scheinbar funktioniert das + nur über einen Hierarchie Ebene, daher habe ich auch die Topics in den LUA Skripts angepasst und die Value Ebene entfernt.

Gruß

Karl
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

Papaloewe

ZitatIch bin dann bei dem autosubscribes auf die topics ein bischen "gestolpert", scheinbar funktioniert das + nur über einen Hierarchie Ebene, daher habe ich auch die Topics in den LUA Skripts angepasst und die Value Ebene entfernt.

Das "+" funktioniert so schon richtig, nur scheint das "#" nicht implementiert zu sein.
Das "#" sollte eigentlich über mehrere Ebenen hinweg als Joker fungieren.
Tut es (bisher) aber leider nicht ;-(.

schka17

Zitat von: Jaydee am 19 April 2015, 14:09:14
Hi Karl,

Danke für den Tipp!
Ich hab gnz einfach nur die arduino-1.6.1-p1-windows.zip von Github runtergeladen und (zunächst auf dem Desktop) entpackt. Dann die ESPDHT22.zip von John runtergeladen, die beiden Verzeichnisse aus dem Libraries-Unterverzeichnis, in das Libraries-Verzeichnis des Arduino-Ordners gelegt und das ESPDHT22FHEM-Verzeichnis aus Johns ZIP in den Examples-Ordner von Arduino kopiert.
Und dann noch in der IDE unter Werkzeuge des Programmer auf "esptool" gesetzt, den Com-Port gewählt und als Platine das "Generic ESP8266 board" genommen.

Das wars...

LG

Hallo Jan,

danke, funktioniert.

Gruß

Karl
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

Kuzl

Mal ne blöde Frage.... wie betreibt man das ganze sinnvoll mit Batterien?

Kuzl

Ich hab jetzt mal mit dem Sleep experementiert und auch den verbrauch des DHT22 senken können, indem ich seine Versorgung an einen GPIO gehängt habe und nur beim messen einschalte. Was mir eher sorgen macht, ist grundsätzlich eine 3.3V-Versorgung durch batterien zu erreichen.

Bapt. Reverend Magersuppe

Zitat von: Kuzl am 15 Mai 2015, 15:02:39
Was mir eher sorgen macht, ist grundsätzlich eine 3.3V-Versorgung durch batterien zu erreichen.

3x Monozelle an einem Step-Down könnte klappen.
--
If I was born in 1453, Leonardo da Vinci would be jealous of me.
Reverend Paul Egon Magersuppe
Aus versicherungstechnischen Gründen sind sämtliche Beiträge von mir rein spekulativer und theoretischer Natur und sollten nicht in die Tat umgesetzt werden!
Bin hier selten DRIN. AUS GRÜNDEN!

drdownload

Ich bastle auch gerade herum gerade was Batteriebetrieb betrifft und gerade das Aktualisierungsintervall hat extremen Einfluss weil beim ESP8266 gerade das Wiederverbinden mit Wifi und MQTT Broker 3-4 Sekunden dauert.

Gibt es bei MQTT eigentlich die Möglichkeit den Timestamp der Nachricht zu setzen? Mein Gedanke wäre sonst zB Messwerte nur 4x in der Stunde zu übermitteln aber alle 5 min zu erfassen.
CUL 868 Slow-RF (FS20 Aktoren, Sender, FHT8V), CUL 868 (WMBUS-Empfang), Jeelink (PCA301), WS3600 (WH3080 über USB-Basis), Bewässerung mit ESP-Easy und Proplanta, RFXTRX433 Home-Easy Empfang und Senden, Oregon TH, WS001 TH), Blackbean IR, Mopidy-Snapcast MR Audio, Kodi, Forum-LED-Controller,

Kuzl

Einen Step-down hab ich auch schon probiert aber der hat mir 5mA im leerlauf gezogen... momwntan teste ich 3xMonozelle und 2 Dioden dahinter allerdings saugt das die Batterien nicht wirklich leer

Zu Timestamps fällt mir nichts ein leider. könnte man wenn dann mit Fhem erledigen.

drdownload

Nachdem erst der Broker den Timestamp hinzufügt könnte man es natürlich zur Payload dazugeben, aber es ist die Frage wie MQTT konform das noch wäre.
CUL 868 Slow-RF (FS20 Aktoren, Sender, FHT8V), CUL 868 (WMBUS-Empfang), Jeelink (PCA301), WS3600 (WH3080 über USB-Basis), Bewässerung mit ESP-Easy und Proplanta, RFXTRX433 Home-Easy Empfang und Senden, Oregon TH, WS001 TH), Blackbean IR, Mopidy-Snapcast MR Audio, Kodi, Forum-LED-Controller,

hexenmeister

Es gibt auch sehr sparsame StepUps. Z.B. max1724 benötigt im Leerlauf gerade mal 5µA.

Kuzl

Der klingt ganz gut. Nur dir 150mA maximalstrom geben mir bedenken. Das Modul kann ja auch kurzzeitig 200mA ziehen. Macht dem das was aus?

hexenmeister

War nur ein Beispiel, es gibt sicher auch leistungsfähigere. Obwohl, ich denke, ein Elko könnte das Problem lösen, da solcher Verbrauch nur kurzfristig notwendig sein dürfte. Müsste man ausprobieren.

Kuzl

Stimmt auch wieder.
Ist allerdings noch ein weiter Weg dort hin...
Die IDE scheint zuminderst unter Windows noch sehr Buggy zu sein. Mit der neusten Version funktioniert der sleep nicht und mit der alten kann man den watchdog nicht einstellen. Der löst bei mir im Moment bei jedem 3 Reboot aus; meistens dann, wenn ich die versorgungsspannung Messen will. Außerdem scheint die DHT-Library nur zu funktionieren, wenn man ein delay am Anfang einbaut. Kann sich das jemand erklären?
Hier mal mein Code (abwandlung aus dem geposteten von vor ein paar Tagen)



#include <stdio.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include "Client.h"

#include <DHT.h>
#include <PubSubClient.h>
extern "C" {
  #include "user_interface.h"
  uint16 readvdd33(void);
}

#define SENSOR_POWER_PIN 0
#define HUMIDITY_SENSOR_PIN 2
#define SHOW_MEASURE

// --------- adjust following settings for radio
const char* ssid = "****************";
const char* password = "************";

// --------- settings for MQTT
char mqttBroker[] = "zbox";
int  mqttPort = 1883;

#define MQTTDeviceID "02"
#define MQTTClientID "ESP." MQTTDeviceID
#define MQTT_USER ""
#define MQTT_PASSWORD ""

#define TOPIC_ClientID "ESP/" MQTTDeviceID
#define TOPIC_LastWill  TOPIC_ClientID "/connected"

#define TOPIC_Location  TOPIC_ClientID "/location"

#define TOPIC_HumidityState  TOPIC_ClientID "/humidity"
#define TOPIC_TemperatureState  TOPIC_ClientID "/temperature"
#define TOPIC_VddState TOPIC_ClientID "/Vdd"


// stati der mqtt statemachine
#define ST_INIT 0
#define ST_CONNECT 2
#define ST_CONNECTED 3


bool firstInit = true;

// mqtt callback handler
void mqttCallback(char* topic, byte* payload, unsigned int length);

WiFiClient ethClient;

//mqtt client verbindung definieren, samt callback
PubSubClient client(mqttBroker, mqttPort, mqttCallback, ethClient); // instanziierung ueber DNS Namen

DHT dht;

bool tempReq=false;
bool humReq=false;
bool vddReq=false;
float lastTemp;
float lastHum;
float lastVdd;
unsigned long dhtWaiter;

int MqState = 0;
unsigned long MqWaiter;
boolean callbackEnable=false;

char charBuffer[32];

// ------------------------
void setup() {

   Serial.begin(115200);   
//   delay(2000);

   Serial.println("Startup...");
   
   //activate DHT22
   pinMode(SENSOR_POWER_PIN, OUTPUT);
   digitalWrite(SENSOR_POWER_PIN, LOW);
   
   // Connect to WiFi network
   WiFi.begin(ssid, password);
   Serial.println("Wifi Started");
   delay(2000);

   dht.setup(HUMIDITY_SENSOR_PIN); 

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}
// ------------------------
// publish mit retain
boolean myPublish(char* topic, char* payload){
  client.publish(topic,(uint8_t*)payload,strlen(payload),true);
}

// ------------------------
// process DHT22
void processDHT()
{
  if(!firstInit)
    return;
 
  delay(dht.getMinimumSamplingPeriod());
 
  dht.readSensor();
  if (dht.getStatus() != dht.ERROR_NONE)
  {
    Serial.print("result:");Serial.println(dht.getStatusString());
    return;
  }

  lastTemp = dht.getTemperature();

  if (isnan(lastTemp))
  {
    Serial.println("Failed reading temperature from DHT");
  }
  else{
    tempReq=true;
    #if defined(SHOW_MEASURE)
      Serial.println(""); Serial.println(""); Serial.print("T: "); Serial.println(lastTemp);
    #endif
  }

  lastHum = dht.getHumidity();

  if (isnan(lastHum)) {
    Serial.println("Failed reading humidity from DHT");
  }
  else{
    humReq=true;

    #if defined(SHOW_MEASURE)
      Serial.print("H: "); Serial.println(lastHum);
    #endif
  }
}

// ------------------------
// process VDD
void processVDD()
{
  if(!firstInit)
     return;

  lastVdd = readvdd33() / 1000.0;
  vddReq=true;
 
  #if defined(SHOW_MEASURE)
     Serial.print("VDD: "); Serial.println(lastVdd); Serial.println("");     
  #endif
}

// ---------------------------
// mqtt callback,after an external publish for subscribed items
void mqttCallback(char* topic, byte* payload, unsigned int length)
{
    Serial.print("callback starts with topic:");Serial.println(topic);
}

// ---------------------------
// called after connection to mqtt broker
void onMqttConnected(){
    myPublish((char *)TOPIC_Location,(char *)"Aussen");
}

// ---------------------------
// processes the items to be published
void processMqttItems(){
  char buffer[30];
  String strBuffer;

  if (humReq){
     humReq=false;
     strBuffer =  String(lastHum);
     strBuffer.toCharArray(charBuffer,10);
     myPublish((char *)TOPIC_HumidityState,charBuffer); 
     Serial.println("update hum"); 
  }
 
  if (tempReq){
     tempReq=false;
     strBuffer =  String(lastTemp);
     strBuffer.toCharArray(charBuffer,10);
     myPublish((char *)TOPIC_TemperatureState,charBuffer); 
     Serial.println("update temp"); 
  }
 
  if (vddReq){
     vddReq=false;
     strBuffer =  String(lastVdd);
     strBuffer.toCharArray(charBuffer,10);
     myPublish((char *)TOPIC_VddState,charBuffer); 
     Serial.println("update Vdd"); 
  }
 
  if ((firstInit == false) && (humReq == false) && (tempReq == false) && (vddReq == false))
  {
    pinMode(SENSOR_POWER_PIN, INPUT);
   
    Serial.println("go to sleep");
//    ESP.wdtDisable();
    system_deep_sleep_set_option(0);
    system_deep_sleep(5 * 60 * 1000 * 1000);
      Serial.println("..."); 
      delay(1000);   
  }
}
// -------------------------------

void processMQTT(){
int nextState=MqState;

if (millis() < MqWaiter)
    return;

if (MqState == ST_INIT){
    Serial.println("Init");
    client.disconnect();
    MqWaiter = millis() + 500;
    nextState = ST_CONNECT;
}
else if (MqState == ST_CONNECT)
  {
    Serial.println("+Try to connect");
    Serial.print("ClientID:");Serial.println(TOPIC_ClientID);
   
    callbackEnable=false;
   
    // clientID, user,password,Will-Topic, Qos, Retain, will msg
    if (client.connect((char *)TOPIC_ClientID,(char *)MQTT_USER ,(char *)MQTT_PASSWORD,(char *)TOPIC_LastWill,1,1,(char *)"0"))  {
      Serial.println("connected");

      myPublish((char *)TOPIC_LastWill,(char *)"1");

      onMqttConnected();
      callbackEnable=true;
     
      nextState = ST_CONNECTED;
    }
    else {
      Serial.println("not connected");
      nextState = ST_INIT;
    }
  }
 
  else if (MqState == ST_CONNECTED){
    // mqtt loop
    if ( ! client.loop()){
      Serial.println("disconnected");
      nextState = ST_INIT;
    }
    else {
      processMqttItems();
    }
  }

  if (nextState != MqState)
  {
    MqState = nextState;
    Serial.print("new state:");Serial.println(nextState);
  }


// -------------------------------
void loop() { 
  processDHT();
  processVDD();
  processMQTT();

  firstInit = false;
}

hexenmeister

Zitat von: Kuzl am 16 Mai 2015, 17:04:46
Außerdem scheint die DHT-Library nur zu funktionieren, wenn man ein delay am Anfang einbaut. Kann sich das jemand erklären?

Ohne mich jetzt in den Code zu vergraben... Aber DHT benötigt eine bestimmte Zeit zum Initialisieren und kann nicht (sinnvoll) sofort abgefragt werden.


Kuzl

Das würde ich verstehen ja. Allerdings wird das delay vor dem initialisieren des DHT benötigt. Ändert auch nichts, wenn der DHT dauerhaft versorgt wird.