FHEM mit Arduino ansteuern

Begonnen von EnderPhilipp, 09 April 2017, 09:29:21

Vorheriges Thema - Nächstes Thema

EnderPhilipp

Zitat von: Rince am 11 April 2017, 12:42:42
Die Zeile heißt:
if (client.connect("Arduino_1", "zuHause/Arduino_1", 0, true, "offline")) {

Wird in der Einführung Teil 3 in epischer Breite beschrieben :)
Schau mal;
https://wiki.fhem.de/wiki/MQTT_Einf%C3%BChrung_Teil_3#Last_Will_.26_Testament

Das ist die exakte Antwort auf deine Frage :)

Und wenn du wissen willst, warum das so komisch aussieht:
http://pubsubclient.knolleary.net/api.html#connect2
Hier bist direkt an der Quelle  8)

Hätte ich mal genauer gelesen...

Habe das im Code geändert, der sieht jetzt so aus:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include "Adafruit_Si7021.h"

Adafruit_Si7021 sensor = Adafruit_Si7021();

int bewegung=23;
int bewegungsstatus=0;

byte mac[]    = {  0xDE, 0xCD, 0xBA, 0xFE, 0xEE, 0xED }; //eine MAC Adresse wählen, darf im eigenen Netz nur 1x vorkommen
IPAddress ip(192, 168, 0, 121); //eine gültige IP Adresse für das eigene Netz
IPAddress server(192, 168, 0, 38); //die Adresse wo der eigene MQTT Broker drauf läuft

void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
}

EthernetClient ethClient;
PubSubClient client(ethClient);

long lastReconnectAttempt = 0;

boolean reconnect() {
  if (client.connect("ZimmerSensor", "fhem/universalsensor/Arduino", 0, true, "offline")) {
    // Once connected, publish an announcement...
    client.publish("fhem/universalsensor/Arduino","online", true);
    // ... and resubscribe
    client.subscribe("inTopic");
  }
  return client.connected();
}
static char humidity[15]; //Speicherbereich reservieren um die Fechtigkeit zu speichern
static char temperature[15];
float h = 0.0;
float h_alt = 0.0;
float t = 0.0;
float t_alt = 0.0;
unsigned long previousMillisPIR = 0;
unsigned long previousMillis7021 = 0; //Zählervariable für den S , zählt Millisekunden seit dem letzten Funktionsaufruf nach oben
const long interval = 60000; //60000 Millisekunden aka 60 Sekunden, das Interval wie oft der Sensor überhaupt benutzt wird

void setup()
{
  client.setServer(server, 1883);
  client.setCallback(callback);

  Ethernet.begin(mac, ip);
  delay(1500);
  lastReconnectAttempt = 0;
 
  Serial.begin(9600);
  Serial.println("MQTT - Test!");
 
  sensor.begin();

  pinMode(bewegung, INPUT);
}

void loop()
{
  if (!client.connected()) {
    long now = millis();
    if (now - lastReconnectAttempt > 5000) {
      lastReconnectAttempt = now;
      // Attempt to reconnect
      if (reconnect()) {
        lastReconnectAttempt = 0;
      }
    }
  } else {
    // Client connected

    client.loop();
  }

unsigned long currentMillis = millis();
  //Si7021 Temperature & Humidity
  if (currentMillis - previousMillis7021 >= interval) {
    previousMillis7021 = currentMillis;
   
    h = sensor.readHumidity();    //Luftfeuchte auslesen
    t = sensor.readTemperature(); //Temperatur auslesen
  }
   
  // Prüfen ob eine gültige Zahl zurückgegeben wird. Wenn NaN (not a number) zurückgegeben wird, dann Fehler ausgeben.
  if (isnan(t) || isnan(h))
  {
    Serial.println("Si7021 konnte nicht ausgelesen werden");
    client.publish("fhem/universalsensor/Arduino","Sensorfehler",true); //true sendet die Nachricht retained, d.h. die Nachricht bleibt solange auf dem Broker, bis etwas neues kommt
  }
  else if (h == h_alt && t == t_alt)
  {
    //nix machen
  }
  else
  {
    client.publish("fhem/universalsensor/Arduino","online", true);
    dtostrf(h,6, 1, humidity);
    dtostrf(t,6, 1, temperature);
    client.publish("fhem/universalsensor/Humidity",humidity, true);
    client.publish("fhem/universalsensor/Temperature",temperature, true);
    h_alt = h; //den alten Messwert aufheben
    t_alt = t; //um nur bei Veränderung zu reagieren
    Serial.print("Luftfeuchte: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatur: ");
    Serial.print(t);
    Serial.println(" C");
   
  }

  // PIR
  if (currentMillis - previousMillisPIR >= 2000) {
  bewegungsstatus=digitalRead(bewegung);
  previousMillisPIR = currentMillis;
  Serial.print("Bewegung:");
  if (bewegungsstatus == HIGH)
  {
    client.publish("fhem/universalsensor/bewegung","on", true);
    Serial.println("on");
  }
  else
  {
    client.publish("fhem/universalsensor/bewegung","off", true);
    Serial.println("off");
  }
  } 
}


