CUL mit IPS 4.0 auf Raspberry Pi3

  1. Progammier-Skript anlegen. Auch hier wieder die richtige ID der Regvar eintragen. Die Adresse muss erst vor dem Einlernen der RTS-Empfänger angepasst werden.
############Somfy_prog_skript#################################

/*
Y<func>
Somfy RTS/Simu Hz (R) mode. <func> is one of:
t<dez>
Sets the time in us (microseconds) for a single symbol
Typical values are: 1200-1300
Default: 1240 (According to the patent it should be 1208, but this works better)
r<dez>
Sets the number of repetitions of a Somfy RTS frame. If the receiver is far away from the sender, increasing this number may help reception.
Default: 6
s = Send out a Somfy command. <hex> is a hex string of the following form: KKC0RRRRAAAAAA
KK - Encryption key														   A4290434060000
C - Command (1 = My, 2 = Up, 4 = Down, 8 = Prog)
0 - Checksum (set to 0, is calculated automatically)
RRRR - Rolling code
AAAAAA - Address (= remote channel)
*/


#######Parameter#####
###Edit###
$Adress='000126';#AAAAAA - Address (= remote channel)
###Edit###


$reg=55121 /*[CUL\Register Variable]*/;
$symbolwidth = 1240;    # Default Somfy frame symbol width
$repetition = 6;	# Default Somfy frame repeat counter
$somfy_updateFreq = 3;	# Interval for State update
$enckey='A1';#KK - Encryption next use A2
$rollingcode='0001';#RRRR - Rolling code


############################################

	## Set symbol length	--> Init

	$message = "t" . $symbolwidth;
#   RegVar_SendText($reg,"Y".$message."
");

	## Set frame repetition --> Init

	$message = "r" . $repetition;
#	RegVar_SendText($reg,"Y".$message."
");


	$command=8;


	# message looks like this
	# Ys_key_ctrl_cks_rollcode_a0_a1_a2
	# Ys ad 20 0ae3 a2 98 42
   $Swapped_Adress=$Adress[4].$Adress[5].$Adress[2].$Adress[3].$Adress[0].$Adress[1];
   #print_r($Swapped_Adress."
");
	## Gen Message
	$message = "s". $enckey.$command.'0'.$rollingcode.$Adress;
	#print_r($message."
