2 Topic mit Arduino und MQTT

Hallo!
Da meine Haussteuerung in die Jahre gekommen ist - Sie läuft noch mit der guten alten “C-Control” :roll_eyes: bin ich gerade am Modernisieren :slight_smile:

Mein problem an dem ich schon ein weilchen kaue:
Ich habe 2 Topics “led” und "led2"
Die Led mit dem Topic “led” und dem payload “1on” bzw “1off” funktioniert
Die zweite Led in dem ich versuche mittels dem Topic zu steuern will nicht ?!

Ich erwähne es mal obwohl wahrscheinlich klar erkennbar. Sind meine ersten Berührungen mit Arudino und MQTT . . . .

Hier mal der Code

#include <SPI.h>          // Serial Peripheral Interface
#include <Ethernet.h>     // Ethernet Bibliothek
#include <PubSubClient.h> // MQTT Bibliothek

// Parameter für Ihr Netzwerk ein:
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 17);
IPAddress server(10, 0, 0, 98);

// Set LED variables to Aruino digital pins
const int led1 = 6;
const int led2 = 3;

// Handle and convert incoming MQTT messages ----------------------------------------
 void callback(char* topic, byte* payload, unsigned int length) {
  // handle message arrived
  String content="";
  char character;
  for (int num=0;num<length;num++) {
      character = payload[num];
      content.concat(character);
  }
 
  Serial.println(topic);
  Serial.println(content); // message sent out by button actions is returned from broker and serial printed

// This Work
  if (content == "1on") {
    Serial.println(topic);
    digitalWrite(led1, HIGH);
  }
  
  if (content == "1off") {
    digitalWrite(led1, LOW);
  }

// This Not
  if (topic == "led2") {
      Serial.print("Changing GPIO 3 to ");
      if (content == "2on"){
        digitalWrite(led2, HIGH);
        Serial.println("2_On");
     }
         else if(content == "0"){
        digitalWrite(led2, LOW);
        Serial.print("Off");
     }
  }
}

 
EthernetClient ethClient;
PubSubClient client(ethClient);

void reconnect() {
  // Solange wiederholen bis Verbindung wiederhergestellt ist
  while (!client.connected()) {
    Serial.print("MQTT Verbindungsaufbau...");

    //Verbindungsversuch:
    if (client.connect("arduinoClient")) {
      Serial.println("Erfolgreich verbunden!");
      // Nun versendet der Arduino eine Nachricht in outTopic ...
      client.publish("out","TimiArduino Online");

      // und meldet sich bei inTopic für eingehende Nachrichten an:
      client.subscribe("led");
      client.subscribe("led2");
    } else { // Im Fehlerfall => Fehlermeldung und neuer Versuch
      Serial.print("Fehler, rc= ");
      Serial.print(client.state());
      Serial.println(" Neuer Versuch in 5 Sekunden");
      // 5 Sekunden Pause vor dem nächsten Versuch
      delay(5000);
    }
  }
}

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.begin(57600);
  // Broker erreichbar über ip-Adresse = server, port = 1883
  client.setServer(server, 1883); // Adresse des MQTT-Brokers
  client.setCallback(callback);   // Handler für eingehende Nachrichten
  // Ethernet-Verbindung aufbauen
  Ethernet.begin(mac, ip);
  // Kleine Pause
  delay(1500);
}

void loop()
{  
  // Solange probieren bis es klappt:
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Vielen Dank - Timi

Sind das nur erste Versuche, oder soll das schon das Arbeitsmuster werden? Ist nicht gerade übersichtlich, einmal nach dem Topic und einmal nach dem Inhalt zu unterscheiden.
Dein Problem:
In der Callback betrachtest Du content für led1. Der Inhalt von content wird vorher zeichenweise aus dem char-Array von payload übernommen, dass solch ein einfacher Vergleich mit Strings möglich ist.
topic ist genauso wie payload ein char-Array, auch hier kann man deshalb nicht einfach mittels Operator (==) vergleichen.
Also: entweder den Inhalt von topic ebenfalls in einen String verfrachten, und diesen für den Vergleich nutzen, oder aber (was empfehlenswerter ist, da Strings viel Speicher fressen): strcmp() nutzen.... also entscheide Dich für eine der beiden Varianten und wende dies für beide LED an :wink:

Hallo und DANKE erstmal für die rasche Antwort!

Habe versucht es entsprechend ab zu ändern. Bin nun auch einen schritt weiter ::slight_smile:
Die IF schleife mit dem Topic funktioniert jetzt - Serial Print "Topic ON" erscheint.
Jedoch leider funktioniert das mit der zweiten IF nicht?

Noch ein Tipp wär Toll.

Hier meine Änderung:

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

  Serial.println(topic);

// This Not
  if (strcmp(topic, "led2") == 0) {
      Serial.print("Topic ON ");
      if (strcmp(payload, "2on") == 0){
      Serial.print("Payload ON ");
        digitalWrite(led2, HIGH);
        Serial.println("2_On");
     }
         else if(payload == "0"){
      Serial.print("Payload OFF ");
        digitalWrite(led2, LOW);
        Serial.print("Off");
     }
  }
}

