There is no reason not to publish your sketch here directly. Many people will not look at a link.
I think you need to verify that you are connected to MQTT (not just to wifi) before attempting to publish.
Also you are not using the String class correctly, though on an ESP that can hardly be an issue.
You check for a 'WiFi' connection. That is not the same as checking if MQTT is also connected. Of course no Wifi no MQTT, but You can have WiFi but no MQTT.
Well, it is a bit of a long story, and if you google a bit you can find stuff about it all over the forum. The issue is that 'String' objects are declared on the heap, and particularly increasing, decreasing String can cause memory fragmentation. In your case, there is only 1 function that uses the String class, unfortunately you did declare 1 String variable globally. I am going to post your whole code here now, so it is easier to explain.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#include <SPI.h>
const char* ssid = "*";
const char* password = "*";
const char* mqttServer = "*";
const int mqttPort = 1883;
const char* mqttUser = "*";
const char* mqttPassword = "*";
SoftwareSerial Victron(D7,D8); // RX, TX
WiFiClient espClient;
PubSubClient client(espClient);
char p_buffer[80];
#define P(str) (strcpy_P(p_buffer, PSTR(str)), p_buffer)
char c;
String V_buffer; // Buffer to hold data from the Victron monitor
char Current[6];
char Voltage[6];
char SOC[7];
char CE[7];
String stringOne;
void reconnect() {
Serial.print("Reconnecting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // As long as it is trying to connect print a . each 500ms to debugger
}
Serial.println("");
Serial.println("WiFi re-connected");
}
void readVictronData() {
if (Victron.available()) {
c = Victron.read();
if (V_buffer.length() < 40) {
V_buffer += c;
}
if (c == '\n') { // New line.
if (V_buffer.startsWith("I")) {
String temp_string = V_buffer.substring(V_buffer.indexOf("\t")+1);
temp_string.toCharArray(Current, temp_string.length() + 1);
client.publish("BMV/Current", Current);
Serial.print("Current: ");
Serial.println(temp_string);
}
if (V_buffer.startsWith("V")) {
String temp_string = V_buffer.substring(V_buffer.indexOf("\t")+1);
temp_string.toCharArray(Voltage, temp_string.length() + 1);
client.publish("BMV/Voltage", Voltage);
}
if (V_buffer.startsWith("SOC")) {
String temp_string = V_buffer.substring(V_buffer.indexOf("\t")+1);
temp_string.toCharArray(SOC, temp_string.length() + 1);
client.publish("BMV/SOC", SOC);
}
if (V_buffer.startsWith("CE")) {
String temp_string = V_buffer.substring(V_buffer.indexOf("\t")+1);
temp_string.toCharArray(CE, temp_string.length() + 1);
client.publish("BMV/CE", CE);
}
//Serial.println(V_buffer);
V_buffer=""; // Empty V_Buffer
}
}
}
void connect_mqtt() {
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
Serial.println("connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
client.publish("BMV/Welcome", "Welcome from Victron");
}
}
void setup() {
Serial.begin(115200);
Victron.begin(19200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
connect_mqtt();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) { // If wifi is not connected run reconnect() function
reconnect();
}
connect_mqtt();
readVictronData(); // Read Victron Data
}
If you move
String V_buffer; // Buffer to hold data from the Victron monitor
into readVictronData(), at least the whole heap is actually cleared (with exception of whatever the libraries are using but you can trust they clean up after themselves) at the end of the function when all the objects are destroyed, that should prevent fragmentation.