Probleme bei der Datenübertragung via Homie/MQTT

@beeneugierig hat ein Auge auf die Homie-basierte Firmware von Alexander Wilms geworfen und will seinen Wemos D1 damit bestücken. Er hatte kleine Probleme bei der Datenübetragung via MQTT. Siehe auch:

Hey,

ich stecke leider mit der node-wifi-mqtt-homie Firmware fest, zum MQTT Broker zu verbinden.
Serialmonitor gibt folgendes aus:

💡 Firmware Bienen (1.0.1)
🔌 Booting into normal mode 🔌
{} Stored configuration
• Hardware device ID: a020a61afb4e
• Device ID: HM01
• Name: HiveOne
• Wi-Fi:
â—¦ SSID: FRITZ!Box Fon WLAN 7112
â—¦ Password not shown
• MQTT:
â—¦ Host: swarm.hiveeyes.org
â—¦ Port: 8883
â—¦ Base topic: hiveeyes/pw/BZVMUC/hive01/data/json
â—¦ Auth? no
• OTA:
â—¦ Enabled? no
↕ Attempting to connect to Wi-Fi…
✔ Wi-Fi connected, IP: 192.168.178.43
Triggering WIFI_CONNECTED event…
↕ Attempting to connect to MQTT…
Retrying (500ms)…
↕ Attempting to connect to MQTT…
Retrying (1000ms)…

Das config file (ging nur über SPIFF Upload-Methode bisher):

{
“name”: “HiveOne”,
“device_id”: “HM01”,
“wifi”: {
“ssid”: “FRITZ!Box Fon WLAN 7112”,
“password”: “#######”
},
“mqtt”: {
“host”: "swarm.hiveeyes.org ",
“port”: 8883,
“base_topic”: “hiveeyes/pw/BZVMUC/hive01/data/json”,
“auth”: false,
“username”: “user”,
“password”: “pass”
},
“ota”: {
“enabled”: false
}
}

Ich vermute, dass mein MQTT Verständnis daran schuld ist, bzw mein base_topic falsch? Oder liegts am Port?
Für Tipps/Vermutungen wäre ich dankbar.

LG Patrick

Hi Patrick,

@Alex und ich haben vor kurzem Authentifizierung auf dem MQTT Broker eingeführt, aber leider versäumt, das hier entsprechend anzukündigen.

Das widerspricht natürlich obenstehender Information:

Du darfst Dich also als glücklicher Kanarienvogel schätzen. Wir schicken Dir gleich per PM entsprechende credentials, vielleicht klappts damit ja gleich.

Sorry vielmals für den Fehlversuch, der vermutlich auf unser Konto geht!

Viele Grüße,
Andreas.

Hi Patrick,

Deine MQTT credentials haben wir Dir gerade eben geschickt. Ansonsten hast Du alles richtig gemacht, soweit ich das sehen kann. Evtl. bis auf:

Hier ist am Ende ein Leerzeichen zu viel!

Viele Grüße,
Andreas.

es lübbt so halbwegs.
Nachdem ich die Auth Daten von @Andreas eingegeben, Leerzeichen enfernt und Port geändert hab, wird zum Broker connected und ausgelesen.

🔌 Booting into normal mode 🔌
{} Stored configuration
• Hardware device ID: a020a61afb4e
• Device ID: HM01
• Name: HiveOne
• Wi-Fi:
â—¦ SSID: FRITZ!Box Fon WLAN 7112
â—¦ Password not shown
• MQTT:
â—¦ Host: swarm.hiveeyes.org
â—¦ Port: 1883
â—¦ Base topic: hiveeyes/pw/BZVMUC/hive01/data/json
â—¦ Auth? yes
â—¦ Username: not shown
â—¦ Password not shown
• OTA:
â—¦ Enabled? no
↕ Attempting to connect to Wi-Fi…
✔ Wi-Fi connected, IP: 192.168.178.43
Triggering WIFI_CONNECTED event…
↕ Attempting to connect to MQTT…
Sending initial information…
✔ MQTT ready
Triggering MQTT_CONNECTED event…
Calling setup function…
〽 Sending statistics…
• Wi-Fi signal quality: 46%
• Uptime: 2s
Temperature0: 22.75 °C
Temperature1: 23.06 °C
Temperature2: 22.44 °C
Reading DHT Sensors, standby
finished reading DHT Sensors.
Temperature DHTin: nan °C
Humidity DHTin: nan Temperature DHT out: 25.70 °C Humidity DHT out: 39.20
✖ MQTT disconnected
Triggering MQTT_DISCONNECTED event…
↕ Attempting to connect to MQTT…
Sending initial information…
✔ MQTT ready
Triggering MQTT_CONNECTED event…
〽 Sending statistics…
• Wi-Fi signal quality: 48%
• Uptime: 24s
✖ MQTT disconnected

