MQTT-Client und Internet-Client in einem Sketch?

Hallo,
ich stehe gerade vor einer Wand...
Meine Problemstellung ist: Ich möchte gerne Daten von einem MQTT-Broker lesen, und dann per HTTP an ein php-Script im Internet senden.
Beides getrennt für sich genommen funktioniert, jetzt habe ich versucht, beides in einem Sketch zu vereinen, bekomme jetzt aber beim kompilieren nur Fehlermeldungen bei client.connect().

der MQTT-teil funktioniert mit

  client.setServer (server, 1883 );
  client.setCallback(callback);
  client.connect("arduinoClient");

und der Internet-Teil mit

  client.connect(send_server, 80)

der MQTT-Teil sollte dauerhaft verbunden sein, um den Topics zu lauschen, und nur kurz vom Internet-Teil unterbrochen werden.
Ich habe auch schon mit verschiedenen Variationen rumprobiert, ich schätze, client.setServer verträgt sich nicht mit client.connect(server,80), aber das aufzulösen ist mir nicht gelungen.

Ich wäre für jeden Tipp sehr dankbar!!

Der vollständigkeit halber hänge ich noch den gesamten code an - nicht wundern, er ist noch im entwurfsstadium :wink: die sensiblen stellen habe ich mit *** unkenntlich gemacht...

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <INA219.h>

int panel_voltage = 18;
int watt_multi = 1400;

// Networking details
byte mac[] = { *** }; // Ethernet shield (W5100) MAC address
IPAddress ip(192, 168, 0, 12); // Ethernet shield (W5100) IP address
IPAddress server(192, 168, 0, 26); // MTTQ server IP address
IPAddress dnServer(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 0, 1);
byte send_server[] = {***};
char host[] = "***";
char url[] = "/***.php";
char key[] = "***";

EthernetClient ethClient;
PubSubClient client(ethClient);
INA219 monitor;

// Globale Variablen
float panel_watt = 0;
float possible_watt = 0;
int mqtt_soc=0;
float mqtt_pv_v=0;
int mqtt_pv_w=0;
int mqtt_ac_out=0;
int mqtt_ac_grid_l1=0;
int mqtt_ac_grid_l2=0;
int mqtt_ac_grid_l3=0;
int mqtt_ac_grid_ges=0;


unsigned long display_last = 0;
int display_intervall = 30000;
unsigned long wakeup_last = 0;
int wakeup_intervall = 10000;

//------------------ SETUP----------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  Serial.println("MQTT-Test");
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  client.setServer (server, 1883 );
  client.setCallback(callback);
  Serial.print("Ethernet Local IP = "); Serial.println(Ethernet.localIP()); Serial.println(); //
  monitor.begin();
}

//------------------ LOOP----------------------------------------------------------------------
void loop() {
  if (!client.connected()) {
    client.connect("arduinoClient");
    // Abonieren von Nachrichten mit dem angegebenen Topic
    client.subscribe("N/**/battery/512/Soc"); // State of Charge %
    client.subscribe("N/***/solarcharger/258/Pv/V"); // PV Voltage V
    client.subscribe("N/**/solarcharger/258/Yield/Power"); // PV Voltage W
    client.subscribe("N/***/vebus/257/Ac/Out/P"); // AC Out W
    client.subscribe("N/***/system/0/Ac/Grid/L1/Power"); // AC Grid W
    client.subscribe("N/***/system/0/Ac/Grid/L2/Power"); // AC Grid W
    client.subscribe("N/***/system/0/Ac/Grid/L3/Power"); // AC Grid W
    client.subscribe("N/***/system/0/Ac/Consumption/L1/Power"); // AC Consumption W
    client.subscribe("N/***/system/0/Ac/Consumption/L2/Power"); // AC Consumption W
    client.subscribe("N/***/system/0/Ac/Consumption/L3/Power"); // AC Consumption W
    
  }
  client.loop();

if(millis() - display_last > display_intervall)
  {
  send_data();
//  display_states();
  display_last = millis();
  }

if(millis() - wakeup_last > wakeup_intervall)
  {
  client.publish("R/***/system/0/Serial","");
  wakeup_last = millis();
  }
}

