Change value of my V_CUSTOM in HA

Hi,

I have a system away from house and Wi-Fi it's not really good. I will install NRF24L04 node with two Arduino nano. One for serial gateway on my PI and Home Assistant and other node with 8 relay (away) for pump in my shed. I controlled node from HA but i need to use a variable for time to open. Now i have start code and i presente each relay like this (Mysensors.json)
48 is my time to open relay.

"12": {
    "sensor_id": 12,
    "children": {
        "0": {
            "id": 0,
            "type": 3,
            "description": "",
            "values": {
                "2": "0",
                "48": "0"

I create relay control in lavelace.

  • type: vertical-stack
    cards:
    - type: custom:mushroom-number-card
    entity: input_number.relais_0_duree
    name: Durée relais 0
    display_mode: slider
    icon: mdi:timer
    - type: custom:mushroom-entity-card
    entity: switch.relais_remote_12_0
    name: Activer relais 0
    icon: mdi:toggle-switch
    tap_action:
    action: toggle

When i put some value on slider, i want to change my V_CUSTOM value (48).

This is my code for my node.

#include <Arduino.h>
#define MY_DEBUG
#define MY_RADIO_RF24
#define MY_REPEATER_FEATURE
#define MY_NODE_ID 12

#include <SPI.h>
#include <MySensors.h>
#include <LCD_I2C.h>
#include <TimeLib.h>

// -----------------------------------------------------------------------------
// Infos node
// -----------------------------------------------------------------------------
#define SN "Relais Remote"
#define SV "1.7"

// -----------------------------------------------------------------------------
// Matériel
// -----------------------------------------------------------------------------
#define NB_OUTPUTS   8
#define OUTPUT_SER   7
#define OUTPUT_RCLK  8
#define OUTPUT_SRCLK 4
#define OUTPUT_EN    6
#define HEARTBEAT_DELAY 3600000UL

LCD_I2C lcd(0x27, 16, 2);

// -----------------------------------------------------------------------------
// États & timers
// -----------------------------------------------------------------------------
byte outputStates = 0;
bool initialValuesSent = false;
unsigned long lastHeartbeat = 0;

unsigned long relayDuration[NB_OUTPUTS] = {0};   // durée en secondes
unsigned long relayTimer[NB_OUTPUTS]   = {0};    // millis() d’extinction

MyMessage msgStatus(0, V_STATUS);
MyMessage msgDuration(0, V_CUSTOM);  // V_CUSTOM = 48

// -----------------------------------------------------------------------------
// 74HC595 — écriture centralisée
// -----------------------------------------------------------------------------
void writeShiftRegister(byte value) {
  digitalWrite(OUTPUT_RCLK, LOW);
  shiftOut(OUTPUT_SER, OUTPUT_SRCLK, MSBFIRST, value);
  digitalWrite(OUTPUT_RCLK, HIGH);
}

// -----------------------------------------------------------------------------
// Change l’état d’un relais
// -----------------------------------------------------------------------------
void changeOutputState(uint8_t relay, bool state) {
  bitWrite(outputStates, relay, state);
  writeShiftRegister(outputStates);
}

// -----------------------------------------------------------------------------
// Setup
// -----------------------------------------------------------------------------
void setup() {
  Serial.begin(115200);

  pinMode(OUTPUT_SER, OUTPUT);
  pinMode(OUTPUT_RCLK, OUTPUT);
  pinMode(OUTPUT_SRCLK, OUTPUT);
  pinMode(OUTPUT_EN, OUTPUT);
  digitalWrite(OUTPUT_EN, LOW);

  writeShiftRegister(0); // Tous relais OFF au boot

  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.print("Relais Remote");
  lcd.setCursor(0, 1);
  lcd.print("Boot...");

  // IMPORTANT : forcer la présentation sur un repeater
  wait(2000);
  presentation();
}

// -----------------------------------------------------------------------------
// Presentation MySensors
// -----------------------------------------------------------------------------
void presentation() {
  sendSketchInfo(SN, SV);

  for (int i = 0; i < NB_OUTPUTS; i++) {
    // Chaque relais = S_CUSTOM (capteur personnalisé)
    present(i, S_CUSTOM);
    wait(50);
  }
}

// -----------------------------------------------------------------------------
// Loop
// -----------------------------------------------------------------------------
void loop() {
  // Envoi initial des valeurs APRÈS que le transport soit prêt
  if (!initialValuesSent && isTransportReady()) {
    for (int i = 0; i < NB_OUTPUTS; i++) {
      // Durée initiale (V_CUSTOM)
      msgDuration.setSensor(i);
      send(msgDuration.set((uint32_t)0), true);   // crée "48": "0" dans JSON
      wait(50);

      // État ON/OFF initial (V_STATUS)
      msgStatus.setSensor(i);
      send(msgStatus.set(false));
      wait(50);
    }
    initialValuesSent = true;
  }

  // Gestion des timers de durée
  unsigned long nowMs = millis();
  for (uint8_t i = 0; i < NB_OUTPUTS; i++) {
    if (relayTimer[i] != 0 && (long)(nowMs - relayTimer[i]) >= 0) {
      // Temps écoulé → couper le relais
      changeOutputState(i, false);
      relayTimer[i] = 0;

      msgStatus.setSensor(i);
      send(msgStatus.set(false));
    }
  }

  // Heartbeat
  if (millis() - lastHeartbeat > HEARTBEAT_DELAY) {
    sendHeartbeat();
    lastHeartbeat = millis();
  }

  // Affichage simple sur LCD
  lcd.setCursor(0, 0);
  lcd.print("Relais Remote   ");
  lcd.setCursor(0, 1);
  for (uint8_t i = 0; i < NB_OUTPUTS; i++) {
    lcd.print(bitRead(outputStates, i) ? '1' : '0');
  }
}

// -----------------------------------------------------------------------------
// Réception MySensors
// -----------------------------------------------------------------------------
void receive(const MyMessage &message) {
  uint8_t relay = message.sensor;

  switch (message.type) {

    case V_STATUS: { // ON/OFF depuis HA
      bool state = message.getBool();
      changeOutputState(relay, state);

      // Si ON et durée > 0 → programmer l’extinction
      if (state && relayDuration[relay] > 0) {
        relayTimer[relay] = millis() + relayDuration[relay] * 1000UL;
      }
      if (!state) {
        relayTimer[relay] = 0;
      }
      break;
    }

    case V_CUSTOM: { // Durée reçue depuis HA (slider)
      relayDuration[relay] = message.getULong();

      // Renvoi vers HA pour qu’il mette à jour le JSON
      msgDuration.setSensor(relay);
      send(msgDuration.set((uint32_t)relayDuration[relay]));
      

      Serial.print("V_CUSTOM (duree) relais ");
      Serial.print(relay);
      Serial.print(" = ");
      Serial.println(relayDuration[relay]);
      break;
    }

    default:
      break;
  }

  // Retour d’état ON/OFF
  msgStatus.setSensor(relay);
  msgStatus.set(bitRead(outputStates, relay));
  send(msgStatus);
}

I tried to use MQTT but i thing i can't use MQTT. Nothin happend in MQTT.

thank for help.