Leider kommt in FHEM nicht an und mit MQTT.fx empfange ich auch nichts.

Sieht wer den Fehler?  :-[

Mfg
Philipp
¡¡¡ANFÄNGERALARM!!!
Raspberry Pi 3 (Hauptsystem)
Raspberry Pi B+ (Kellersonde)
Homematic,Philips Hue, LD382, nanoCul 433/868mhz, MPD, Intertechno, FIRMATA, EspEasy, SSCAM, STV, HDMI-CEC, EchoDot

Rince

Was sagt denn die serielle Ausgabe?
Die sollte ja hinreichend gesprächig sein.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

EnderPhilipp

Zitat von: Rince am 11 April 2017, 21:23:44
Was sagt denn die serielle Ausgabe?
Die sollte ja hinreichend gesprächig sein.

Die serielle Ausgabe sagt nicht sehr viel...

Nach einem MQTT - Test! kommt nur noch ob eine Bewegeung erkannt wurde, oder nicht.

Meinem Arduino habe ich die IP 192.168.0.121 gegeben, welche sich auch anpingen lässt.

Und in MQTTfx steht, dass insgesamt 2 Clients mit dem Broker verbunden sind, aber eigentlich müssten es doch drei sein?
1. Computer mit MQTTfx
2. Arduino
3. FHEM

Was ist denn an meinem Code falsch?  :-[
¡¡¡ANFÄNGERALARM!!!
Raspberry Pi 3 (Hauptsystem)
Raspberry Pi B+ (Kellersonde)
Homematic,Philips Hue, LD382, nanoCul 433/868mhz, MPD, Intertechno, FIRMATA, EspEasy, SSCAM, STV, HDMI-CEC, EchoDot

Rince

Tu doch mal nur so einen MQTT Beispielsketch drauf (IP und Broker IP anpassen).
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

EnderPhilipp

Zitat von: Rince am 13 April 2017, 09:04:48
Tu doch mal nur so einen MQTT Beispielsketch drauf (IP und Broker IP anpassen).

Ich habe jetzt mal diesen Sketch auf den Arduino hochgeladen:
/*
Basic MQTT example

This sketch demonstrates the basic capabilities of the library.
It connects to an MQTT server then:
  - publishes "hello world" to the topic "outTopic"
  - subscribes to the topic "inTopic", printing out any messages
    it receives. NB - it assumes the received payloads are strings not binary

It will reconnect to the server if the connection is lost using a blocking
reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
achieve the same result without blocking the main loop.

*/

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(172, 16, 0, 100);
IPAddress server(172, 16, 0, 2);

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

EthernetClient ethClient;
PubSubClient client(ethClient);

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ArduinoMEGA")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic","hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup()
{
  Serial.begin(57600);

  client.setServer(server, 1883);
  client.setCallback(callback);

  Ethernet.begin(mac, ip);
  // Allow the hardware to sort itself out
  delay(1500);
}

void loop()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  client.publish("zuHause/ArduinoMEGA","online", true);
}


In MQTTfx steht und BrokerStatus auch, dass immer mehr Nachrichten eintreffen, aber wenn ich zuHause/ArduinoMEGA subscribe stehen dort keine Nachrichten.

Gibt es eine Möglichkeit, mit der ich alle Nachrichten sehen kann?

Mfg
Philipp
¡¡¡ANFÄNGERALARM!!!
Raspberry Pi 3 (Hauptsystem)
Raspberry Pi B+ (Kellersonde)
Homematic,Philips Hue, LD382, nanoCul 433/868mhz, MPD, Intertechno, FIRMATA, EspEasy, SSCAM, STV, HDMI-CEC, EchoDot

slor

Subscribe auf #. Dann siehst du alles. Guck mal auch in die Mqtt FAQ  ;)
Fhem auf Raspberry Pi 4
CCU3 mit RaspberryMatic mit HMCCU an FHEM
HMCCU, Telegram, Conbee2 und Hue/Tradfri/Osram Lampen AQARA Sensoren, HomeConnect