");

	## Send Message
	RegVar_SendText($reg,"Y".$message."
");

	# increment encryption key and rolling code
   $enc_key_increment      = hexdec( $enckey );
	$rolling_code_increment = hexdec( $rollingcode );
	$new_enc_key = sprintf( "%02X", ( ++$enc_key_increment & hexdec("AF") ) );
	$new_rolling_code = sprintf( "%04X", ( ++$rolling_code_increment ) );

	# update the readings, but do not generate an event
   
   
   $VarID = IPS_CreateVariable(3);
   IPS_SetName($VarID, "Key"); // Variable benennen
   IPS_SetParent($VarID, $_IPS['SELF']); // Variable einsortieren unter dem Objekt 
   SetValue ( $VarID, $new_enc_key );
   
   $VarID = IPS_CreateVariable(3);
   IPS_SetName($VarID, "Rolling_code"); // Variable benennen
   IPS_SetParent($VarID, $_IPS['SELF']); // Variable einsortieren unter dem Objekt 
   SetValue ( $VarID, $new_rolling_code );
   
   $VarID = IPS_CreateVariable(3);
   IPS_SetName($VarID, "Address"); // Variable benennen
   IPS_SetParent($VarID, $_IPS['SELF']); // Variable einsortieren unter dem Objekt
   SetValue ( $VarID, $Adress );


?>

Jetzt sollte es, bis auf die Variablen unter der RegVar so aussehen


Wenn der CUL jetzt gesteckt ist, der richtige Port in der I/O-Instanz ausgewählt ist , der Port geöffnet ist und das Startskript ausgeführt wird , sollten die Variablen jetzt angelegt sein. Wenn das der Fall ist. ist der CUL soweit lauffähig.

  1. Fürs erste für einen Rolladen eine Shutter-Control-Instanz anlegen.
    Darunter die Variablen Key und Rolling_code (beide als String) anlegen.
    Position wird von Shutter Control selbst angelegt.

Action Skript anlegen im skript die ID des Sende-skipts eintragen. Wenn die Adresse des RTS-Antriebs bekannt ist (z.B. aus FHEM) kann diese unter Adress eingetragen werden.

<?

if($_IPS['SENDER'] != "ShutterControl")
    die("This script can only be started by the ShutterControl Module");

$Adress='000001';
$IDs=IPS_GetChildrenIDs(IPS_GetParent ( $_IPS['SELF']));

$Direction=$_IPS['DIRECTION'];
$Duration=$_IPS['DURATION'];

for ($i = 0; $i<=count($IDs)-1; $i++) {
    if (IPS_GetName ($IDs[$i])=='Key') {
    $ID_Key=$IDs[$i];
    $Key=GetValue ( $IDs[$i] );
} elseif (IPS_GetName ($IDs[$i])=='Rolling_code') {
    $ID_Rolling_Code=$IDs[$i];
    $Rolling_Code=GetValue ( $IDs[$i] );
}
}


IPS_RunScriptEx( 30978 /*[CUL\Somfy_Send]*/ ,
Array(
"Adress" => $Adress,
"ID_Key" => $ID_Key,
"Key" => $Key,
"ID_Rolling_Code" => $ID_Rolling_Code,
"Rolling_Code" => $Rolling_Code,
"Direction" => $Direction,
"Duration" => $Duration));


?>

im Shutter Control die Regvar als Sendeinstanz auswählen und das Action-Skript als Abarbeitungsskript wählen.

Wenn der aktuelle Rolling Code und der Key (z.B. aus FHEM) bekannt ist können diese in die Variablen eingetragen werden.

Wenn das alles angelegt ist sollte sich der Antrieb ansteuern lassen.
Wenn Key und Rolling code nicht bekannt ist muss der Antrieb mit dem Prog skipt neu angelernt werden.

Soo das wars mal fürs erste :smiley:

Hallo Chris,

das ist ja ein ganz schöner Brocken…:D. Ich hab’s jetzt erst gesehen, da ich grad anderweitig unterwegs bin.

Vielen Dank dafür :slight_smile:

Ich werde das mal in den kommenden Tagen ausprobieren. Dazu muss ich dann erst mal mein CUL von meiner CCU2 an den Symcon-Raspi umziehen. Es kann also ein paar Tage dauern bis ich es fertig habe. Ich melde mich dann aber auf alle Fälle wenn ich es geschafft habe (oder nicht weiterkomme:rolleyes:)

Danke und Gruß
cervicor

Hallo Chris,

ich bin gerade dabei alles einzustellen. Ich habe aber nun noch ein paar Frage.

Was ist der Unterschied zwichen Key und Adresse? (Ich habe einen Wert A00000 für den ersten Rolladen und A00001 für den zweiten)
Was trage ich denn wo ein und wo bekomme ich den andeen Wert her? Den Rolling_Code haebich auch.

Du hast geschrieben

im Shutter Control die Regvar als Sendeinstanz auswählen
meinst du hier die Variable oder das Script?

Danke für deine Hilfe.

Gruß
cervicor

Hallo,

Ich habe es geschafft, dass meine Rollladen prinzipiell funktionieren.

[ul]
[li]Ich habe Die „RegisterVariable“ als Sendeinstanz eingesetzt,
[/li][li]den Key habe ich fix auf A0 gesetzt (so war das auf der CCU auch programmiert),
[/li][li]die Adresse habe ich auch in den Scipts gefunden,
[/li][li]den Rolling Code aus der CCU habe ich noch in Hex umgerechnet
[/li][/ul]

Nun kann ich über das „Shutte Control“ die Rolladen steuern. Soweit so gut.:slight_smile:

Wenn ich aber nun den Rolladen eine Zeit nicht bediene, reagiert er nicht auf den ersten Befehl.
Ich habe herausgefunden, dass bei ersten Befehl erstmal Müll gesendet wird und so eine FEhlermeldung ausgelöst wird.


19.01.2017 18:48:13*| CUL*| MSG:? (`É?YsA01006ADA00000 is unknown) Use one of A B b C e F G h i K k L l M m N R T t U u V W X x Y Z
19.01.2017 18:48:13*| VariableManager*| [Geräte\CUL\Register Variable\AuxMessage] = ? (`É?YsA01006ADA00000 is unknown) Use one of A B b C e F G h i K k L l M m N R T t U u V W X x Y Z
19.01.2017 18:48:13*| CUL*| Err:1 MSG:? (`É?YsA01006ADA00000 is unknown) Use one of A B b C e F G h i K k L l M m N R T t U u V W X x Y Z
19.01.2017 18:48:13*| VariableManager*| [Geräte\CUL\Register Variable\Errors] = 1

Ist da noch ein Pufferspeicher nicht gelöscht oder bearbeitet?

Ich habe noch 4 Stück FHT80b in Betrieb, die sofor automatisch eingebunden wurden und auch munter ihren Status melden.
Das Problem tritt aber auch auf, wenn zwischen den Somfy-Kommandos keine FHT-Meldung empfangen wird.

Kennt jemand das Problem? Oder besser, hat jemand einen Hinweis für mich wo das Problem liegen könnte?

Danke und Gruß
cervicor

Hallo,

kannst du mal versuchen, den Befehl einfach 2x zu schicken? Ich hatte ein ähnliches Verhalten in FHEM.

Ich bin neu in Symcon und versuche mich auch gerade an der Anbindung meiner Raffstores über den CUL-Stick.
In FHEM hat das alles prima geklappt, hier kann ich auch die Adressen, Rolling Codes usw auslesen.

Ich habe das Action Skript 1:1 rauskopiert, allerdings wird es mir als fehlerhaft in Zeile 3 angezeigt.

Wo ist denn der Fehler?


<? 

if($_IPS['SENDER']*!=*"ShutterControl") 
****die("This*script*can*only*be*started*by*the*ShutterControl*Module"); 

$Adress='000001'; 
$IDs=IPS_GetChildrenIDs(IPS_GetParent*(*$_IPS['SELF'])); 

$Direction=$_IPS['DIRECTION']; 
$Duration=$_IPS['DURATION']; 

for*($i*=*0;*$i<=count($IDs)-1;*$i++)*{ 
****if*(IPS_GetName*($IDs[$i])=='Key')*{ 
****$ID_Key=$IDs[$i]; 
****$Key=GetValue*(*$IDs[$i]*); 
}*elseif*(IPS_GetName*($IDs[$i])=='Rolling_code')*{ 
****$ID_Rolling_Code=$IDs[$i]; 
****$Rolling_Code=GetValue*(*$IDs[$i]*); 
} 
} 


IPS_RunScriptEx(*30978*/*[CUL\Somfy_Send]*/*, 
Array( 
"Adress"*=>*$Adress, 
"ID_Key"*=>*$ID_Key, 
"Key"*=>*$Key, 
"ID_Rolling_Code"*=>*$ID_Rolling_Code, 
"Rolling_Code"*=>*$Rolling_Code, 
"Direction"*=>*$Direction, 
"Duration"*=>*$Duration)); 


?>


Die Adresse muss in Zeile 6?
Wohin mit Key und Rolling Code?

Danke!

Hat sich erledigt, irgendwo hatte sich im Send_Script ein Fehler eingeschlichen. Der geht :slight_smile: :cool:

Hab jetzt aber doch noch ein Problem.

Ich kann die Raffstores grundsätzlich steuern, und habe die Einstellmöglichkeiten „Geöffnet 25 % 50 % 75 % und geschlossen“.

Erwartet hätte ich, das der Raffstore bei 50% auf die My-Position fährt, aber leider bewegt er sich wahllos immer nur ein Stück.