Danke Timi

UPS - Payload = byte . . . . . .

Funktioniert mal soweit, werde versuchen zu verstehen was genau ich da gemacht habe . . .

Danke erst mal für die Unterstützung - Fragen folgen sicherlich noch :confused:

Timi

Hallo und DANKE erstmal für die rasche Antwort!

Kein Ding, immer doch^^

öhm ja...byte Array, wie Du schon bemerkt hast. Kannst da z.B. das byte-Array in ein char-Array casten (Beispiele hierfür in den Beispiel-Sketchen der PubSubClient-Lib)
Du kannst Dir aber auch die PubSubClient-Lib von Imroy anschauen, dort funktioniert das etwas komfortabler, allerdings auch eher mit Strings.

Danke erst mal für die Unterstützung - Fragen folgen sicherlich noch :confused:

-->Jo....wenn was ist, nur her damit :wink:

–>Jo…wenn was ist, nur her damit :wink:

Nach einiger tüftelei würde ich wieder einen Tipp benötigen.

→ Woran ich gerade scheitere:
Versuche den Wert für “led2Value” welchen ich aus dem pwmTable nehme über

        client.publish("led2", (led2Value)); // <-------- WRONG !!

zu senden - Nicht Seriell, das klappt.

Aktuelle Ausgabe: led2 Value

Hier mal mein Code - Mein Problem ist ziemlich am Schluss wo ich den 2. Taster abfrage.

#include <SPI.h>          // Serial Peripheral Interface
#include <Ethernet.h>     // Ethernet Bibliothek
#include <PubSubClient.h> // MQTT Bibliothek
#include <Bounce2.h>      // Tasten Entprellen

// Network parameters
byte mac[] = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 17);
IPAddress server(10, 0, 0, 98);

// Flag for button2
int flag = 0;

// PWM Index table
const byte pwmTable[9]={0, 2, 4, 8, 16, 32, 64, 128, 255}; // 9 brightness steps

// Set LED variables to digital/analog pins
int led1 = 6;
int led2 = 3;

// Set variable values & initially to LOW
int led1Value = LOW;
int led2Value = 0;

// Set button variables to digital/analog pins
int button1 = 7;
int button2 = 8;

// Initiate a bouncer instance for each button
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();

// Initiate network instances
EthernetClient ethClient;
PubSubClient client(ethClient);

// Setup
void setup()
{
  // setup led, button, bouncer 1
  pinMode(led1, OUTPUT);
  pinMode(button1,INPUT);
  digitalWrite(button1,HIGH);
  bouncer1 .attach(button1);
  bouncer1 .interval(5);

  // setup led, button, bouncer 2
  pinMode(led2, OUTPUT);
  pinMode(button2,INPUT);
  digitalWrite(button2,HIGH);
  bouncer2 .attach(button2);
  bouncer2 .interval(5);

  // Setup serial connection
  Serial.begin(57600);
  
  // Ip-Adresse = server, port = 1883
  client.setServer(server, 1883); // Adresse des MQTT-Brokers
  client.setCallback(callback);   // Handler für eingehende Nachrichten
  // Ethernet-Verbindung aufbauen
  Ethernet.begin(mac, ip);
  // Kleine Pause
  delay(1500);
}

