FHEM MySensors Relais

Begonnen von Player254, 13 Januar 2017, 10:36:26

Vorheriges Thema - Nächstes Thema

Player254

Mahlzeit,


ich habe ein kleines Problem, ich habe mit MySensors ein kleines Projekt gestartet und zwar sollen 6 Relais mein Licht im OG steuern, Registrierung der 230V Eingänge (Vorhandene Schalter werden durch Taster ersetzt) und auch setzen der Ausgänge funktioniert, Schalten per FHEM auch. Zum eigentlichen Problem im MySensors Device (6 "Geräte"/Readings der Eingänge) vorhanden wird auch alles Sachgemäß angezeigt, jedoch habe ich zum schalten der Ausgänge je ein weiteres Device erstellt, dort wird jedoch nicht mehr der aktuelle Status angezeigt, wenn ich per Hardware schalte.
Jetzt meine Frage, wie kann ich die readings (Status1-Status6) aus dem MySensors Device (102) in das Device (Schlafzimmer) übertragen?

Soweit ich weiß ist es ja nicht möglich mehrerer On/Off Schaltflächen in das MySensors Device(102) zu integrieren?

Ich hoffe ihr versteht was ich meine und könnt mir ein wenig helfen, werde später nochmal ein paar Bilder hochladen.

gloob

Kannst du vielleicht mal deinen Sketch von MySensors posten?
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

Player254

Moin,


klar, aber denke eher das besagtes Problem an FHEM liegt, weil im Modul selbst die Readings aktuell sind(Status1 - Status6)

Erstmal der Code, habe zur Übersicht ein paar Unwichtige Sachen rausgenommen, die nichts mit der eigentlichen Funktion zu tun haben.



#define RELAY_1  2  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 6 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define SZ_CHILD_ID 1   // Id of the sensor child Schalfzimmer
#define WZ_CHILD_ID 2   // Id of the sensor child Wohnzimmer
#define BU_CHILD_ID 3   // Id of the sensor child Büro
#define BZ_CHILD_ID 4   // Id of the sensor child Badezimmer
#define FL_CHILD_ID 5   // Id of the sensor child Flur
#define RV_CHILD_ID 6   // Id of the sensor child Reserve


(Jeweils in 6 facher ausführung für jeden Raum)
Bounce SZdebouncer = Bounce();

int oldSZValue=0;

bool SZstate;

MySensor gw;
MyMessage SZMsg(SZ_CHILD_ID,V_LIGHT);
MyMessage WZMsg(WZ_CHILD_ID,V_LIGHT);
MyMessage BUMsg(BU_CHILD_ID,V_LIGHT);
MyMessage BZMsg(BZ_CHILD_ID,V_LIGHT);
MyMessage FLMsg(FL_CHILD_ID,V_LIGHT);
MyMessage RVMsg(RV_CHILD_ID,V_LIGHT);

void setup() 
{   
  // Initialize library and add callback for incoming messages
  gw.begin(incomingMessage, AUTO, true);
  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("OG Light Control", "1.0");

  // Fetch relay status
  for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    gw.present(sensor, S_LIGHT);
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);   
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
  }

// Setup the button
  pinMode(SZBUTTON_PIN,INPUT);

  // Activate internal pull-up
  digitalWrite(SZBUTTON_PIN,HIGH);
 
  // After setting up the button, setup debouncer
  SZdebouncer.attach(SZBUTTON_PIN);

  SZdebouncer.interval(5);


}