void display_states()
  {
  mqtt_ac_grid_ges = mqtt_ac_grid_l1 + mqtt_ac_grid_l2 + mqtt_ac_grid_l3;  
  Serial.println("Battery SOC: " + String(mqtt_soc) + "%");
  Serial.println("PV Power: " + String(mqtt_pv_w) + "W (@" + String(mqtt_pv_v,2) + "V)");
  Serial.println("AC Load: " + String(mqtt_ac_out) + "W");
  Serial.println("AC Grid: " + String(mqtt_ac_grid_ges) + "W");
  Serial.println("-");
  }

//------------------ CALLBACK------------------------------------------------------------------
void callback(char* topic, byte* payload, unsigned int length)
  {
  char message_buff[100]; 
  StaticJsonDocument<200> doc; 

  int i = 0;
  for (i = 0; i < length; i++) {
    message_buff[i] = payload[i];
  }

  deserializeJson(doc,message_buff);
  float json_value = doc["value"]; 
// Serial.println(json_value);
 
  // Konvertierung eines Topic in eine Zahl
  if (strstr(topic, "battery/512/Soc")) {
    mqtt_soc = json_value;  }
  if (strstr(topic, "solarcharger/258/Pv/V")) {
    mqtt_pv_v = json_value;    }
  if (strstr(topic, "solarcharger/258/Yield/Power") && length > 0) {
    mqtt_pv_w = json_value;  }
  if (strstr(topic, "vebus/257/Ac/Out/P")) {
    mqtt_ac_out = json_value;  }
  if (strstr(topic, "system/0/Ac/Grid/L1/Power") && length > 0) {
    mqtt_ac_grid_l1 = json_value;  }
  if (strstr(topic, "system/0/Ac/Grid/L2/Power") && length > 0) {
    mqtt_ac_grid_l2 = json_value;  }
  if (strstr(topic, "system/0/Ac/Grid/L3/Power") && length > 0) {
    mqtt_ac_grid_l3 = json_value;  }
}


void send_data()                                                                // Sämtliche Daten an den Server schicken
  {
  panel_watt = panel_voltage * monitor.shuntCurrent();
  possible_watt = panel_watt * watt_multi;
    
  Serial.print("Verbinden ...");
  client.stop();
  client.flush();
  if (client.connect(send_server, 80))
    {
    Serial.print(" Verbunden - sende Daten ...");
    client.print("GET ");
    client.print(url);
    client.print("?passwort=");
    client.print(key);
    client.print("&soc=");
    client.print(mqtt_soc);
    client.print("&pv_w=");
    client.print(mqtt_pv_w);
    client.print("&pv_v=");
    client.print(mqtt_pv_v);
    client.print("&pv_peak=");
    client.print(possible_watt);
    client.print("&ac_load=");
    client.print(mqtt_ac_out);
    client.print("&ac_grid=");
    client.print(mqtt_ac_grid_ges);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println();
    client.stop();
    Serial.println(" fertig!");
    }
  else
    {
    Serial.println(" Fehlgeschlagen!");
    }
  client.flush();
  }

Nimm 2 verschiedene clients und solange Du die Fehlermeldung geheim hältst, wird man Dir kaum helfen können.

Gruß Tommy

Das hat mir geholfen, es kann so einfach sein! Manchmal sieht man den Wald vor lauter Bäumen nicht... ich musste nur noch einen EthernetClient client2; definieren und dann alles fürs Internet von client nach client2 ändern - Problem gelöst!
Vielen Dank!

Schön, dass es geholfen hat und Danke für die Rückmeldung.

Gruß Tommy

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