Enocean Verständnissproblem...

Hallo zusammen,

ich hoffe ihr könnt mich aufklären.

Ich spiele mit dem gedanken bei mir Enocean einzusetzen - mittlerweile gibt es ja eine riesige auswahl an Produkten. Besonders die Komponenten von eltako haben es mir angetan weil die Relativ preiswert sind.

Aber wie ist das jetzt mit dem TCM120? Ich habe mir mal die Doku angesehen und da stand irgenwas von einer Beschränkung auf max. 30 Teilnehmer die angelernt werden können… Ist das so richtig?

Was muss denn da wie angelernt werden? Das TCM bei den Emfängern ? Oder die Sender beim TCM ? Oder wie…:confused:

Ich dachte das TCM gibt transparent alle daten die empfangen werden auf der Seriellen schnittstelle aus?

Gruß,
Thorsten.

Du scheinst dich ja gerade eingehender mit dem Thema zu beschäftigen, deswegen mal kurz OT :

Bidirektionalität und Routing sind nicht möglich mit Enocean, oder ?

Also ein ökologisch sinnvolles FS20 ?

Noch nicht !! warte mal 3 monate

Wenn du eine Enocean- USB Sende und Empfangseinheitnimmst ist das kein Problem. Einfach an den PC anstecken, FTDI Treiber installiert sich selbst und schon stehen dir alle Signale in IPS zur Verfügung. Diese Variante ist schon vielfach in Gebrauch und hat sich bewährt. Eine Beschränkung gibt es nicht.

Der Werdegang zum einlernen ist wie folgt:

Sender (z.B. Taster) in IPS einlernen: IPS in den Einlernmodus versetzen, Taster drücken -> IPS erkennt die ID -> Variable zuordnen und fertig.

In entgegengesetzter Richtung versetzt du einen Schaltaktor in den Lernmodus und löst einen Schaltbefehl in IPS aus. AKtor erkennt Signal - > Lernmodus beenden und fertig.

Also brauche ich nur diese USB-Schnittstelle oder ein TCM120 mit Schnittstelle und die entsprechenden Enocean Komponenten.

Alles was empfangen wird wird Transparent durchgereicht.

Nur wenn ich senden will muss ich das TCM bei den entsprechenden emfängern anlernen? Ich kann also nicht ein Telegramm eines beliebeigen senders „simulieren“?

Gruß,
Thorsten

Kann mir bitte jemnad meine letzte frage noch beantworten??:slight_smile:

Danke und gruß,
thorsten

Bei fast allen Aktoren können bis zu 30 Sender angelernt werden. Sender sind z.B. Schalter oder aber auch die Sende und Empfangseinheit. Im Klartext heißt das, Du kannst entweder von einem Schalter oder von deiner Sende- und Empfangseinheit z.B. eine Lampe einschalten oder den Rolladen schließen. Da Du aber auch wissen willst, wann die Lampe an oder aus ist, mußt Du noch den Sender über die Sende- und Empfangseinheit einlesen bzw. das Telegramm mithören (für die Visualisierung).

Hört sich kompliziert an, ist aber eigentlich ganz einfach:

Wandsender sendet Telegramm -> Lampe und IPS empfangen Telegramm

IPS sendet Telegramm -> Lampe empfängt Telegramm und Variable in IPS wird gesetzt für die Visualisierung

Alles klar?

Die Sende- und Empfangseinheit kann übrigens nicht nur 30 sondern bis zu 128 Aktoren (Empfänger) ansprechen.

Gruß Eddi

Hallo Eddi,

ich glaube Thorsten meinte etwas anderes. Wir beide hatten ja auch schon mal über dieses Thema gesprochen:

Ist es möglich aus IP-Symcon heraus einen String über einen EnOcean-Sender so zu versenden, dass er von einem EnOcean-Aktor verstanden wird?

Also mit anderen Worten: kann IP-Symcon z.B. einen EnOcean-Schalter simulieren?

Gruß
HJH

Die Frage verstehe ich net so richtig, also bei mir sendet ein enocean Schalter zu IPS, dann wird ein script gestartet und darin sende ich den Schaltbefehl für eine Lampe. Also ich lausche NICHT mit ! ich schalte über IPS.

Vieleicht beseitigt das alle Klarheiten:

Grundprinzip von EnOcean ist, dass man sich absolut sicher sein kann, dass der Nachbar nicht zufällig mit dem gleichen Code sendet.

Daher hat jeder Sender einen einmaligen Code (!)
Jeder Empänger kann auf bis zu 30 Sender eingelernt werden (dürfte ja ausreichen in der Realität)

Die Sendeeinheiten haben einen Codebreich, genaugesagt 128 mögliche Codes. Mehr als 128 unterschiedliche Aktoren kann man also nicht damit ansteuern (dürfte aber auch reichen in der Realität)

