Hilfe beim Eltako FSB14 einlernen

Hallo zusammen,

ich habe jetzt schier endlos versucht, einige FSB14 in IPS einzulernen.

Mein Setup:
FAM14 mit mehreren FSB14. an jedem FSB14 hängen zwei Motoren.

Ich bin der Anleitungvon IPS gefolgt:

Geräte-ID eintragen und mit „Übernehmen“ speichern
Gerät in den Einlernmodus versetzen (siehe Herstelleranleitung)
„Einlernen“ klicken
Funktion ggf. in der Testumgebung mit An/Aus testen
„Suchen“ klicken. Das Gerät sollte 5mal An/Aus gehen
Gefundene ID auswählen und „Übernehmen“

Als Geräte-ID trage ich zum Beispiel 12 ein.
FSB 14 wird auf 10 gestellt und dann auf LRN gedreht.
Dann drücke ich in IPS Einlernen, bekomme den FSB14 jedoch nicht zu sehen.

Bin da echt ratlos und würde mich über Hilfe freuen.

P.S.: im PCT14 habe ich bereits Adressen für alle Geräte vergeben. (Siehe Bild)

Welche Instanz verwendest du? Wir haben eigentlich dafür das Eltako Shutter Modul. Damit sollte das problemlos laufen :slight_smile:

paesy

Also ich habe über Instanz hinzufügen nach dem FSB14 gesucht und gefunden.
Wie aus den Bildern ersichtlich.
Daraus habe ich die Instanz erstellt.
Es wird jedoch nach dem Klick auf Einlernen keine Rückmelde-ID erstellt und die Instanz ist nicht funktional.

instanzfsb14.JPG

Hallo micahelwsw5,

hier eine kurze Erklärung zum Thema Enocean-IDs.

Wenn dein Gateway z. B. die Base-ID FFFFFF00 hat, dann sind aus IPS heraus die Geräte-IDs dec 1-127 (0x01-0x7F) verwendbar. Eine komplette Sende-ID würde z. B. folgendermaßen aussehen: FFFFFF7B (123) Base-ID+Geräte-ID. Das wären dann die ID’s, die Du mit dem PCT14 in die Aktoren einträgst.
Für die Melde-IDs gilt der umgekehrte Weg. Also FAM14 Base-ID + Geräte-ID im Bus (siehe PCT14).

Gruß
bertel2013

Hallo michaelwsw5,

hier ist mein Skript zum senden der Fahrzeit an die FSBs. Es ist leider noch etwas „dirty“, aber es funktioniert! :slight_smile: Ich habe zu jedem Rollladen eine Integer Variable „Postion“ erstellt und das Skript als Aktion hinterlegt, siehe Screenshots.

Variable_Position.png

Im WebFront sieht es dann so aus:

Im Skript müssen noch folgende Dinge definiert werden:

  • Laufzeiten der verschiedenen Typen
  • Die ID der Register Variable ($regvar)
  • In der Funktion „Telegramm“ müssen noch die IDs ($id1-$id3) entsprechend der Gateway Base-ID eingetragen werden

Bei der Variable „$ENOID“ wird zuerst die bestehende Geräte-ID (im Aktor eingelernt als „Richtungstaster“ für normal Auf/Ab) der jeweiligen Instanz ausgelesen und dann mit 128 und 64 addiert. 128 weil meine Gateway Base-ID mit 0x80 endet. Die 64 habe ich mir überlegt um die Vergabe der IDs für „Fahrkommando mit Zeitwertübergabe von GFVS“ zu vereinfachen (also bestehende ID + 64). Ich habe also für jedes Beschattungselement in den Aktoren jeweils zwei IDs eingelernt, einmal normal als „Richtungstaster“ (Instanz Enocean EltakoSwitch) und einmal als „Fahrkommando mit Zeitwertübergabe“. Klingt kompliziert, ich hoffe du verstehst was ich meine.
Hier noch ein Screenshot meiner Instanz:

Außerdem habe ich eine Variable „Typ“, da ich verschiedene Beschattungstypen mit verschiedenen Laufzeiten habe. Die Variable wird vom Skript angelgt, es muss nur noch angepasst und das entsprechende Profil angelegt werden.

Übrigens, das Ganze basiert noch auf ESP2! Werde es irgendwann in ferner Zukunft mal auf ESP3 umstellen.:cool:

<?
/*
Skript zum Setzen der Beschattungsposition
Auslöser: Webfront - Integer Variable (Slider)
Bedingung:
19.09.2015 - Roberto Martins
*/

