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.