// Handle incoming MQTT messages
 void callback(char* topic, byte* payload, unsigned int length) {
// Serial.println(topic);

// ******************
  if ((strcmp(topic, "led") == 0) && (payload[0] == '1')) {
        led1Value = HIGH;
        Serial.println("1_On");
     }
  if ((strcmp(topic, "led") == 0) && (payload[0] == '0')) {
        led1Value = LOW;
        Serial.println("1_Off");
     }
  if ((strcmp(topic, "led2") == 0) && (payload[0] == '1')) {
   if (led2Value<sizeof(pwmTable)-1) {
    led2Value++;
    Serial.println("2_Heller");    
   }
}
  if ((strcmp(topic, "led2") == 0) && (payload[0] == '0')) {
   if (led2Value>0) {
    led2Value--;
    Serial.println("2_Off");
   }
}

  // Set digital pin states according to virtual switch settings
  digitalWrite(led1,led1Value);
  analogWrite(led2,pwmTable[led2Value]);
}

void reconnect() {
  // Repeat until connection is made
  while (!client.connected()) {
    Serial.print("MQTT Verbindungsaufbau...");
    // Connection attempt
    if (client.connect("arduinoClient")) {
      Serial.println("Erfolgreich verbunden!");
      // Messasge to outTopic
      client.publish("out","TimiArduino Online");
      // Subscride inTopic
      client.subscribe("led");  // subscribe to topic "led"
      client.subscribe("led2"); // subscribe to topic "led2"
    } else { // Error case => Message and new attempt
      Serial.print("Fehler, rc= ");
      Serial.print(client.state());
      Serial.println(" Neuer Versuch in 5 Sekunden");
      // 5 seconds pause
      delay(5000);
    }
  }
}

void loop()
{ 
// Listen for button interactions and take actions
// Button actions do send MQTT message AND do set led(x)Value to HIGH or LOW
  if (bouncer1.update()) {
    if (bouncer1.read() == HIGH) {
      if (led1Value == LOW) {
        led1Value = HIGH;
        client.publish("led","1");                
      } else {
        led1Value = LOW;
        client.publish("led","0");
      }
    }
  }  

  if (bouncer2.update()) {
    if (bouncer2.read() == HIGH) {
      if ((led2Value<sizeof(pwmTable)-1) && (flag == 0)) {
        led2Value++;
        int led2Value = led2Value;
        client.publish("led2", (led2Value)); // <-------- WRONG !!
        if (led2Value==sizeof(pwmTable)-1) {
         flag = 1;
        }
      } else {
        if ((led2Value>0) && (flag = 1)) {
         led2Value--;
         if (led2Value == 0) {
          flag = 0;
          }
        client.publish("led2","Dunkler");
      }
    }
  } 
 }

//-----------------------------------------------
  // Try until successful
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Also - Bin nicht mehr der Jüngste, hab auch wenig Foren Erfahrung - Deshalb
Sollten noch Infos benötigt werden bitte mir mitteilen.
Um hier keine Roman zu schreiben habe ich mich bis jetzt auch kurz gehalten, wenn genauere Erläuterung gewünscht sind was ich versuche umzusetzen auch bitte einfach mir mitteilen.


Danke Timi_Who

Also - Bin nicht mehr der Jüngste, hab auch wenig Foren Erfahrung

Im Gegensatz zu den meisten Anfängern hier kannst Du wenigstens a) Code in Code-Tags einbinden und ohne Aufforderung posten sowie b) schon den Fehler selbst lokalisieren ;D

client.publish("led2", (led2Value));

-->die Funktion publish() erwartet 2 char-Arrays, "led2" ist ein solches. led2Value ist aber vom Datentyp int. Dies umgehst Du, indem Du led2Value einklammerst, womit das char-Array aber "led2Value" ist, welches wiedergegeben wird.

Du brauchst die Funktion itoa() hierfür:

char buffStr[5];                           //Buffer mit maximaler Zeichenanzahl: 5
itoa(led2Value,buffStr,10);
client.publish("led2", buffStr);

Kannst Du hier nachlesen

Hallo!

Soweit hab ich mal alle Funkionen, welche ich fürs erste gerne hätte, hinbekommen :cold_sweat:
Danke für die Unterstützung hier!

Um mir vielleicht unnötiges zu ersparen hätte ich da noch eine Frage:
Soweit ich das Verstehe bekomme ich vom MQTT Server als Payload ein char-Array
Um es für mein Programm weiter zu verwenden habe ich versucht das char-Array in Int zu wandeln, und zwar so.