if($IPS_SENDER == "WebFront"){
$regvar = 12345; //Register Variable
$OldPosition = GetValue($IPS_VARIABLE); // Alte Position vor ändern feststellen
SetValue($IPS_VARIABLE, $IPS_VALUE); // Neue Position setzen
$ParentID = IPS_GetParent($IPS_VARIABLE); // Instanz-ID ermitteln
$DeviceID = IPS_GetProperty($ParentID, "DeviceID"); // Device-ID ermitteln
$ENOID = dec2hex02(128+64+$DeviceID); // Enocean Sender-ID der Instanz ermitteln (TCM-ID + 64, nur letzter Byte, für Zeitwertübergabe an FSB14)
$TypeID = CreateVariableByName($ParentID, 'Typ', "Beschattungstypen", 1, true);
$Type = GetValue($TypeID); // Rolladentyp ermitteln
$MovingID = CreateVariableByName($ParentID, 'Moving', "", 0, true);

	switch ($Type)
	{
	   case 1:
	      $SecAuf = '18'; //Zeit Typ 1 auf in Sekunden
	      $SecAb ='17'; //Zeit Typ 1 zu in Sekunden
		break;
		case 2:
	      $SecAuf = '26'; //Zeit Typ 2 auf in Sekunden
	      $SecAb ='21'; //Zeit Typ 2 zu in Sekunden
		break;
		case 3:
	      $SecAuf = '60'; //Zeit Typ 3 auf in Sekunden
	      $SecAb ='60'; //Zeit Typ 3 zu in Sekunden
		break;
	}

		if ($IPS_VALUE > $OldPosition) // Ab sonst Auf
		{
			if ($IPS_VALUE == 100)
			{
			$Fahrzeit = dec2hex02(($SecAb/100)*($IPS_VALUE - $OldPosition)+5);
			}
			else
			{
			$Fahrzeit = dec2hex02(($SecAb/100)*($IPS_VALUE - $OldPosition));
			}
		$Bewegung = "02"; //Ab
		}
  		else
		{
		   if ($OldPosition < 100)
		   {
		   $Fahrzeit = dec2hex02(($SecAuf/100)*($OldPosition - $IPS_VALUE));
		   }
		   else
		   {
			$Fahrzeit = dec2hex02(($SecAuf/100)*($OldPosition - $IPS_VALUE)+5);
			}
		$Bewegung = "01"; //Auf
		}
	$telegram = Telegramm($Fahrzeit, $Bewegung, $ENOID);
	SetValue($MovingID, true); //Moving-Variable auf true setzen wegen Positionsauswertung mit Statustelegramm
	IPS_Sleep(200);
	RegVar_SendText($regvar , $telegram);
	IPS_Sleep((hexdec($Fahrzeit)*1000)+2000);
	SetValue($MovingID, false); //Moving-Variable wieder auf false setzen
}


//  #########################  FUNKTIONEN  #########################

function Telegramm($data2, $data1, $id4)
{
//  Telegrammaufbau definieren
	$sync = "A55A";
	$header = "6B";
	$org = "07";
	$data3 = "02";
	//$data2 = "00";
	//$data1 = "00";
	$data0 = "08";
	$id1 = "FF";
	$id2 = "FF";
	$id3 = "FF";
	//$id4 = "B7";
	$status = "00";
	$checksumcalc = dec2hex04(hexdec($header) + hexdec($org) + hexdec($data3) + hexdec($data2) + hexdec($data1) + hexdec($data0) + hexdec($id1) + hexdec($id2) + hexdec($id3) + hexdec($id4) + hexdec($status));
	$checksumbytes = str_split($checksumcalc, 2);
	$checksum = $checksumbytes[1];
//  Telegramm zusammenstellen
	$telegram = Hex2Str($sync.$header.$org.$data3.$data2.$data1.$data0.$id1.$id2.$id3.$id4.$status.$checksum);
	return $telegram;
}


function Hex2Str($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

function dec2hex04($dec)
{
    return sprintf("%04X", $dec);
}

function dec2hex02($dec)
{
    return sprintf("%02X", $dec);
}

function CreateVariableByName($id, $name, $profile, $type, $hidden)
{
	$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']);
      IPS_SetHidden($vid, $hidden);
			if($profile !== "")
        		{
         	IPS_SetVariableCustomProfile($vid, $profile);
        		}
	 	}
    return $vid;
}

?>

Grüße
Roberto

Und Hier noch das Skript zum auswerten der Statustelegramme der FSB14. Das Skript hängt an der Register Variable. Einfach die IDs eurer Beschattungsinstanzen im Array eintragen und die Fahrzeiten definieren. Das Skript ist auch noch etwas „dirty“ aber es waren meine Anfänge mit IPS. Evtl. müssen noch händisch Variablen angelegt werden. Probiert es einfach aus…