Ein Problem gelöst, viele neue aufgetan:

  • Auf Grafana finde ich noch keine Daten.
    1. Einer der DHTs wird nicht ausgelesen (Vermutlich mein wiring).
  • Temperaturdifferenz von ca. 3 Grad zwischen DHT und DS18B20.
  • Ich bin nicht sicher ob diese eingemischten Sonderzeichen im Serial-Log auf ein Problem hindeuten.
  • MQTT disconnect und reconnect-Schleife ist glaube auch nicht wie es sein soll.

Mühsam ernährt sich das Eichhörnchen… :-)

→ Normal

→ Nö, Homie arbeitet mit einigen interessanten UTF-8 Symbolen (Häckchen und so), die Deine serielle Konsole nicht darstellen kann[quote=“beeneugierig, post:14, topic:185”]

  • MQTT disconnect und reconnect-Schleife ist glaube auch nicht wie es sein soll.
    [/quote]
    Zeig mal Code

puh. sehr gut. da hatte ich wenig Ansätze zum recherchieren/bug finden.

/***********************************************************************************************************
   ESP8266 Beescale
   (c)2014 - 2016 Alexander Wilms
   https://www.imker-nettetal.de
   GNU GPL v3 License
   ------------------
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with this program; if not, see:
   <http://www.gnu.org/licenses/gpl-3.0.txt>,
   or write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
   -------------------------------------------------------------------------
  Credits: Marvin Roger for the awesome Homie Framework: https://github.com/marvinroger/homie-esp8266
  Used libraries:
  HX711:    https://github.com/bogde/HX711
  RunningMedian:  https://github.com/RobTillaart/Arduino/tree/master/libraries/RunningMedian
  Homie-esp8266 v2.0.0: https://github.com/marvinroger/homie-esp8266
  Bounce2:    https://github.com/thomasfredericks/Bounce2
  ESPAsyncTCP:    https://github.com/me-no-dev/ESPAsyncTCP
  async-mqtt-client:  https://github.com/marvinroger/async-mqtt-client
**********************************************************************************************************/

#include <Homie.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <DHT.h>
// #include "HX711.h"
// #include <RunningMedian.h>

/* Use sketch BeeScale-Calibration to get these values
  const float offset = 85107.00;  // Offset load cell
  const float cell_divider = 22.27; // Load cell divider

  HX711 scale;
*/
const int DEFAULT_SEND_INTERVAL = 60;
unsigned long lastSent = 0;

//RunningMedian WeightSamples = RunningMedian(4);
//float weight;

// ADC_MODE(ADC_VCC);
// float volt;


HomieNode temperatureNode0("temperature0", "temperature");
HomieNode temperatureNode1("temperature1", "temperature");
HomieNode temperatureNode2("temperature3", "temperature");
HomieNode temperatureNodeDHTout("temperatureDHTout", "temperature");
HomieNode humidityNodeDHTout("humidityDHTout", "humidity");
HomieNode temperatureNodeDHTin("temperatureDHTin", "temperature");
HomieNode humidityNodeDHTin("humidityDHTin", "humidity");

//HomieNode weightNode("weight", "weight");
//HomieNode batteryNode("battery", "battery");

HomieSetting<long> sendIntervalSetting("sendInterval", "Interval for measurements in seconds (max. 3600)");

void setupHandler() {
  temperatureNode0.setProperty("unit").send("C");
  temperatureNode1.setProperty("unit").send("C");
  temperatureNode2.setProperty("unit").send("C");
  temperatureNodeDHTout.setProperty("unit").send("C");
  humidityNodeDHTout.setProperty("unit").send("percent");
  humidityNodeDHTin.setProperty("unit").send("percent");
  temperatureNodeDHTin.setProperty("unit").send("C");

  //weightNode.setProperty("unit").send("kg");
  //batteryNode.setProperty("unit").send("V");
}

#define ONE_WIRE_BUS 2 //which pin is used as One-Wire Bus
// Setup a OneWire instance to communicate with any OneWire devices
OneWire OneWire(ONE_WIRE_BUS);
// Pass our OneWire reference to Dallas Temperature.
DallasTemperature sensors(&OneWire);
float temperature0;
float temperature1;
float temperature2;