// PWM Index table
// 9 brightness steps LED not linear
const byte pwmTable[9]={0, 2, 4, 8, 16, 32, 64, 128, 255}; 

// For funktion String2Int --> String to hold input
String payloadString = "";

  if (strcmp(topic, "led2") == 0) {
   int inPayload = payload[0];
    if (isDigit(inPayload)) {
     // convert the incoming byte to a char and add it to the string:
     payloadString += (char)inPayload;
     led2Value = payloadString.toInt();
     payloadString = "";
   }
 }

  analogWrite(led2,pwmTable[led2Value]);

Das funktioniert soweit, ich kann die char-Arrays von 0-8 hier als Int 0-8 verwenden.

Ist das grundsätzlich richtig oder gibt es hier etwas einfacheres?


Ab hier nur für jene die es Interessiert


Hier die Beschreibung was ich zu tun versuche und der Code.
Vielleicht gibt es ja auch den einen oder anderen Input was man noch wie umsetzen könnte

* Hard/Software

Um Basisfunktionen zu Steuern, wie eben das Zentral Licht aus und dgl. habe ich zur zeit leider nur die Möglichkeit mittels Digital (Relais 0/1) Signale an die Moeller zu senden

ALLE "Schalter" im Haus sind TASTER!

--> Aktueller Stand
Moeller Easy 800 NET als Basisansteuerung
mit 90 verwendeten Relaisausgängen und 150 verwendeten Digitaleingängen
1 Analogeingang (für die Hauswasseranlage)
2 Conrad C-Control für Treppenbeleuchtung

Die Steuerung läuft grundsätzlich autonom, diese hatte ich bisher über einen kleinen Windows Laptop
mittels ProfiLab und OPC Visualisiert.
Da der Windows 10 Laptop in die Jahre gekommen ist und der Stromverbrauch auch nicht zu verachten war über die Jahre habe ich mich entschlossen zu "Modernisieren" und den Laptop verschrottet.

--> Neu hinzugekommen
Raspberry PI 3 mit Mosquitto MQTT Server und Node Red als Server für Visualisation im Heimnetzwerk
Relaiskarte an den GPIO's des Raspberry zu den Eingängen der Möller für diverse Steuer signale an die Moeller, z.B. Rollo Auf/Zu, Zentral Licht aus usw.
Ein Arduino Nano mittels Arduino Firmware mit dem Raspberry gekoppelt um den Wasserdruck und Lichtsensor Analog zu erfassen und mittels Node Red zu Visualisieren.
Ein ESP8266-01 --> für die Hühner Klappe und Hühner Tränken Heizung :wink:

--> Aktuelles Projekt
Arduino Uno + Ethernet Shield und Pub/Sub Client
Licht bzw. LED Steuerung im Mädchen Raum (ich nenne den mal so, es ist der Rückzugs raum für meine Tochter und meine Frau :grin: ) )

Das Haupt Licht im Raum will ich wie gewohnt Ein und Ausschalten können, zusätzlich auch mittels Relais am Arduino, dazu im Code die "LED1" + "Button1"
Neu werde ich 2 Spots montieren welche ich nur mittels Arduino bzw. der Visualisierung schalten will
"LEDx" + "Buttonx" - Fehlt im Code noch, aber wenn's mit einer klappt . . .
Auch Neu will ich LED Streifen für Indirekt Beleuchtung montieren welche ich mit dem Arduino über die PWM Ausgänge Steuern kann "LED2" + "Button2"
Der Button verhällt sich im Code so das Pro Tastendruck um einen Array wert erhöht und wenn am Max angekommen um einen Array wert verringert wird - momentan 8 Stufen Helligkeit und 0.

Um Flexibel zu bleiben habe ich es so gelöst das die Button immer zum MQTT Server senden dieser wieder retour und dann der Arduino die jeweile Aufgabe löst.
So kann ich über den Arduino selbst und auch über die Visu unabhängig Steuern.

Auf den Brethboard’s funktioniert es, was ich an I/O’ benötige ist jetzt klar, somit werde ich mich an die Hardware machen. Platinen fertigen, Löten . . .
Auf jeden Fall viel zeit in der Werkstatt verbringen :cold_sweat: :cold_sweat:

Hier der Vorläufige Code - Wird sicherlich noch verfeinert in nächster zeit.

/*
 * 101117 _ Start - Timi_Who
 */