Empfangen können die Transceiver natürlich alle Codes.

Mit dem Prinzip ist sichergestellt, dass Dein Nachbar Dir und Du niemals ihm die Kaffemaschine oder das Licht oder was auch immer ein- oder ausschalten kannst, weil die Empänger immer auf eine einmaligen Code eingelernt werden müssen.

Gruß Rolf

Danke euch allen, alles ist mir zwar noch nicht klar, aber der nebel lichtet sich;)

Ich werde mir mal ein paar komponenten zum testen besorgen - dann dürfte ich das prinzip hoffenlich verstanden haben.

Also:

Ein TCM 120 hat also einen Adresspool von 128 Adressen mit denen ich also max 128 aktoren ansteuern kann…
Ich muss nochmal die API wälzen, wie ich mir da einzelne Adressen rauspicken kann.

HJH hat mich verstanden, respekt!:smiley: (ich verstehe mich manchmal selber nicht…)

Hallo Thorsten,

Alles was empfangen wird wird Transparent durchgereicht.

Nur wenn ich senden will muss ich das TCM bei den entsprechenden emfängern anlernen?

Genauso ist es mit dem senden auch, das Telegramm wird nur durchgereicht. Das TCM wird beim Empfänger somit nicht angelernt, sondern der „IPS-enOcean-Taster“.

Ich kann also nicht ein Telegramm eines beliebeigen senders „simulieren“?

Wenn die „32-bit transmitter ID“ des Senders bekannt ist und diese auch in IPS eingeben könntest, dann könnte IPS auch einen Sender simulieren.

Grüße,
Jörg

Hy,
ich muss dieses Thema noch mal ansprechen. Habe das ganze Forum durchsucht
aber nichts gefunden oder kapiert.
Also fange ich mal an, ich habe die EnOcean USB - Sende- und Empfangseinheit und wollte die nachfolgende Aktoren damit schalten.
Besser gesagt diese teile wollte ich mir zulegen.

[ul]
[li]1x FAB12-12V
[/li][li]7x FSB12-12v DC
[/li][li]WNT12-12 DC /2A
[/li][/ul]

Alles von Eltako, wollte meine Rollos damit steuern.
Meine Frage dazu ist, kann ich Sie über Ipsymcon ansprechen? und wenn ja, was für einn Befehl muss ich senden um einen Aktor anzusprechen?. Ein Aktor kann 2 Rollos bedienen. Hoffe das mir jemand helfen kann. Danke und schöne Ostern.

Ich hab keine Ahnung was das für Geräte sind.
Entsprechend weiß ich auch nicht wie man sie ansprechen kann. Tut mir leid. IPS unterstützt aber eigentlich nur die PTM200 Bausteine zum schalten. Und dann sollte der Befehl ENO_SwitchMode gehen.

paresy

Hallo,
ich hoffe dieses Teil funktioniert mit IPS (Peha 452 FU-EP JR UP O.A.), habe mir mal ein Teil zum probieren geordert.
Von der Beschreibung her funktioniert zumindest das Anlernen analog eines RCM250.
Ich sehe das auch so, dass es mit dem Befehl ENO_Switchmode funktionieren müsste. Alle weiteren „Spielereien“ kann man dann ja über PHP realisieren.
Viel Grüße
Martin

Dieser Rolladenempfänger (Peha 452 FU-EP JR UP O.A.) funktioniert einwandfrei!.
Mit ENO_Switchmode „false“ fährt der Rolladen hoch, mit ENO_Switchmode „true“ fährt der Rolladen runter!
Ich bin von der EnOcean Technik völlig begeistert, mein Geldbeutel allerdings weniger!

hy,
habe mir die oben genannten Teile gekauft.
* 1x FAB12-12V
* 7x FSB12-12v DC
* WNT12-12 DC /2A
Für Schaltschrank, kann nur sagen SUPER TEILE. Habe das Shutterskript für Enocean angepasst und schalte jetzt mit SC_Move.

618780_20000061.jpg

image_FAB12_1.jpg

base_media.jpg

Hallo Uwe,
würdest Du mir dein Shutterskript einmal zur Verfügung stellen?
Ich blicke da noch nicht ganz durch wie ich das Skript anpassen kann.
Viele Grüße
Martin

Klar doch,

<?
//Variables provided by ShutterControl Module
//IPS_LogMessage("InstanceID", $SC_INSTANCE); /* InstanceID */
//IPS_LogMessage("Direction", $SC_DIRECTION); /* {0..2} Stop, Up, Down */
//IPS_LogMessage("Duration", $SC_DURATION); /* ms */

