Page 1 sur 1

multirelais mysensors

Publié : 06 mai 2015, 11:16
par Alain69
Bonjour,
Je débute avec Domoticz, et je bute sur un mystère probablement évident :)
Principe de départ: 3 boutons et 3 relais indépendants sur une carte utilisant MySensor.

Après de nombreuses vérifications, je ne comprends toujours pas comment les rendre indépendants dans Domoticz.
L'exemple qui suit est tiré d'un script trouvé sur le net,mais tout semble correct.
Les entrées sont bien détectées par Domoticz, les commandes depuis Domoticz se font bien, indépendantes, et tout serait parfait sauf que les états des relais sont affichées seulement si les relais précédents sont sur ON. Les communications radio se font bien, sont visibles par l'heure du dernier message reçu, mais pas de modification de l'icône permettant de connaitre l'état ON/OFF. Or je dois connaitre l'état du relais si il est actionné en local.
Il y a une dépendance des entrées que je ne comprends pas, sans bien sûr de configuration de dispositif esclave.

Comment rendre les entrées indépendantes et afficher les états également de façon indépendante?

Je joins le script utilisé, qui n'a rien de mystérieux.... Le souci est manifestement dans l'utilisation de Domoticz.

Merci!!!

#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)
}
}
}