Bonjour,
Merci de répondre
Pas exactement:
1 gateway mysensors reliée a Domoticz
4 relais mysensors sur un seul Arduino, relié a cette gateway
Dans le sens Domoticz => relais, tout va bien. Les relais basculent, et leur état est affiché par Domoticz.
L'action sur une entrée de l'Arduino fonctionne en local, mais n'est pas visualisée sur Domoticz, sauf le premier relais, et les autres de façon aléatoire, en fonction de l'état de ceux qui le précédent. Il y a manifestement une dépendance cachée, que je ne comprends pas.
J'ai bien sûr fait de multiplies essais, et pour exemple j'ai trouvé un sketch avec 3 relais sur le net, qui fonctionne ainsi lui aussi. Je ne souhaite pas encombrer le forum, mais je vais le recopier ci-dessous.
Dans un premier temps j'ai pensé qu'une solution provisoire serait de faire transmettre en direction de la gateway l'état de tous les relais, l'un après l'autre, dès qu'un état avait changé. En fait, répéter l’état de celui qui avait changé accompagné de l'état des autres. Sans résultat.
Le fait que je ne trouve pas de question à ce sujet me laisse à penser que j'ai dû rater quelque chose d'énorme
Dommage, car le système serait parfait dans le cas d'une "domotique" personnalisée. Je ne vois pas l’intérêt de gérer à distance des lumières dans mon cas, mais de surveiller des états et avoir une possibilité de commande à distance. Aucun système autre que mysensors ne me semble assez souple et ouvert, mais je coince sur quelque chose de basique....
#include <MySensor.h>
#include <SPI.h>
#include <Bounce2.h>
#define RELAY_ON 0 // switch around for realy HIGH/LOW state
#define RELAY_OFF 1
//
MySensor gw;
#define RADIO_ID 14 // radio Id, whatever channel you assigned to
#define noRelays 3
const int relayPin[] = {A2, A3, A4}; // switch around pins to your desire
const int buttonPin[] = {4, 5, 6}; // switch around pins to your desire
class Relay // relay class, store all relevant data (equivalent to struct)
{
public:
int buttonPin; // physical pin number of button
int relayPin; // physical pin number of relay
byte oldValue; // last Values for key (debounce)
boolean relayState; // relay status (also stored in EEPROM)
};
Relay Relays[noRelays];
Bounce debouncer[noRelays];
MyMessage msg[noRelays];
void setup(){
gw.begin(incomingMessage, RADIO_ID, true);
delay(250);
gw.sendSketchInfo("MultiRelayButton", "0.9b");
delay(250);
// Initialize Relays with corresponding buttons
for (int i = 0; i < noRelays; i++){
Relays
.buttonPin = buttonPin; // assign physical pins
Relays.relayPin = relayPin;
msg.sensor = i; // initialize messages
msg.type = V_LIGHT;
debouncer = Bounce(); // initialize debouncer
debouncer.attach(buttonPin);
debouncer.interval(5);
pinMode(Relays[i].buttonPin, INPUT_PULLUP);
pinMode(Relays[i].relayPin, OUTPUT);
Relays[i].relayState = gw.loadState(i); // retrieve last values from EEPROM
digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
gw.send(msg[i].set(Relays[i].relayState? true : false)); // make controller aware of last status
gw.present(i, S_LIGHT); // present sensor to gateway
delay(250);
}
}
void loop()
{
gw.process();
for (byte i = 0; i < noRelays; i++){
debouncer[i].update();
byte value = debouncer[i].read();
if (value != Relays[i].oldValue && value == 0){
Relays[i].relayState = !Relays[i].relayState;
digitalWrite(Relays[i].relayPin, Relays[i].relayState?RELAY_ON:RELAY_OFF);
gw.send(msg[i].set(Relays[i].relayState? true : false));
gw.saveState( i, Relays[i].relayState );} // save sensor state in EEPROM (location == sensor number)
Relays[i].oldValue = value;
}
}
// process incoming message
void incomingMessage(const MyMessage &message){
if (message.type == V_LIGHT){
if (message.sensor <noRelays){ // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
Relays[message.sensor].relayState = message.getBool();
digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
}
}
}
Encore une fois, Merci de ton aide éclairée 