switch($IPS_SENDER)
{

case "ShutterControl": //Script wurde vom Shuttermodul aufgerufen

define("SC_DIRECTION_STOP", 0);
define("SC_DIRECTION_UP", 1);
define("SC_DIRECTION_DOWN", 2);

$instance = IPS_GetInstance($SC_INSTANCE);
switch($instance['ModuleInfo']['ModuleID'])
{
  case "{48FCFDC1-11A5-4309-BB0B-A0DB8042A969}": //FS20
      $running = CreateVariableByName($SC_INSTANCE, "Moving", 0);
      $value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE, "StatusVariable"));
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          if(GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, $value);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_UP:
          if(!GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, true);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "FS20U");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
                    IPS_Sleep($SC_DURATION);
              FS20_SwitchMode($SC_INSTANCE, true);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_DOWN:
          if(!GetValue($running))
          {
              FS20_SwitchMode($SC_INSTANCE, false);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "FS20D");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              FS20_SwitchMode($SC_INSTANCE, false);
              SetValue($running, false);
          }
          break;
      }
      break;
  case "{1B7B5B7D-CAA9-4AB5-B9D8-EC805EC955AD}": //xComfort
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          MXC_ShutterStop($SC_INSTANCE);
          break;
         case SC_DIRECTION_UP:
          MXC_ShutterMoveUp($SC_INSTANCE);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "XCOM");
          }
          if($SC_DURATION > 0 and $SC_DURATION <= 999)
          {
              IPS_Sleep($SC_DURATION);
              MXC_ShutterStop($SC_INSTANCE);
          }
          break;
         case SC_DIRECTION_DOWN:
          MXC_ShutterMoveDown($SC_INSTANCE);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "XCOM");
          }
          if($SC_DURATION > 0 and $SC_DURATION <= 999)
          {
              IPS_Sleep($SC_DURATION);
              MXC_ShutterStop($SC_INSTANCE);
          }
          break;
      }
      break;
      case "{2D871359-14D8-493F-9B01-26432E3A710F}": //LCN
      $type=LCN_GetUnit($SC_INSTANCE);
        switch($type)
        {
            case 0: //Ausgänge

                switch($SC_DIRECTION)
              {
             case SC_DIRECTION_STOP:
             LCN_SetIntensity($SC_INSTANCE,0,0);
              LCN_SetIntensity($SC_INSTANCE2,0,0);
              break;
             case SC_DIRECTION_UP:
              LCN_SetIntensity($SC_INSTANCE,100,4);
              if($SC_DURATION > 999)
              {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNA");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE,0,0);
              }
              break;
             case SC_DIRECTION_DOWN:
              LCN_SetIntensity($SC_INSTANCE2,100,4);
              if($SC_DURATION > 999)
              {
             TimerDelay($SC_INSTANCE2, $SC_DURATION, "LCNA");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SetIntensity($SC_INSTANCE2,0,0);
              }
              break;
              }
          break;

          case 2: //Relais
          switch($SC_DIRECTION)
              {
             case SC_DIRECTION_STOP:
             LCN_SwitchRelay($SC_INSTANCE,false);
              break;
             case SC_DIRECTION_UP:
              LCN_SwitchRelay($SC_INSTANCE,true);
              LCN_SwitchRelay($SC_INSTANCE2,false); // Um Relaisrichtung zu ändern bitte auf true
              if($SC_DURATION > 999)
              {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNR");
                }
                if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SwitchRelay($SC_INSTANCE, false);
              }
              break;
             case SC_DIRECTION_DOWN:
              LCN_SwitchRelay($SC_INSTANCE,true);
              LCN_SwitchRelay($SC_INSTANCE2,true);// Um Relaisrichtung zu ändern bitte auf false
              if($SC_DURATION > 999)
              {
                  TimerDelay($SC_INSTANCE, $SC_DURATION, "LCNR");
              }
              if($SC_DURATION > 0 and $SC_DURATION <= 999)
              {
              IPS_Sleep($SC_DURATION);
              LCN_SwitchRelay($SC_INSTANCE, false);
              }
              break;
              }
          break;
            }
          break;
  case "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}": //1-Wire Shutter
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
           OneWireShutter($SC_INSTANCE, 0, $SC_DURATION);
          break;
         case SC_DIRECTION_UP:
           if($SC_DURATION == 0)
             $SC_DURATION = 120000;
           OneWireShutter($SC_INSTANCE, 0, $SC_DURATION);
          break;
         case SC_DIRECTION_DOWN:
           if($SC_DURATION == 0)
             $SC_DURATION = 120000;
           OneWireShutter($SC_INSTANCE, 1, $SC_DURATION);
          break;
      }
    break;
    case "{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}": //Homematic Shutter
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          break;
         case SC_DIRECTION_UP:
              HM_WriteValueFloat($SC_INSTANCE, "LEVEL", 1.0);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "HOME");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          }
           break;
         case SC_DIRECTION_DOWN:
              HM_WriteValueFloat($SC_INSTANCE, "LEVEL", 0.0);
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "HOME");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              HM_WriteValueBoolean($SC_INSTANCE, "STOP", true);
          }
           break;
      }
    break;