void loop()
{
  // Alway process incoming messages whenever possible
  gw.process();
 
  SZdebouncer.update();
  // Get the update value
  int SZvalue = SZdebouncer.read();
  if (SZvalue != oldSZValue && SZvalue==0) {
    SZstate = !SZstate;   
      gw.send(SZMsg.set(SZstate), true); // Send new state and request ack back
   // Change relay state
     digitalWrite(-1+RELAY_1, SZstate?RELAY_ON:RELAY_OFF);
  }
  oldSZValue = SZvalue;

//*******************************Wohnzimmer***********************************************


{
  WZdebouncer.update();
  // Get the update value
  int WZvalue = WZdebouncer.read();
  if (WZvalue != oldWZValue && WZvalue==0) {
    WZstate = !WZstate;   
      gw.send(WZMsg.set(WZstate), true); // Send new state and request ack back
   // Change relay state
   digitalWrite(-1+RELAY_1, WZstate?RELAY_ON:RELAY_OFF);
  }
  oldWZValue = WZvalue;
}

//*************************************Büro*************************************************
{
  BUdebouncer.update();
  // Get the update value
  int BUvalue = BUdebouncer.read();
  if (BUvalue != oldBUValue && BUvalue==0) {
    BUstate = !BUstate;   
      gw.send(BUMsg.set(BUstate), true); // Send new state and request ack back
   // Change relay state
   digitalWrite(-1+RELAY_1, BUstate?RELAY_ON:RELAY_OFF);
  }
  oldBUValue = BUvalue;
}


//*************************************Badezimmer*********************************************

{
  BZdebouncer.update();
  // Get the update value
  int BZvalue = BZdebouncer.read();
  if (BZvalue != oldBZValue && BZvalue==0) {
    BZstate = !BZstate;   
      gw.send(BZMsg.set(BZstate), true); // Send new state and request ack back
   // Change relay state
   digitalWrite(-1+RELAY_1, BZstate?RELAY_ON:RELAY_OFF);
  }
  oldBZValue = BZvalue;
}





//*************************************Flur***************************************************
{
  FLdebouncer.update();
  // Get the update value
  int FLvalue = FLdebouncer.read();
  if (FLvalue != oldFLValue && FLvalue==0) {
    FLstate = !FLstate;   
      gw.send(FLMsg.set(FLstate), true); // Send new state and request ack back
   // Change relay state
   digitalWrite(-1+RELAY_1, FLstate?RELAY_ON:RELAY_OFF);
  }
  oldFLValue = FLvalue;
}


//*************************************Reserve*********************************************
{
  RVdebouncer.update();
  // Get the update value
  int RVvalue = RVdebouncer.read();
  if (RVvalue != oldRVValue && RVvalue==0) {
    RVstate = !RVstate;   
      gw.send(RVMsg.set(RVstate), true); // Send new state and request ack back
   // Change relay state
   digitalWrite(-1+RELAY_1, RVstate?RELAY_ON:RELAY_OFF);
  }
  oldRVValue = RVvalue;
}


}

void incomingMessage(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_LIGHT) {
     // Change relay state
     digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     gw.saveState(message.sensor, message.getBool());
   
   }
}


Desweiteren 2 Bilder aus meinem FHEM
Rot umrandet: "Schlafzimmer" als eigenes Device erstellt aus dem "MySensor_Device_102" Dort wird das reading NICHT aktualisiert, wenn ich den Physischen Button benutze, wenn ich Per FHEM, Homekit Schalte jedoch schon!

Grün umrandet: Das MySensor_Device_102, mit Autocreate selbst erzeugt mit ALLEN einträgen, hier werden die reading jedoch aktualisiert, wenn ich den Physischen Button benutze.

Meine Frage nun, wie bewerkstellige ich es nun, dass auch im Device "Schlafzimmer" es bei button Betätigung aktualisiert?



Mfg
Player254 :)


Beta-User

Zitat von: Player254 am 13 Januar 2017, 15:13:28
Rot umrandet: "Schlafzimmer" als eigenes Device erstellt aus dem "MySensor_Device_102" Dort wird das reading NICHT aktualisiert, wenn ich den Physischen Button benutze, wenn ich Per FHEM, Homekit Schalte jedoch schon!
Wie erzeugst Du denn das "eigene Device"? Ist das ein ReadingsProxy oder irgend etwas anderes, das Du innerhalb von FHEM durch eigene Automatismen aktualisierst?

Es scheint jedenfalls kein originäres MySensors-Problem zu sein, sondern "nur" ein Darstellungsthema, jedenfalls scheint der Sketch an sich i.O. zu sein (mit Schleifen und Arrays könnte man das evtl. übersichtlicher machen, das ist aber ein anderes Thema)...

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Player254

Hallo,


habe das "Device" Einfach über "define <name> MYSENSOR_DEVICE <node_id>" erzeugt. Das ich Quasi aus dem "Großen" mehrere kleine mache, wo ich dann auch zu jedem "Raum" ein On/Off Schalter habe.
Dazu die attribute vergeben:
IODev <name>
mapReading_status1 <1 status>
setCommands on:status1:on off:status1:off
setReading_status1 on,off
stateFormat status1


Mfg

Beta-User

Schau Dir doch mal ReadingsProxy (=>Commandref) an.

Das ist gerade dazu gemacht, Multisensoren bei Bedarf in einzelne "virtuelle" Devices zu zerlegen. Dazu kannst Du das "Einzeldevice" gleich auch sinnvoll benennen und dem richtigen Raum zuweisen. Diese Mehrfachanlage wie Du das machst, kommt mir irgendwie verbogen vor, vermutlich führt das beim FHEM-Start auch zu fehlermeldungen (already defined...) und weiteren Probleme, solltest Du später mal das Ausgangsdevice löschen und wieder neu anlegen. Schau dazu auch mal ins log.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Player254

