Arduino und mqtt

Hallo Leute, ich bin am verzweifeln. Ich versuche ein 16-fach Relaisboard mit einem Arduino Mega mit Ethernet Shield über mqtt zu steuern. Sprich Befehl von ioBroker an den Mega schicken und schalten. Temperaturwerte übermittelt der Mega ohne Probleme an den Broker. Nur mit der Steuerung will es nicht klappen. Hab schon viel gelesen und versucht. Den Code habe ich unter anderem hier im Forum gefunden. Nur will der ums verrecken nicht klappen und ich weiß nicht woran es liegt. >:(
Kann mich bitte jemand aufklären wie ich das lösen kann???
Danke im voraus
Andre

void callback(char* topic, byte* payload, unsigned int length) {
  // In order to republish this payload, a copy must be made
  // as the orignal payload buffer will be overwritten whilst
  // constructing the PUBLISH packet.

  // Allocate the correct amount of memory for the payload copy
  byte* p = (byte*)malloc(length);

  if ((strcmp(topic, "Relaiskarte/Relais_1") == 0) && (payload[0] == '1'))
  {digitalWrite(Relais_1, LOW);}
  if ((strcmp(topic, "Relaiskarte/Relais_1") == 0) && (payload[0] == '0'))
  {digitalWrite(Relais_1, HIGH);}

// Copy the payload to the new buffer
  memcpy(p,payload,length);

  MQTTclient.publish(topic, p, length);

  // Free the memory
  free(p);

Hallo,

ich bin mir da jetzt nicht sicher ........ aber sollte das nicht memcopy(p,payload,length); heissen ? Fehlt da nicht ein "O"

Gruss TFT

Leider nicht, habs gerade ausprobiert. Mit memcpy ist es auch in rot dargestellt.

AndreW1980:
....Kann mich bitte jemand aufklären wie ich das lösen kann???

Deine Fehlerangaben sind sehr dürftig.

Du solltest mal schreiben, welchen Fehler du hast und ob bei der Kompilierung eine Fehlermeldung kommt und welche.

Evtl. ist ja dein Problem durch die Info von temucin schon gelöst, aber bessere Angaben sind immer wichtig.

Also beim Kompilieren kommt keine Fehlermeldung. Der Mega ist quasi verbunden, kann ja auch meine Messwerte sehen. Aber in umgekehrter Reihenfolge passiert nichts. Habe einen wemos d1 mini mit ESPEasy am laufen, da kann ich mit dem ioBroker einen Befehl schicken und der wemos reagiert darauf. Nur der Mega reagiert nicht auf meine Befehle. Schreibfehler habe ich schon x-mal nachgesehen. Es muß quasi diese callback Funktion sein, die meine Befehle vom ioBroker nicht annimmt, warum auch immer.
Grüße Andre

So jetzt habe ich eine Verbindung. Habe client.subscribe("Relaiskarte"); in client.subscribe("Relaiskarte/#"); umbenannt. Jetzt habe ich das Problem daß er hin und her schaltet. Der zweite Kanal (Relais 2) bringt mir nun ständig eine Rückmeldung, d.h. er sendet ständig eine Bestätigung. Wie kann ich das so einstellen daß er nur eine Bestätigung sendet wenn sich der Wert ändert? :confused:
Grüße Andre

Hi

Pseudocode_AN
If (Zustand_Alt!=Zustand_Neu){
Zustand_Alt=Zustand_Neu;
sende_bestaetigung();
}
Pseudocode_AUS

Oder wie meinen?

MfG

Ja so in der Art, warum sendet der PubSubClient ständig? Wenn ich das so mache, bläht mir der Code ganz schön auf bei 16 Relais :wink:

Ohne Code lässt sich wenig sagen, aber der PubSubClient sendet nur zum Broker. Wenn Nachrichten ankommen, werden die über callback() behandelt. Kommen also stets Steuerbefehle, so liegt das am Broker. Lad Dir mal den MQTT-Spy, dann mit Deinem Netzwerk verbinden und den Datenverkehr mal überprüfen.

Ich habe mal eine Library geschrieben, um viele unabhängige lichter über MQTT zu steuern, ohne sich den Code aufzublähen. Müsstest Du sogar direkt benutzen können, nur halt zwischen aus und an hin- und herschalten, PWM werden die Relais nicht mögen

So Leute, tut mir leid daß es so lange gedauert hat mit antworten. Weihnachten :wink:
Also ich habe mal rum gesucht und hab bei ioBroker einen Haken gefunden bei "Sende auch Zustände (ack=true):" Diesen entfernt und auf einmal funktionierte die Sache. Lag also nicht am Code nur am Broker :slight_smile:
Danke nochmal an DerLehmi für den Denkanstoß und an alle anderen für die guten Ideen!