case "{8492CEAF-ED62-4634-8A2F-B09A7CEDDE5B}": //enocean
      $running = CreateVariableByName($SC_INSTANCE, "Moving", 0);
      $value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE, "StatusVariable"));
      switch($SC_DIRECTION)
      {
         case SC_DIRECTION_STOP:
          if(GetValue($running))
          {
              ENO_SwitchMode($SC_INSTANCE, $value);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_UP:
          if(!GetValue($running))
          {
              ENO_SwitchMode($SC_INSTANCE, true);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
                    TimerDelay($SC_INSTANCE, $SC_DURATION, "ENOU");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
                    IPS_Sleep($SC_DURATION);
              ENO_SwitchMode($SC_INSTANCE, true);
              SetValue($running, false);
          }
          break;
         case SC_DIRECTION_DOWN:
          if(!GetValue($running))
          {
              ENO_SwitchMode($SC_INSTANCE, false);
              SetValue($running, true);
          }
          if($SC_DURATION > 999)
          {
              TimerDelay($SC_INSTANCE, $SC_DURATION, "ENOD");
          }
          if($SC_DURATION > 0 and $SC_DURATION <=999)
          {
              IPS_Sleep($SC_DURATION);
              ENO_SwitchMode($SC_INSTANCE, false);
              SetValue($running, false);
          }
          break;
      }
    break;
  default:
    die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
break;

case "TimerEvent": //Script wurde von einem Ereignis aufgerufen

IPS_SetEventActive($IPS_EVENT, false);    //Ereignis deaktivieren
$timer=IPS_GetName($IPS_EVENT);
$SCT_INSTANCE = intval(substr($timer,-5,5));
$bus = substr($timer,0,-5);

    switch ($bus)
    {
    case "LCNA":
    LCN_SetIntensity($SCT_INSTANCE,0,0);
    break;

    case "LCNR":
    LCN_SwitchRelay($SCT_INSTANCE,false);
    break;

    case "XCOM":
    MXC_ShutterStop($SCT_INSTANCE);
    break;

    case "HOME":
    HM_WriteValueBoolean($SCT_INSTANCE, "STOP", true);
    break;

    case "FS20U":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
        FS20_SwitchMode($SCT_INSTANCE, true);
       SetValue($running, false);
    break;

    case "FS20D":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
       FS20_SwitchMode($SCT_INSTANCE, false);
      SetValue($running, false);
    break;

    case "ENOU":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
        ENO_SwitchMode($SCT_INSTANCE, true);
       SetValue($running, false);
    break;

    case "ENOD":
    $running = CreateVariableByName($SCT_INSTANCE, "Moving", 0);
       ENO_SwitchMode($SCT_INSTANCE, false);
      SetValue($running, false);
    break;
    }



break;
}


function OneWireShutter($ins, $dir, $sec) {
   @TMEX_F29_SetStrobe($ins, True);
   $res = ($dir * 128) + ($sec / 1000);
   @TMEX_F29_SetPort((integer)$ins, (integer)$res);
}

function TimerDelay($id, $time, $bus) {
    global $IPS_SELF;
    $sekunden=intval(substr($time, 0,-3));
   $msekunden=substr($time, -3, 3);
   $timerid = IPS_GetObjectIDByName($bus.$id, $IPS_SELF);
    if ($timerid ==0)
    {
    $newtimer = IPS_CreateEvent(1);
   IPS_SetEventScript($newtimer, $IPS_SELF); //Aktuelles Skript aufrufen
   IPS_SetName($newtimer, $bus.$id);
   IPS_Sleep(intval($msekunden));
   IPS_SetEventCyclic($newtimer, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($newtimer, 0, 0);
    IPS_SetEventCyclicTimeBounds($newtimer, time(), 0);
    IPS_SetEventActive($newtimer, true);    //Ereignis aktivieren
   }
   else
   {
   IPS_Sleep(intval($msekunden));
   IPS_SetEventCyclic($timerid, 0, 0, 0, 0, 1, $sekunden);
    IPS_SetEventCyclicDateBounds($timerid, 0, 0);
    IPS_SetEventCyclicTimeBounds($timerid, time(), 0);
    IPS_SetEventActive($timerid, true);    //Ereignis aktivieren
   }
}

function CreateVariableByName($id, $name, $type)
{
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
     $vid = IPS_CreateVariable($type);
     IPS_SetParent($vid, $id);
     IPS_SetName($vid, $name);
     IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
   }
   return $vid;
}





?>

ich habe dafür die PTM200TX Instance erstellt. Achja, das ist nicht die Originale, sondern die Timervariante.

Super und vielen Dank, funktioniert auf Anhieb!