Ahh, okay das sieht interessant aus, wenn ich das richtig verstanden habe, muss ich jedoch das "Große" MYSENSORS_Device wieder löschen und dann die Räume neu definieren?

Und wenn ich jetzt mal ganz doof Frage kam aus dem Eintrag aus dem FHEM Wiki:

"attr Schalter_channelB valueFn {$LASTCMD}"

Ist die aktuelle "Value" sprich unser State = letztes ausgeführtes Kommando? Sprich wenn ich "ON" drücke einfach nur auf On gesetzt?
Wie handle ich aber nun die Physischen Buttons/die Eingänge am Node?

Beta-User

Zitat von: Player254 am 13 Januar 2017, 15:59:46
muss ich jedoch das "Große" MYSENSORS_Device wieder löschen und dann die Räume neu definieren?
Nein, das "große" bleibt erhalten, es wird dann aber pro Relais ein Readingsproxy definiert. Habe das nicht im Detail im Kopf, aber das geht ziemlich intuitiv, man muß da gar nicht viel mit attr machen, das meiste wird einfach durch das Modul vom Hauptdevice automatisch übernommen. Anders gesagt: Der ReadingsProxys sind dann jeweils die Geräte/Devices, die in FHEMWEB in den einzelnen Räumen angezeigt werden sollen.

Was die Eingänge angeht, sind die m.E. ziemlich uninteressant, wichtig ist nur, dass die Node den jeweiligen Status rückmeldet (und das sollte lt. Sketch erfolgen) und wird beim "richtigen" Device ja auch korrekt angezeigt, wenn ich das recht verstanden habe. Die ReadingsProxys übernehmen dann den Status aus dem Ursprungs-Device.

Leider kann ich Dir grad kein getestetes Beispiel liefern, aber es sollte in die Richtung funktionieren:
define Licht_Schlafzimmer readingsProxy MYSENSORS_102:status1

Btw: Bitte verwende zukünftig Code-Tags (# oben)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Player254

Habe das ganze jetzt mal ausprobiert, jedoch geht wieder nur die Steuerung aus der Fhem Oberfläche.
Es ist immernoch nicht möglich den Physischen Button dort mit einzubeziehen.
Kann die Lampe über den Schalter ausschalten und jedoch zeigt FHEM im Proxy ON an, im Device jedoch unter den Reading im Status1 Off.
Da scheint die Weitergabe vom Device an den Proxy noch nicht zu klappen. Woran kann das jetzt noch liegen? Bzw. wie behebe ich das Problem noch?


Beta-User

Wie gesagt, ich kann das jetzt nicht live nachvollziehen.

Mit dem einen "define" sollte ein typischer Lichtschalter (die Birne) ordentlich angelegt worden sein, oder?
Soweit ich das in Erinnerung habe, wird der Status dann auch aktualisiert, wenn von der Node her das "off" kommt (bei Dir Schalter gedrückt, bei mir ein Reedkontakt, der das Relais ausschaltet).

Hast Du alle "überflüssigen" (also von Dir manuell angelegten) MYSENSORS_102 gelöscht? Sonst könnte es sein, dass der Readingsproxy sich das vom "falschen" Device zieht...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Player254

Ja, mit dem anlegen von dem Device wird das alles eingefügt, habe dann noch WebCMD, setList und setFn hinzugefügt. Lässt sich auch ein und ausschalten, jedoch wird es im Proxy nicht angezeigt wenn ich den Kontakt betätige, nur im "Master" MYSENSOR_102.


Ja, habe alle anderen MYSENSOR_102 Devices entfernt.

Player254

Okay, also jetzt Zeigt er auf einmal doch den Wechsel an, wenn ich den Button betätige, keine Ahnung wieso auf einmal.
Werde jetzt noch meine anderen Definieren und sollte nochmal ein Fehler auftreten, schreibe ich nochmal.

Aber trotzdem erstmal vielen dank für deine Hilfe!

Gruß
Player254

Beta-User

Eventuell solltest Du FHEM nochmal (nach save) neu starten oder ein reload der config machen. Vermutlich sind da Auswirkungen von der ehemaligen Doppelanlage zu spüren ;).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Player254

Werde ich gleich mal machen wenn der Rest definiert und wieder im Homekit eingepflegt ist, hoffe diesmal dann Fehlerfrei :D