void getTemperatures()
{
  sensors.begin();
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  delay(100);
  temperature0 = sensors.getTempCByIndex(0);
  if (temperature0 == -127) {                  //ignore wrong reading
    delay(100);
    temperature0 = sensors.getTempCByIndex(0);
  }
  temperature1 = sensors.getTempCByIndex(1);
  if (temperature1 == -127) {                  //ignore wrong reading
    delay(100);
    temperature1 = sensors.getTempCByIndex(1);
  }
  temperature2 = sensors.getTempCByIndex(2);
  if (temperature2 == -127) {                  //ignore wrong reading
    delay(100);
    temperature2 = sensors.getTempCByIndex(2);
  }
}

#define DHToutPIN 13//choose Pin for ouside Hive DHT
#define DHTinPIN 4 //choose Pin for inside Hive DHT
#define DHTTYPE DHT22
#define DHTTYPE2 DHT22
DHT dhtout(DHToutPIN, DHTTYPE);
DHT dhtin(DHTinPIN, DHTTYPE2);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

float tout; // Read temperature as Celsius (the default)(true) if Fahrenheit.
float hout;
float tin;
float hin;

void getTempHum()
{
  Serial.println("Reading DHT Sensors, standby");
  tin = dhtin.readTemperature();
  delay(250);
  hin = dhtin.readHumidity();
  delay(250);
  tout = dhtout.readTemperature();
  if (isnan(tout)){
    Serial.println("Failed reading DHTout, retrying");
    delay(250);
    tout= dhtout.readTemperature();
  }
  delay(250);
  hout = dhtout.readHumidity();
 

  Serial.println("finished reading DHT Sensors.");
}