#include <SPI.h>          // Serial Peripheral Interface
#include <Ethernet.h>     // Ethernet Bibliothek
#include <PubSubClient.h> // MQTT Bibliothek
#include <Bounce2.h>      // Tasten Entprellen

// Network parameters
byte mac[] = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 17);
IPAddress server(10, 0, 0, 98);

// Flag for button2
int buttonFlag = 0;

// Buffer with a maximum of 2 characters
char buffStr[2];

// For funktion String2Int --> String to hold input
String payloadString = "";

// PWM Index table
// 9 brightness steps LED not linear
const byte pwmTable[9]={0, 2, 4, 8, 16, 32, 64, 128, 255}; 

// Set LED variables to digital/analog pins
int led1 = 6;
int led2 = 3;

// Set variable values & initially to LOW
int led1Value = LOW;
int led2Value = 0;

// Set button variables to digital/analog pins
int button1 = 7;
int button2 = 8;

// Initiate a bouncer instance for each button
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();

// Initiate network instances
EthernetClient ethClient;
PubSubClient client(ethClient);

//-----------------------------------------------
// Setup
void setup()
{
  // setup led, button, bouncer 1
  pinMode(led1, OUTPUT);
  pinMode(button1,INPUT);
  digitalWrite(button1,HIGH);
  bouncer1 .attach(button1);
  bouncer1 .interval(5);

  // setup led, button, bouncer 2
  pinMode(led2, OUTPUT);
  pinMode(button2,INPUT);
  digitalWrite(button2,HIGH);
  bouncer2 .attach(button2);
  bouncer2 .interval(5);

  // Setup serial connection
  Serial.begin(57600);
  
  // Ip-Adresse = server, port = 1883
  client.setServer(server, 1883); // Adresse des MQTT-Brokers
  client.setCallback(callback);   // Handler für eingehende Nachrichten
  // Ethernet-Verbindung aufbauen
  Ethernet.begin(mac, ip);
  // Kleine Pause
  delay(1500);
}

//-----------------------------------------------
// Handle incoming MQTT messages
 void callback(char* topic, byte* payload, unsigned int length) {

  if ((strcmp(topic, "led") == 0) && (payload[0] == '1')) {
        led1Value = HIGH;
     }
  if ((strcmp(topic, "led") == 0) && (payload[0] == '0')) {
        led1Value = LOW;
     }
  if (strcmp(topic, "led2") == 0) {
   int inPayload = payload[0];
    if (isDigit(inPayload)) {
     // convert the incoming byte to a char and add it to the string:
     payloadString += (char)inPayload;
     led2Value = payloadString.toInt();
     payloadString = "";
   }
 
 }
// Set digital pin states according to virtual switch settings
  digitalWrite(led1,led1Value);
  analogWrite(led2,pwmTable[led2Value]);
  Serial.println(led2Value);
}

//-----------------------------------------------
void reconnect() {
  // Repeat until connection is made
  while (!client.connected()) {
    Serial.print("MQTT Verbindungsaufbau...");
    // Connection attempt
    if (client.connect("arduinoClient")) {
      Serial.println("Erfolgreich verbunden!");
      // Messasge to outTopic
      client.publish("out","TimiArduino Online");
      // Subscride inTopic
      client.subscribe("led");  // subscribe to topic "led"
      client.subscribe("led2"); // subscribe to topic "led2"
    } else { // Error case => Message and new attempt
      Serial.print("Fehler, rc= ");
      Serial.print(client.state());
      Serial.println(" Neuer Versuch in 5 Sekunden");
      // 5 seconds pause
      delay(5000);
    }
  }
}