<?
if ($_IPS['SENDER'] == "RegisterVariable")
{
//Definition der auszuwertenden Aktoren
//Rolladen-Typen: 1-Fenster, 2-Fenstertür, 3-Jalousie
$devices = array ("Rolladen" => array  (12345,
										12346,
										12347,
										12348,
										12349)
                 );


//  Erstelle Array Zuordnung ReturnID -> ObjektID
foreach ($devices["Rolladen"] AS $objektid) {
	$returnid = IPS_GetProperty($objektid, "ReturnID");
	$rolladenids[$returnid] = $objektid;
	}

	//  Prüfen nach Sync-Bytes "A5 5A"
	if(strpos($_IPS['VALUE'], chr(0xA5).chr(0x5A)) !== false)
   {
		//  Telegramm in Hex umwandeln
		$telegram = Str2Hex($_IPS['VALUE']);
		//  Telegramm im Bytes aufteilen
		$bytes = explode(" ", $telegram);
		//  Telegrammaufbau definieren
		$sync = "$bytes[0]$bytes[1]";
		$header = "$bytes[2]";
		$org = "$bytes[3]";
		$data3 = "$bytes[4]";
		$data2 = "$bytes[5]";
		$data1 = "$bytes[6]";
		$data0 = "$bytes[7]";
		$id = "$bytes[8]$bytes[9]$bytes[10]$bytes[11]";


//  #########################   Beschattung  #########################

	if (array_key_exists("$id", $rolladenids)){
		$ParentID = $rolladenids["$id"];
		$zustandsid = IPS_GetObjectIDByName ("Zustand", $ParentID);
		$status = IPS_GetObjectIDByName ("Status", $ParentID);
		$fahrzeitid = CreateVariableByName($ParentID, "Fahrzeit", 1, 'fahrzeit', 'Sekunden', true);
		$MyFahrzeit = (hexdec($data2) * 0.1) + (hexdec($data3) * 0.1 * 255);
		$PositionID = CreateVariableByName($ParentID, "Position", 1, 'position', '~Intensity.100', false);
		$TypeID = IPS_GetObjectIDByName("Typ", $ParentID);
		$OldPosition = GetValue($PositionID);
		$Type = GetValue($TypeID); // Rolladentyp ermitteln
		$MovingID = IPS_GetObjectIDByName("Moving", $ParentID);
		$Moving = GetValue($MovingID);

		switch ($Type){
			case 1:
			    $SecAuf = '18';
			    $SecAb ='17';
			break;
			case 2:
			    $SecAuf = '26';
			    $SecAb ='21';
			break;
			case 3:
			    $SecAuf = '60';
			    $SecAb ='60';
			break;
		}
		if($org == "05"){
			if($data3 == "01"){
				SetValue($zustandsid, "Start Auf");
			}
			if($data3 == "02"){
				SetValue($zustandsid, "Start Ab");
			}
			if($data3 == "70"){
				SetValue($zustandsid, "Endlage Oben");
				SetValue($PositionID,0);
			}
			if($data3 == "50"){
				SetValue($zustandsid, "Endlage Unten");
				SetValue($PositionID,100);
			}
		}
		if($org == "07"){
			if($data1 == "01"){
				SetValue($zustandsid, "Aufgefahren");
				SetValue($fahrzeitid, $MyFahrzeit);
				$NewPosition = $OldPosition - ($MyFahrzeit/$SecAuf*100);
				if($NewPosition < 0) $NewPosition = 0;{
                  	if($Moving === false){
						SetValue($PositionID,$NewPosition);
					}
				else{
					echo " +++ NICHTS +++";
				}
				}
			}
			if($data1 == "02"){
				SetValue($zustandsid, "Abgefahren");
				SetValue($fahrzeitid, $MyFahrzeit);
				$NewPosition = $OldPosition + ($MyFahrzeit/$SecAb*100);
				if ($NewPosition > 100) $NewPosition = 100;{
				  	if($Moving === false){
						SetValue($PositionID,$NewPosition);
					}
				else{
					echo " +++ NICHTS +++";
				}
				}
			}
		}
	}
	else{
		echo "ID nicht bekannt!";
	}


	}
}


//  #########################  Funktionen  #########################

function Str2Hex($daten)
{
    $hex = "";
     for($i=0; $i<strlen($daten); $i++)
   $hex .= sprintf("%02X ", ord($daten[$i]));
     return $hex;
}


function CreateVariableByName($id, $name, $type, $ident, $profile, $hidden)
{
    $vid = @IPS_GetObjectIDByIdent ($ident, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetIdent($vid, $ident);
        IPS_SetInfo($vid, "Created by Skript #".$_IPS['SELF']);
        IPS_SetHidden($vid, $hidden);
        
          if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

Gruß
bertel2013

Hier noch ein Template meiner Excel-Tabelle, mit dem ich meine ganzen Devices verwalte und so einen sehr guten Überblick habe. Insbesondere was IDs angeht.

IPS_Enocean_IDs_template.zip (18.6 KB)

Hallo bertel3013,

Vielen Danke erst mal für deine ausführlichen Antworten!
Ich komme wohl erst am Wochenende dazu, das zu testen, werde aber dann sicher noch einige Fragen an dich haben.

Viele Grüße

Hallo Bertel,

ich habe gerade Zeit, mich in deine Beiträge zu den Eltakos zu vertiefen.
Die Excel-Tabelle ist super, möchte ich so auch für mich übernehmen.

Spalte 1, Geräte-ID in Symcon ist klar.

Was aber sind Spalte 2 und 3 ( IPS-ID) ?

Viele Grüße