/*void getWeight() {
  Serial.println("Getting weight, hold on for 4 seconds");

  for (int i = 0; i < 4; i++) {
    Serial.print("*");
    scale.power_up();
    float WeightRaw = scale.get_units(10);
    yield();
    scale.power_down();
    WeightSamples.add(WeightRaw);
    delay(1000);
    yield();
  }
  Serial.println("");
  weight = WeightSamples.getMedian() / 1000;
  }
*/
void loopHandler() {
  if (millis() - lastSent >= sendIntervalSetting.get() * 1000UL || lastSent == 0) {
    getTemperatures();
    Serial << "Temperature0: " << temperature0 << "°C" << endl;
    temperatureNode0.setProperty("degrees").setRetained(false).send(String(temperature0));

    Serial << "Temperature1: " << temperature1 << "°C" << endl;
    temperatureNode1.setProperty("degrees").setRetained(false).send(String(temperature1));

    Serial << "Temperature2: " << temperature2 << "°C" << endl;
    temperatureNode2.setProperty("degrees").setRetained(false).send(String(temperature2));
    
    getTempHum();
    Serial << "Temperature DHTin: " << tin << "°C" << endl;
    temperatureNodeDHTin.setProperty("degrees").setRetained(false).send(String(tin));

    Serial << "Humidity DHTin: " << hin << "%" << endl;
    humidityNodeDHTin.setProperty("percent").setRetained(false).send(String(hin));

    Serial << "Temperature DHT out: "<< tout << "°C" << endl;
    temperatureNodeDHTout.setProperty("degrees").setRetained(false).send(String(tout));

    Serial << "Humidity DHT out: " << hout << "%" << endl;
    humidityNodeDHTout.setProperty("percent").setRetained(false).send(String(hout));

    // getWeight();
    //Serial << "Weight: " << weight << " kg" << endl;
    // weightNode.setProperty("kilogram").setRetained(false).send(String(weight));

    //volt = ESP.getVcc() / 1000 + 0.3; // ESP07 reads 0.3V too low
    // Serial << "Input Voltage: " << volt << " V" << endl;
    // batteryNode.setProperty("volt").setRetained(true).send(String(volt));

    lastSent = millis();
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  Homie_setFirmware("Bienen", "1.0.1");
  Homie.setSetupFunction(setupHandler).setLoopFunction(loopHandler);
  // Homie.disableLedFeedback(); // LED pin would break serial on ESP-07

  // scale.begin(13, 12);
  // scale.set_scale(cell_divider);
  // scale.set_offset(offset);

  dhtout.begin();
  dhtin.begin();



  temperatureNode0.advertise("unit");
  temperatureNode0.advertise("degrees");

  temperatureNode1.advertise("unit");
  temperatureNode1.advertise("degrees");

  temperatureNode2.advertise("unit");
  temperatureNode2.advertise("degrees");

  temperatureNodeDHTout.advertise("unit");
  temperatureNodeDHTout.advertise("degrees");

  humidityNodeDHTout.advertise("unit");
  humidityNodeDHTout.advertise("percent");

  temperatureNodeDHTin.advertise("unit");
  temperatureNodeDHTin.advertise("degrees");

  humidityNodeDHTin.advertise("unit");
  humidityNodeDHTin.advertise("percent");

  //  weightNode.advertise("unit");
  //  weightNode.advertise("kilogram");

  //  batteryNode.advertise("unit");
  //  batteryNode.advertise("volt");

  sendIntervalSetting.setDefaultValue(DEFAULT_SEND_INTERVAL);

  Homie.setup();
}

void loop() {
  Homie.loop();

}

Nach rewiring wird alles brav ausgelesen. DHT scheint konstant 2 Grad mehr auszulesen. Wenn das sich bestätigt, leicht über nen offset zu fixen.

beim Broker scheint immer noch nichts angekommen. irgendwas geht bei der Kommunikation über MQTT verkehrt.

Wir bekommen folgende Fehlermeldungen im Backend Log:

2017-03-29T01:21:00+0200 [kotori.daq.services.mig            ] ERROR: 
Error processing MQTT message from topic "hiveeyes/pw/BZVMUC/hive01/data/__json__HM01/$online": 
[Failure instance: Traceback: <type 'exceptions.ValueError'>: could not convert string to float: false

Per

mosquitto_sub -h swarm.hiveeyes.org -t 'hiveeyes/#' -v

lässt sich auch nachvollziehen, was derzeit genau von Deinem Homie Node ankommt:

hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/$online false
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/$homie 2.0.0
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/$implementation esp8266
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/$mac A0:20:A6:1A:FB:4E
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature0/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature0/$properties unit,degrees
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature1/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature1/$properties unit,degrees
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature3/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature3/$properties unit,degrees
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperatureDHTout/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperatureDHTout/$properties unit,degrees
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/humidityDHTout/$type humidity
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/humidityDHTout/$properties unit,percent
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperatureDHTin/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperatureDHTin/$properties unit,degrees
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/humidityDHTin/$type humidity
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/humidityDHTin/$properties unit,percent
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/$name HiveOne

Das passt noch nicht ganz. Wir erwarten auf dem Topic hiveeyes/pw/BZVMUC/HM01/data/__json__ ein JSON-formatiertes Datenpaket (“[Object]”), das die Messwerte als Schlüssel-/Wert-Paare enthält. Dies kann beispielsweise so aussehen:

{"temperature": 42.42, "humidity": 84.84}

Du kannst das erreichen, wie es in Alex’ Firmware zu sehen ist, die relevanten Stellen sind die Zeilen 85:

HomieNode jsonNode("data","__json__");

sowie analog zu 160 ff.:

float temperature = 42.42f;
float humidity    = 84.84f;

// Publish JSON message to Hiveeyes backend
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["temperature"] = temperature;
root["humidity"]    = humidity;
String values;
root.printTo(values);
Serial << "JSON data:" << values << endl;
jsonNode.setProperty("__json__").setRetained(false).send(values);

Der Homie Base Topic muss auch noch entsprechend konfiguriert werden. @Alex: Ich glaube, das geht aus dem Artikel noch ein wenig ungenau hervor, was man genau eintragen müsste. Könntest Du hier noch nachlegen?

@beeneugierig: Du müsstest bei Dir vermutlich folgende Konfigurationsparameter für Homie verwenden:

base_topic: hiveeyes/pw/BZVMUC/
device_id:  HM01

Gemeinsam mit dem oben angegebenen Code Fragment könnte das erfolgreich sein. Hintergrund: Wir empfangen die Daten “en bloc” über die spezielle HomieNode jsonNode("data","__json__"). Die anderen, nach regulärer Homie Konvention diskret auf den MQTT Bus publizierten Werte können und sollen davon unberührt bleiben.

Wir hoffen, dass wir Dir damit weiterhelfen konnten. Sag gern Bescheid, wenn weiterhin etwas klemmen sollte.

@beeneugierig: @Andreas hat Recht, dein Basetopic ist falsch, es muss lauten

hiveeyes/imker-id/standort/beute(node)/

Außerdem hast Du aus dem Code die __json__ node rausgeschmissen, genau die sorgt für die hiveeyes Kompatibilität (der Rest ist für Hiveeyes (noch) nicht notwendig, aber Homie-bedingt).

Guck nochmal in den Quellcode:

Das muss drin sein:

  • Im Init:
HomieNode jsonNode("data","__json__");
  • Im loopHandler:
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["Weight"] = weight;
root["Temp1"]  = temperature0;
root["Temp2"]  = temperature1;
String values;
root.printTo(values);
Serial << "Json data:" << values << endl;
jsonNode.setProperty("__json__").setRetained(false).send(values);

Das JSON Objekt musst Du natürlich mit deinen Werten befüllen.

Das wird dann zu zwei Topics zusammengebaut bzw. hat folgende Busnachrichten zur Folge:

hiveeyes/imker-id/standort/beute-x/data/$type __json__
hiveeyes/imker-id/standort/beute-x/data/__json__ {"Weight":47.54,"Temp1":33.75,"Temp2":12.94}

Gruß,
Alex

Hallo @beeneugierig,

jetzt scheint hier etwas geklappt zu haben, ein einzelner Datenpunkt wurde übermittelt:
https://swarm.hiveeyes.org/grafana/dashboard/db/hiveeyes-pw-automatic?from=1490796656559&to=1490818292144

Herzlichen Glückwunsch,
Andreas.

Danke für die TIpps.
Ich habe mit einer Kopie von node-wifi-mqtt-homie begonnen, die noch keine hiveeyes Anbindung hatte. Jetzt macht das ganze auch endlich Sinn in meinem Kopf. jsonNode wurde nachgerüstet!

Der Datenpunkt ist leider nur ein Teilerfolg gewesen gestern.
Habe mit MQTT Lens getestet was so auf hiveeyes ankommt und den Debug Json String aus dem Serial Monitor manuell mit MQTT Lens gepublished.

Das hat einwandfrei funktioniert.
Meine erste Vermutung: MQTT Packetsize Limit hab ich versucht zu testen indem ich nur 2 Temp Werte übertragen wollte, hat aber ebenfalls versagt. Bin erstmal wieder mit meinem Latein am Ende.

Aus irgendwelchem Grund wird der MQTT client ständig disconnected.

-> habt den Post noch nicht fertig geschrieben aber endlich einen Fix gefunden, auch wenn ich ihn nicht verstehe.

Working theory:
Die vielen Pubs (die vom Broker gebounct werden???) killen den Client
:
-> Alle Nodes und publishes entfernt und die Übertragung an Hiveeyes klappt endlich!

Hi Patrick,

wir sehen schon: Grafana
Exzellent!

Es sind noch ein paar falsche “retained” Nachrichten im Broker, wie z.B.:

hiveeyes/pw/BZVMUC/hive01/data/__json__HM01/temperature0/$type temperature
hiveeyes/pw/BZVMUC/HM01/data/__json__HM01/temperature0/$type temperature
hiveeyes/pw/BZVMUC/HM01/HM01/temperature0/$type temperature
hiveeyes/pw/BZVMUC/HM01/temperature0/$type temperature
hiveeyes/pw/BZVMUCHM01/temperature0/$type temperature

Wir werden die gschwind löschen und hoffen, das ist in Ordnung.


Vielleicht kann Dir @Alex an dieser Stelle weiterhelfen, wenn es mit der Firmware zu tun hat. Eigentlich sollte von unserer Seite her an der Infrastruktur alles in Ordnung sein. Sag aber gerne Bescheid, wenn Du hier Probleme vermutest, dann gehen wir dem selbstverständlich nach!

Herzliche Grüße,
Andreas.

…kann es nicht sein, da homie-esp8266 kein TLS unterstützt.

Ist das noch aktuell:

Ich kann dem Thread gerade nicht ganz folgen

Da sind immer noch zig falsche retained drin (siehe Auszug von @Andreas oben). Ich säubere das mal, damit ich da durchblicke was gerade kommt und ggf. falsch ist. Für die Messungen ist das übrigens egal, die werden nicht beeinträchtigt.

@beeneugierig: Kannst Du die node mal neu starten?

@Alex hat die falschen “retained” messages gerade gelöscht. Vielen Dank!

@beeneugierig: Ich hoffe nun klappt alles bei Dir? Sag Bescheid, wenn wir Dir noch irgendwo unter die Arme greifen können.

Viel Spaß weiterhin bei der Datenerfassung!

Herzliche Grüße,
Andreas.

A post was merged into an existing topic: Inbetriebnahme von node-wifi-mqtt-homie mit Hiveeyes Anbindung

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.