//-----------------------------------------------
void loop()
{ 
// Listen for button interactions and take actions
// Button actions do send MQTT message AND do set led(x)Value to HIGH or LOW
  if (bouncer1.update()) {
    if (bouncer1.read() == HIGH) {
      if (led1Value == LOW) {
        led1Value = HIGH;
        client.publish("led","1");                
      } else {
        led1Value = LOW;
        client.publish("led","0");
      }
    }
  }  

  if (bouncer2.update()) {
    if (bouncer2.read() == HIGH) {
      if ((led2Value<sizeof(pwmTable)-1) && (buttonFlag == 0)) {
        led2Value++;
        itoa(led2Value, buffStr, 10);
        client.publish("led2", buffStr);
        if (led2Value==sizeof(pwmTable)-1) {
         buttonFlag = 1;
        }
      } else {
        if ((led2Value > 0) && (buttonFlag = 1)) {
        led2Value--;
         if (led2Value == 0) {
         buttonFlag = 0;
         }  
          itoa(led2Value, buffStr, 10);
          client.publish("led2", buffStr);
       }
     }
   }
 }

//-----------------------------------------------
  // Try until successful
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

Timi_Who

Wie ist die Nachricht eigentlich aufgebaut? Nur ein Wert oder noch eine Beschreibung dahinter? Sollen nur die Werte 0-9 übertragen werden können?

Jedenfalls gehst Du den Weg über einen String, nicht sehr günstig.
atoi() wäre eher angebracht (hier nachzulesen)
So sollte es gehen:

if (strcmp(topic, "led2") == 0) {
   led2Value=atoi(payload[0]);
 }

Hallo,
ja so ähnlich hatte ich es gestern Abend auch versucht, konnte leider zu keinem Ergebnis kommen.
Habe es heute nochmal versucht und ohne wirklich zu verstehen klappt es so?

  if (strcmp(topic, "led2") == 0) {
   led2Value=atoi(payload); <--- Anstelle payload[x]
 }

Allerdings auch nur solange led2Value <=9 ist :confused:

Zum Aufbau der Nachricht kann ich nur sagen das für meine Zwecke verschiedene “Topic” und als “payload” 0-255 fürs erste ausreichen werden. Mehr benötige ich zur zeit nicht - das beginne ich auch erst wenn ich das coding besser verstehe.

Übrigens danke nochmal für den hinweis, die Funktion ist wesentlich kürzer geworden.

Vielleicht kann mir hier jemand in für Anfänger verständlicher Sprache einen hinweis geben wo hier grundsätzlich der Fehler liegt das ich nicht über die zahl 9 komme.

Hier im pwmTable Array lege ich die Werte für die Helligkeit fest:

const byte pwmTable[9]={0, 2, 4, 12, 32, 64, 128, 132, 255};

So wie ich es aus dieser zeile verstehe wird “payload” als byte gelesen,
und byte bedeutet doch 0-255?

 void callback(char* topic, byte* payload, unsigned int length)

Ich konnte einfach nichts finden wo “unsigned int length” beschrieben ist?

 void callback(char* topic, byte* payload,[b] unsigned int length[/b]) {

Hier wird das char-Array payload mittels atoi in eine Zahl gewandelt, erstehe ich doch richtig? Es müssten doch Zahlen von 0-255 möglich sein?

  if (strcmp(topic, "led2") == 0) {
   led2Value=atoi(payload);
 }

TimiWho

Habe es heute nochmal versucht und ohne wirklich zu verstehen klappt es so?

-->Ähm ja, Du übergibst an dieser Stelle direkt das ganze Array, sollte so klappen.

Zum Aufbau der Nachricht kann ich nur sagen das für meine Zwecke verschiedene "Topic" und als "payload" 0-255 fürs erste ausreichen werden. Mehr benötige ich zur zeit nicht

-->Achso, kannst ja auch eine Beschreibung in die Nachricht einpacken, nur muss man diese halt zur Aufnahme des Wertes dann auseinanderklamüsern.

So wie ich es aus dieser zeile verstehe wird "payload" als byte gelesen,
und byte bedeutet doch 0-255?

-->ja... nur kriegst Du ein Zeichen. '0' ist nicht 0, sondern im ASCII-Zeichensatz 0x30 bzw. 48.

Ich konnte einfach nichts finden wo "unsigned int length" beschrieben ist?

Meinst Du, wo es benutzt wird und was es hier heißt? length ist die Länge des Arrays für payload.
Oder meinst was unsigned int bedeutet?
int kennst Du ja, ein Datentyp mit 16 Bit. Normalerweise wird damit ein Bereich von -32.768 bis 32.767 abgedeckt. Unsigned bedeutet vorzeichenlos, der Bereich ist hierbei 0-65.536

Hier wird das char-Array payload mittels atoi in eine Zahl gewandelt, erstehe ich doch richtig? Es müssten doch Zahlen von 0-255 möglich sein?

-->Jo....eigentlich sollte das soweit passen. Habs es mal getestet, bei mir haut es damit hin.