AXA remote 2.0 bedienen / klimaat regeling deel 2

Inmiddels heb ik de code een stuk robuuster gemaakt.
-Hostname wordt direct aangepast aan de topicname om deze beter te kunnen herkennen op je netwerk
-Code toegevoegd die elke 5 minuten de mqtt verbinding controleert en evt hersteld.
-Er waren nog wat schoonheidsfoutjes bij het doorgeven van de status die zijn nu opgelost.
-Er is nu de mogelijkheid om een MQTT inlognaam en wachtwoord op te geven.
-Aansturing linbus converter gaat nu via softwareserial waardoor je via usb makkelijk kunt meelezen wat er gebeurd en evt debuggen.
LET OP linbus converter nu aansluiten op D1 en D2 (ipv rx en tx)

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#include <Ticker.h>


// Definieer de gegevens voor toegang tot het Wi-Fi netwerk
const char* ssid = "your_SSID";
const char* password =  "your_Password";


// Definieer de MQTT-server waar de ESP8266 mee verbinding maakt
const char* mqtt_server = "192.168.1.13";  //IP adres server/broker/homey
const int mqtt_port = 1883; //Port server/broker
const char* TOPIC_NAME = "axaremote_n";  //Topic name voor elke axa remote 2.0 een andere topic name opgeven.
const char* mqttUser = "your_mqttusername"; 
const char* mqttPass = "your_mqttpassword";


// Initialiseer WiFiClient en PubSubClient

WiFiClient espClient;
PubSubClient client(espClient);
SoftwareSerial softSerial(5, 4); // RX = D1, TX = D2 Verbind deze pinnen met de linbus converter

Ticker ticker; //declareert een object van de klasse Ticker, genaamd ticker
static char buffer[80]; // Definieer een buffer van 80 bytes (dit is proefondervindelijk bepaald kan vast mooier)

void setup() 
{

  // Initialiseer seriële communicatie via usb poort en voor linbus controller
  Serial.begin(115200); //Initialiseer serial port via usb
  softSerial.begin(19200, SWSERIAL_8N2); // Initialiseer software serial port voor linbus

  // Maak verbinding met Wi-Fi
  WiFi.hostname(TOPIC_NAME);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  ticker.attach(300, checkMQTTConnection); // Controleer elke n seconde of er nog een verbinding is met de MQTT-server

  MQTTsetup();
}


//functie op de verbinding op te zetten met de MQTT broker
void MQTTsetup()
{
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(MQTTcallback);
  while (!client.connected()) 
  {
    Serial.println("Connecting to MQTT...");
    //if (client.connect(TOPIC_NAME))  // gebruik deze regel als er geen mqtt inlog en password gebruikt worden
    if (client.connect(TOPIC_NAME, mqttUser, mqttPass)) 
    {
      Serial.println("connected");
    }
    else
    {
      Serial.print("failed with state ");
      Serial.println(client.state());
      delay(2000);
    }
  }

  client.subscribe((String(TOPIC_NAME) + "/commands").c_str());   // Abonneer op het eerder gedefineerde topic 
}


// functie controleert elke 5 min de verbinding met de wi-fi en de mqtt broker
void checkMQTTConnection() {
  if (!client.connected()) { 
    Serial.println("verbinding MQTT server verbroken.. opnieuw connecteren");  
    WiFi.disconnect(); // verbreek huidige Wi-Fi verbinding
    delay(1000);
    WiFi.begin(ssid, password); // maak opnieuw verbinding met Wi-Fi
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.println("Connecting to WiFi..");
    }
    MQTTsetup();
  }
  else { 
    Serial.println("verbinding MQTT server is in orde");
  }
}


// Deze functie wordt aangeroepen wanneer er een MQTT-bericht binnenkomt op het gespecificeerde topic
void MQTTcallback(char* topic, byte* payload, unsigned int length)
{
  Serial.print("Bericht ontvangen op topic: ");
  Serial.print(topic);
  Serial.print("Bericht: ");


  String message;
  for (int i = 0; i < length; i++)
  {
  message = message + (char)payload[i];
  }
  Serial.println(message);
  if (message == "open")
  {
  open_axa();
  }
  else if (message == "stop")
  {
  stop_axa();
  }
  else if (message == "close")
  {
  close_axa();
  }
  else if (message == "status")
  {
  status_axa();
  }
}

// Deze functie verwerkt binnenkomende MQTT-berichten
void loop(){
client.loop();
}




void open_axa() {
  softSerial.println("\r");
  delay(10);
  softSerial.print("O");
  delay(10);
  softSerial.print("P");
  delay(10);
  softSerial.print("E");
  delay(10);
  softSerial.print("N");
  delay(10);
  softSerial.println("\r");
}

void close_axa() {
  softSerial.println("\r");
  delay(10);
  softSerial.print("C");
  delay(10);
  softSerial.print("L");
  delay(10);
  softSerial.print("O");
  delay(10);
  softSerial.print("S");
  delay(10);
  softSerial.print("E");
  delay(10);
  softSerial.println("\r");
}

void stop_axa() {
  softSerial.println("\r");
  delay(10);
  softSerial.print("S");
  delay(10);
  softSerial.print("T");
  delay(10);
  softSerial.print("O");
  delay(10);
  softSerial.print("P");
  delay(10);
  softSerial.println("\r");
}

void status_axa() {
  softSerial.println("\r");
  delay(10); //100
  softSerial.print("S");
  delay(10);
  softSerial.print("T");
  delay(10);
  softSerial.print("A");
  delay(10);
  softSerial.print("T");
  delay(10);
  softSerial.print("U");
  delay(10);
  softSerial.print("S");
  delay(10);
  softSerial.println("\r");
  //static char buffer[80]; // Definieer een buffer van 80 bytes (dit is proefondervindelijk bepaald kan vast mooier)
  delay(20); //om te voorkomen dat eerste keer uitlezen status mislukt
  int count = 0;
  while (softSerial.available() && count < 79) { // Lees inkomende data totdat de buffer vol is
    buffer[count++] = softSerial.read();
  }
  buffer[count] = '\0'; // Voeg een nul-terminator toe om de string af te sluiten
  
  if (count > 0) {
    // Controleer of de string "Unloced" of "Strong Locked" bevat en publiceer de status via client.publish
    String res = String(buffer);
    Serial.println(buffer);//print de volledige buffer 
    if (res.indexOf("Strong Locked") != -1) {
      //client.publish(TOPIC_NAME"/state", "locked");
      client.publish(((String(TOPIC_NAME) + "/state").c_str()),"locked");
    } else if (res.indexOf("UnLocked") != -1) {
      //client.publish(TOPIC_NAME"/state", "opened");
        client.publish(((String(TOPIC_NAME) + "/state").c_str()),"opened");
    }
    else{
      //client.publish(TOPIC_NAME"/state", "state unknown");
        client.publish(((String(TOPIC_NAME) + "/state").c_str()),"unknown");
    }
  }
}