X10 Script - Aktualisierung auf IPS v2 ?

Hallo,

McFly hatte vor langer Zeit mal sein Script gepostet zur Steuerung von X10 Komponenten (link hier).

Dieses Script hat bei mir auch lange gut seinen Dienst getan. Leider haben sich auf dem Weg zu IPS v2 einige elementare Funktionen/Befehle geändert, so dass das Script bei mir nun nicht mehr läuft.

Ich versuche schon seit Tagen, die einzelnen Stellen, an denen es jetzt hakt durch die neuen Befehle zu ersetzen, komme aber nicht weiter. :confused:

Hat evtl. jemand von Euch diese Arbeit schon erfolgreich hinter sich gebracht und das X10 Script am laufen unter IPS v2 ?

Ich wäre da für jede Hilfe wirklich dankbar !!

Gruss, Daniel.

Ein verzweifeltes Hallo :slight_smile:

Ich dachte, ich versuche es nach einem weiteren Jahr einfach nochmal …

Hatte sich inzwischen vielleicht dochmal einer von Euch an der „Übersetzung“ des X10 Skripts von McFly in IPS V2 versucht und es geschafft ?

Ich hänge immer mal wieder dran, habe es aber trotzdem noch immer nicht hinbekommen, dass IPS und X10 sich verstehen.

Wäre daher für eine helfende Hand dankbar, die dieses Skript evtl. schon angepasst hat. :smiley:

Vielen Dank !

Gruss, Daniel.

Würde mich auch interessieren. Habe noch ein paar Sachen mit X10 am laufen und würde sie gerne in IPS integrieren.

Gruß
immergut

Hallo.

Ich habe das umgepfriemelt, bin aber noch nicht ganz fertig da es bei mir so ganz gut funktioniert und ich noch dringendere Dinge am System zu tun habe.
Ich kann senden, empfangen geht in 99.9% Prozent der Fälle. Ich vermute da habe ich bei der seriellen Schnittstelle noch eine Leiche im Keller.


<?

// Instanz ID der COM-Schnittstelle !!! MUSS ANGEPASST WERDEN !!!
$hCOM = 25193 /*[CM11]*/;

// Parent ID des Skiptes // HTG
$PARENT = IPS_GetParent ($IPS_SELF);

//$SCRIPT_NAME = "X10TRX";   // Hier muss der Name dieses Script eingtragen werden (Wieso gibt es eigentlich kein "IPS_GetScriptName" ?
$SCRIPT_NAME = $IPS_SELF;

//$COM_VAR = "COM.BUFFER";   // Dies ist die Variable Der Instanz von "Register Variable" (angehangen am richtigen COM-Port)
$COM_VAR = IPS_GetObjectIDByName("COM.BUFFER", $PARENT);

// Ist der Name, der im Log auftaucht. Sollte gleich bleiben
$LOG_NAME = "X10";         // Ist der Name, der im Log auftaucht. Sollte gleich bleiben

//$STATE = "X10.State";      // Intern verwendet. Sollte gleich bleiben
$STATE = IPS_GetObjectIDByName("X10.State", $PARENT);

//$FUNC = "X10.Func";        // Intern verwendet. Sollte gleich bleiben
$FUNC = IPS_GetObjectIDByName("X10.Func", $PARENT);

//$CRC = "X10.CRC";          // Intern verwendet. Sollte gleich bleiben
$CRC = IPS_GetObjectIDByName("X10.CRC", $PARENT);

//$RX_BUFFER = "X10.RX";     // Intern verwendet. Sollte gleich bleiben
$RX_BUFFER = IPS_GetObjectIDByName("X10.RX", $PARENT);

//$TX_BUFFER = "X10.TX";     // Hier schreibt der Anwender (bzw. andere Scripte) die X10 Kommandos rein.
$TX_BUFFER = IPS_GetObjectIDByName("X10.TX", $PARENT);

//
// STATE ist die Variable in der sich das Script merkt in welchem Kommunikationsschritt es sich befindet.
// Mögliche Werte:
// 0 -> Ruhezustand: Es wurde keine Kommunikation angestossen.
// 1 -> Das CM11 hat neue Werte, die angefordert wurden. Es werden nun die Daten vom CM11 empfangen
// 2 -> Warten auf die Checksumme eines gesendeten Befehls
// 3 -> Warten auf "Interface Ready" nach gesendetem Befehl.
//

//Tabellen für die Kommunikation
// Tabellen für die Sendedaten
$table_hcodes  = array("A" => "0110",  "B" => "1110",  "C" => "0010",  "D" => "1010",  "E" => "0001",  "F" => "1001",  "G" => "0101",  "H" => "1101",
                       "I" => "0111",  "J" => "1111",  "K" => "0011",  "L" => "1011",  "M" => "0000",  "N" => "1000",  "O" => "0100",  "P" => "1100");
$table_dcodes  = array("1" => "0110",  "2" => "1110",  "3" => "0010",  "4" => "1010",  "5" => "0001",   "6" => "1001",  "7" => "0101",  "8" => "1101",
                       "9" => "0111",  "10" => "1111", "11" => "0011", "12" => "1011", "13" => "0000",  "14" => "1000", "15" => "0100", "16" => "1100",
                       "A" => "1111",  "B" => "0011",  "C" => "1011",  "D" => "0000",  "E" => "1000",  "F" => "0100",  "G" => "1100");
$table_fcodes  = array("ON" => "0010",  "OFF" => "0011",  "DIM" => "0100",  "BRIGHT" => "0101",  "ALL_LIGHTS_ON" => "0001",  "ALL_LIGHTS_OFF" => "0000",
                       "ALL_OFF" => "0000",  "ALL_ON" => "0001",  "ON" => "0010",  "OFF" => "0011", "DIM" => "0100", "BRIGHT" => "0101",
                       -10 => "0100", -20 => "0100", -30 => "0100", -40 => "0100",
                       -15 => "0100", -25 => "0100", -35 => "0100", -45 => "0100", -5 => "0100",
                       -50 => "0100", -60 => "0100", -70 => "0100", -80 => "0100", -90 => "0100",
                       -55 => "0100", -65 => "0100", -75 => "0100", -85 => "0100", -95 => "0100", -100 => "0100",
                       +10 => "0101", +20 => "0101", +30 => "0101", +40 => "0101",
                       +15 => "0101", +25 => "0101", +35 => "0101", +45 => "0101", +5 => "0101",
                       +50 => "0101", +60 => "0101", +70 => "0101", +80 => "0101", +90 => "0101",
                       +55 => "0101", +65 => "0101", +75 => "0101", +85 => "0101", +95 => "0101", +100 => "0101",
                       "ALL_LIGHTS_OFF" =>  "0110", "EXT_CODE" => "0111", "HAIL_REQUEST" => "1000", "HAIL_ACK" => "1001",
                       "PRESET_DIM1" => "1010", "PRESET_DIM2" => "1011", "EXT_DATA_TRANSFER" => "1100",
                       "STATUS_ON" => "1101", "STATUS_OFF" => "1110", "STATUS" => "1111");


// Tabellen für die Empfangsdaten
$table_hcodes2 = array("0110" => "A",  "1110" => "B",  "0010" => "C", "1010" => "D",  "0001"=> "E", "1001" => "F", "0101" => "G", "1101" => "H",
                       "0111" => "I",  "1111" => "J", "0011" => "K", "1011" => "L",  "0000" => "M", "1000" => "N",  "0100" => "O",  "1100" => "P");
$table_dcodes2 = array("0110" => "1",  "1110" => "2",  "0010" => "3", "1010" => "4", "0001" => "5", "1001" => "6", "0101" => "7", "1101" => "8",
                       "0111" => "9", "1111" => "A", "0011" => "B", "1011" => "C", "0000" => "D", "1000" => "E", "0100" => "F", "1100" => "G");
$table_fcodes2 = array("0010" => "ON", "0011" => "OFF", "0100" => "DIM", "0101" => "BRIGHT", "0001" => "ALL_LIGHTS_ON", "0000" => "ALL_UNITS_OFF",
                       "0111" => "EXT_CODE", "1010" => "PRESET_DIM1", "1011" => "PRESET_DIM2",
                       "1101" => "STATUS_ON", "1110" => "STATUS_OFF", "1111" => "STATUS");

//
// ascii2bin konvertiert einen String in eine Bitwurst
// Wir benötigen zwar immer neu ein Zeichen, aber wer weiß wofür es gut ist ;)
//
function ascii2bin($ascii) {
     $binary = '';

     for ($i = 0; $i < strlen($ascii); $i++) {
         $byte = decbin(ord($ascii{$i}));
         $byte = str_repeat('0', 8 - strlen($byte)).$byte;
         $binary .= $byte;
     }

     return $binary;
}

//
// SetX10Var setzt eine X10 Variable entsprechend dem decodiertem Funktionscode
// Die Variablen $Data1 und $Data2 sind zusätzliche Daten für DIM und EXTENDED
//
function SetX10Var($Adress, $Function, $Data1, $Data2)
{
   $VarName = '';
   global $PARENT;           // Parent ID des Skiptes // HTG
   $tempStatus = 0;

   if(($Function == "ON") || ($Function == "STATUS_ON"))
   {
      $VarName = $Adress . ".Status";
		if(!IPS_GetObjectIDByName ($VarName, $PARENT))
      {
         $VARID = IPS_CreateVariable(1);
	      IPS_SetName($VARID, $VarName);
			IPS_SetParent($VARID, $PARENT);
//			IPS_CreateVariable($VarName, "Integer");
      }
		$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
      SetValueInteger($VARID, 100);
   }
   if(($Function == "OFF") || ($Function == "STATUS_OFF"))
   {
      $VarName = $Adress . ".Status";
		if(!IPS_GetObjectIDByName ($VarName, $PARENT))
      {
	      $VARID = IPS_CreateVariable(1);
   	   IPS_SetName($VARID, $VarName);
      	IPS_SetParent($VARID, $PARENT);
         IPS_LogMessage($LOG_NAME, $PARENT);
//       IPS_CreateVariable($VarName, "Integer");
      }
		$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
      SetValueInteger($VARID, 0);
   }
   if($Function == "DIM")
   {
      $VarName = $Adress . ".Status";
		if(!IPS_GetObjectIDByName ($VarName, $PARENT))
      {
	      $VARID = IPS_CreateVariable(1);
   	   IPS_SetName($VARID, $VarName);
      	IPS_SetParent($VARID, $PARENT);
//       IPS_CreateVariable($VarName, "Integer");
      }
		$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
      $tempStatus = GetValueInteger($VARID);  //Der alte Status wird gelesen
      $tempStatus -= (int)($Data1 / 210 * 100);  //Der alte - der % Wert des Dim-Befehls
      if($tempStatus >= 0)
         SetValueInteger($VARID, $tempStatus);   //Nur schreiben wenn >= 0
      else
         SetValueInteger($VARID, 0); //Sonst auf 0 clippen ??????????????????????????????????????????????????
   }
   if($Function == "BRIGHT")
   {
      $VarName = $Adress . ".Status";
		if(!IPS_GetObjectIDByName ($VarName, $PARENT))
      {
	      $VARID = IPS_CreateVariable(1);
   	   IPS_SetName($VARID, $VarName);
      	IPS_SetParent($VARID, $PARENT);
//       IPS_CreateVariable($VarName, "Integer");
      }
		$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
      $tempStatus = GetValueInteger($VARID);  //Der alte Status wird gelesen
      $tempStatus += (int) ($Data1 / 210 * 100);  //Der alte + der % Wert des Dim-Befehls
      if($tempStatus <= 100)
         SetValueInteger($VARID, $tempStatus);   //Nur schreiben wenn <= 100
      else
         SetValueInteger($VARID, 100); //Sonst auf 100 clippen
   }
   if($Function == "ALL_UNITS_OFF")
   {
      $Vars = IPS_GetVariables();
      foreach($Vars as $Var)
      {
			$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
         if((substr($VARID,0,1) == substr($Adress,0,1)) && (strpos($VARID, "Status") != false))
         {  //Der Hauscode stimmt über ein.
            SetValueInteger($VARID, 0);
         }
      }
   }
   if($Function == "EXT_CODE")
   {  //Hier werden erweiterte Code beahndelt und als String in die Variable geschrieben.
      $VarName = $Adress . ".EXT";
		if(!IPS_GetObjectIDByName ($VarName, $PARENT))
      {
	      $VARID = IPS_CreateVariable(3);
   	   IPS_SetName($VARID, $VarName);
      	IPS_SetParent($VARID, $PARENT);
//       IPS_CreateVariable($VarName, "String");
      }
		$VARID = IPS_GetObjectIDByName($VarName, $PARENT);
      SetValueString($VARID, chr($Data1) . chr($Data2));
   }
}

//
// GetCRC bildet eine Quersumme über einen String
// Diese Quersumme sichert die Kommunikation mit dem CM11 ab.
//
function GetCRC($Text)
{
   $CRC = 0;
   for($i=0; $i<strlen($Text);$i++)
      $CRC += ord(substr($Text,$i,1));
   $CRC = $CRC & 0xFF;
   return $CRC;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//IPS_LogMessage($LOG_NAME, "$SCRIPT_NAME wude von $IPS_SENDER aufgerufen.");
if($IPS_SENDER == "Variable")
{
   //Das Script wird über einen Variablentrigger aufgerufen
   if($IPS_VARIABLE == $COM_VAR)
   {
      //Timeouttimer löschen
      //IPS_SetScriptTimer($SCRIPT_NAME, 0);
      //Daten aus der Variable lesen
      $CM11_DATA = GetValueString($COM_VAR);
      //Das Script wird von der COM-Variable aufgerufen
      $temp = sprintf("Neue Daten empfangen (0x%02x)", ord($CM11_DATA));
      IPS_LogMessage($LOG_NAME, $temp);
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      if(GetValueInteger($STATE) == 1)  //es kommen neue Telegramme
      {
         $RX_COMANDS = array();
         $temp = sprintf("Das CM11 hat %d Bytes Daten gesendet.", strlen($CM11_DATA));
         IPS_LogMessage($LOG_NAME, $temp);
         SetValueInteger($STATE, 0);   //Status auf 0
         IPS_SetScriptTimer($SCRIPT_NAME, 0);
         $RCV_Buffer = unpack ("C*", $CM11_DATA);

         $temp = sprintf("Daten: ");
         foreach ($RCV_Buffer as $Byte)
         {
            $temp .= $Byte . " ";
         }
         IPS_LogMessage($LOG_NAME, $temp);


         $Len = array_shift($RCV_Buffer);
         if($Len == count ($RCV_Buffer))
         {
            $Mask = unpack("C*", strrev(ascii2bin(chr(array_shift($RCV_Buffer)))));

            for($i=0; $i < count($RCV_Buffer);$i++)
            {
               $BUF = explode("
", GetValueString($RX_BUFFER));
               if(chr($Mask[$i+1]) == '0')
               {  //Es wurde ein Adresscode empfangen
                  $Adr = ascii2bin(chr($RCV_Buffer[$i]));
                  $HCode = $table_hcodes2[substr($Adr, 0, 4)];
                  $DCode = $table_dcodes2[substr($Adr, 4, 4)];
                  IPS_LogMessage($LOG_NAME, "Adresse empfangen ($HCode$DCode).");
                  // Erst wenn eine Funktion ausgeführt wurde und dann eine neue Adresse kommt
                  // werden die alten Adressen gelöscht. Es könnte ja noch ein DIM/BRIGHT für die alten Adressen kommen.
                  if(GetValueBoolean($FUNC))
                     SetValueString($RX_BUFFER, "");
                  SetValueString($RX_BUFFER, GetValueString($RX_BUFFER) . $HCode . $DCode . "
");
                  SetValueBoolean($FUNC, false);
               }
               elseif(chr($Mask[$i+1]) == '1')
               {  //Es wurde ein Funktionscode empfangen
                  $Func = ascii2bin(chr($RCV_Buffer[$i]));
                  $HCode = $table_hcodes2[substr($Func, 0, 4)];
                  $FCode = $table_fcodes2[substr($Func, 4, 4)];
                  IPS_LogMessage($LOG_NAME, "Funktion empfangen ($HCode $FCode).");
                  SetValueBoolean($FUNC, true);
                  //Es wird noch geprüft, ob Funktionen empfangen wurden, die zusätzliche Daten benötigen.
                  $D1 = 0;
                  $D2 = 0;
                  if(($FCode == "DIM") || ($FCode == "BRIGHT"))
                  {
                     $i++;
                     $D1 = $RCV_Buffer[$i];
                  }
                  if($FCode == "EXT_CODE")
                  {
                     $i++;
                     $D1 = $RCV_Buffer[$i];
                     $i++;
                     $D2 = $RCV_Buffer[$i];
                  }
                  foreach($BUF as $Item)
                  {
                     if(strlen($Item)>1)
                     {
                        if(substr($Item, 0, 1) == substr($HCode[0], 0, 1))
                        {
                           SetX10Var($Item, $FCode, $D1, $D2);
                        }
                        else
                           IPS_LogMessage($LOG_NAME, "X10 Adresse " . $Item ." passt nicht zur Funktionsadresse " . $HCode . ".");
                     }
                  }
               }
            }
         }
         else
         {
            $temp = sprintf("Headerlänge und Telegrammgröße unterschiedlich (%d / %d).", $Len, count($RCV_Buffer));
            IPS_LogMessage($LOG_NAME, $temp);
         }
      }
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      elseif(GetValueInteger($STATE) == 2)
      {  //Wir warten auf die Checksumme eines gesendeten Befehls
         if(strlen(GetValueString($COM_VAR)) <= 1)
         {
            $RX_Check = (int)ord(substr(GetValueString($COM_VAR),0,1));
            $Check = GetValueInteger($CRC);
            if($RX_Check == $Check)
            {  //Checksumme ist plausibel
               COMPort_SendText($hCOM, chr(0x00));
               SetValueInteger($STATE, 3);
               IPS_SetScriptTimer($SCRIPT_NAME, 10);
               IPS_LogMessage($LOG_NAME, "Telegramm wurde erfolgreich gesendet.");
            }
            else
            {  //Checksumme passt nicht
               IPS_LogMessage($LOG_NAME, "Checksumme $RX_Check != $Check stimmt nicht.");
               SetValueInteger($STATE, 0);
               //SetValueString($TX_BUFFER, GetValueString($TX_BUFFER));  //Das Senden nochmal neu Triggern.
            }
         }
         else
         {  //Das CM11 hat mehr als ein Byte zurückgegeben. Also das ganze nochmal.
            SetValueInteger($STATE, 0);
            SetValueString($TX_BUFFER, GetValueString($TX_BUFFER));  //Das Senden nochmal neu Triggern.
         }


      }
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      elseif(GetValueInteger($STATE) == 3)
      {  //Wir warten auf "Interface ready nach einem Befehl
         if(strlen(GetValueString($COM_VAR)) <= 1)
         {
            if((int)ord(substr(GetValueString($COM_VAR),0,1)) == 0x55)
            {
               IPS_LogMessage($LOG_NAME, "Telegramm wurde im CM11 ausgeführt.");
               //Befehl aus Puffer löschen
               $TX_DATA = explode("
", GetValueString($TX_BUFFER));
               array_shift($TX_DATA);
               SetValueString($TX_BUFFER, implode("
", $TX_DATA));
               SetValueInteger($STATE, 0);
               IPS_SetScriptTimer($SCRIPT_NAME, 0);
            }
            else
            {
               $temp = sprintf("Es wurde 0x55 erwartet. Gekommen ist 0x%02x", (int)ord(substr(GetValueString($COM_VAR),0,1)));
               IPS_LogMessage($LOG_NAME, $temp);
            }
         }
         else
         {
            IPS_LogMessage($LOG_NAME, "Anwort auf \"Interface Ready\" ist zu lang.");
         }
      }
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      elseif(ord($CM11_DATA) == 0x5a) //Es liegen neue Daten im CM11 vor
      {
         //IPS_LogMessage($LOG_NAME, "es liegen neue Protokolle vor.");
         SetValueInteger($STATE, 1);   //Status auf 1 -> es werden neue Daten empfangen.
         COMPort_SendText($hCOM, chr(0xc3));  //CM11 antworten
         IPS_SetScriptTimer($SCRIPT_NAME, 1);    //Timeouttimer setzen
      }
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      elseif(ord($CM11_DATA) == 0xa5)   //Das CM11 will nach Netzausfall ein Reset haben.
      {  //Dieser Teil ist nicht getestet, da mein CM11 solche "Wünsche" noch nicht hatte.
         //Uhrzeit als Antwort senden. (Vielen Dank an die Jungs von Misterhouse)
         $Uhrzeit = getdate(time());
         $TX_BUF = chr(0x9b); //es kommt ein Uhrzeittelegramm
         $TX_BUF .= chr($Uhrzeit['seconds']);   //Sekunden eintragen
         $TX_BUF .= chr($Uhrzeit['minutes'] + (($Uhrzeit['hours'] % 2) * 60));   //Minuten eintragen (Warum auch immer für 2 Stunden)
         $TX_BUF .= chr($Uhrzeit['hours'] / 2); //Stundeneintragen (Warum auch immer /2)
         $TX_BUF .= chr($Uhrzeit['yday'] % 256);//Den Tag des Jahres total verwurschtelt eintragen
         $TX_BUF .= chr((($Uhrzeit['yday'] / 256) << 7) | (0x01 << $Uhrzeit['wday'])); // Und den Wochentag dazu odern
         $TX_BUF .= chr((0x06 << 4) | (0x07));  //Monitor Housecode ist "A" und die Flags eintragen

         /*    //Leeres Makro als Antwort senden.
         IPS_LogMessage($LOG_NAME, "CM11 fordert Makros an.");
         $TX_BUF = chr(0xfb);
         IPS_LogMessage($LOG_NAME, "Makro Startbyte gesendet.");
         COM_Port_SendText($hCOM, $TX_BUF);
         IPS_Sleep(200);
         $TX_BUF = '';
         for($i=0;$i<42;$i++)
            $TX_BUF .= chr(0x00);
         */
         SetValueInteger($CRC, GetCRC(substr($TX_BUF,1,99)));  //CRC ohne den Telegramm Kopf 0x9B
         IPS_LogMessage($LOG_NAME, "Sende CM11 reset.");
         COMPort_SendText($hCOM, $TX_BUF);
         IPS_LogMessage($LOG_NAME, "Uhrzeit an CM11 gesendet.");
         SetValueInteger($STATE, 2);
         IPS_SetScriptTimer($SCRIPT_NAME, 5);
      }
   }
   elseif(($IPS_VARIABLE == $TX_BUFFER) && (GetValueString($TX_BUFFER) != "") && (GetValueInteger($STATE) == 0))
   {  //Es liegen neue Daten zum Senden vor.
      $TX_BUF = '';  //Puffer für die Rohsendedaten
      $TX_DATA = explode("
", GetValueString($TX_BUFFER));
      //Abfangen von Leerzeilen im $TX_BUFFER
      if($TX_DATA[0] == '')
      {
         array_shift($TX_DATA);
         SetValueString($TX_BUFFER, implode("
", $TX_DATA));
      }
      if(strlen($TX_DATA[0]) <= 3)
      {  //Es wurde ein Adresscode vorgegeben
         IPS_LogMessage($LOG_NAME, "Die Adresse $TX_DATA[0] wird gesendet.");
         $TX_BUF = chr(bindec("00000100")); //Header -> Adresse
         $TX_BUF .= chr(bindec($table_hcodes[substr($TX_DATA[0],0,1)] . $table_dcodes[substr($TX_DATA[0],1,2)]));
         SetValueInteger($CRC, GetCRC($TX_BUF));
         COMPort_SendText($hCOM, $TX_BUF);
         SetValueInteger($STATE, 2);
         IPS_SetScriptTimer($SCRIPT_NAME, 1);
      }
      else
      {  //Es wurde ein Funktionscode vorgegeben
         IPS_LogMessage($LOG_NAME, "Der Befehl $TX_DATA[0] wird gesendet.");
         $COMMAND = explode(" ", $TX_DATA[0]);
         $IsDim = count($COMMAND) > 2; //Handelt es sich um eine DIM Funktion?
         $IsExt = count($COMMAND) > 3; //Handelt es sich um eine EXT Funktion?
         //Header zusammenbauen
         if(($COMMAND[1] == "DIM") || ($COMMAND[1] == "BRIGHT"))
         {  //Bei DIM oder BRIGHT müssen die Anzahl der DIMS im Header angegeben werden.
            $DIMs = $IsDim ? $COMMAND[2] : 1; //Wenn keine DIMs angegeben wurden nehmen wir einen an.
            $BitStream = substr(ascii2bin(chr($DIMs)),3,5); //Nur 5 Bits werden ausgewertet.
         }
         else
            $BitStream = "00000";   //Kein DIM Kommando. Also keine DIMs

         $BitStream .= "11" . ($IsExt ? "1":"0");  //Bei einem extended Kommando muss das letzte Bit 1 sein.
         //IPS_LogMessage($LOG_NAME, "Erstes Byte: " . $BitStream . " " . bindec($BitStream));
         $TX_BUF = chr(bindec($BitStream)); //Header -> Funktion
         $BitStream = $table_hcodes[substr($COMMAND[0],0,1)] . $table_fcodes[$COMMAND[1]];   //Zusammenbauen der Funktion
         //IPS_LogMessage($LOG_NAME, "Zweites Byte: " . $BitStream . " " . bindec($BitStream));
         $TX_BUF .= chr(bindec($BitStream));
         if($IsExt)
         {
            // Entgegen des "Interface Communication Protocol" muss nach dem Funktioncode der Device Code übertragen werden.
            // Daher ist auch kein Adresstelegramm im Vorfeld nötig. Das Gerät wird direkt in einem befehl addressiert.
            // Extended Code haben damit dieses Format: "A1 EXT_CODE 255 255"
            // Fragt nicht, wie ich das rausbekommen hab ;)
            $TX_BUF .= chr(bindec($table_dcodes[substr($COMMAND[0],1,2)]));
            $TX_BUF .= chr((int)$COMMAND[2]);
            //IPS_LogMessage($LOG_NAME, "Extended Code Byte: ");
            $TX_BUF .= chr((int)$COMMAND[3]);
         }
         COMPort_SendText($hCOM, $TX_BUF);
         SetValueInteger($STATE, 2);
         IPS_SetScriptTimer($SCRIPT_NAME, 5);
         SetValueInteger($CRC, GetCRC($TX_BUF));
      }
   }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
elseif($IPS_SENDER == "TimerEvent")
{
   //Der timeout ist abgelaufen
   IPS_LogMessage($LOG_NAME, "Timeout ist abgelaufen. $SCRIPT_NAME wird zurückgesetzt.");
   SetValueInteger($STATE, 0);   //Status auf 0
   IPS_SetScriptTimer($SCRIPT_NAME, 0);
   SetValueString($TX_BUFFER, "");
}
else
{  //Dieser Teil wird immer durchlaufen, wenn das Script über "Execute" aufgerufen wird.
   echo ("X10 Script wird initialisiert.
");

   if(!IPS_VariableExists(IPS_GetVariableID($STATE)))
   {
      $VARID = IPS_CreateVariable(1);
      IPS_SetName($VARID, $STATE);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueInteger($VARID, 0);
      echo ("Variable \"$STATE\" angelegt.
");
   }
   if(!IPS_VariableExists(IPS_GetVariableID($RX_BUFFER)))
   {
      $VARID = IPS_CreateVariable(3);
      IPS_SetName($VARID, $RX_BUFFER);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueString($VARID, "");
      echo ("Variable \"$RX_BUFFER\" angelegt.
");
   }
   if(!IPS_VariableExists(IPS_GetVariableID($TX_BUFFER)))
   {
      $VARID = IPS_CreateVariable(3);
      IPS_SetName($VARID, $TX_BUFFER);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueString($VARID, "");
      $EVENTID = IPS_CreateEvent(0);
      IPS_SetParent($EVENTID, $IPS_SELF);
		IPS_SetEventTrigger($EVENTID, 0, $VARID);
      IPS_SetEventActive($EVENTID, true);
      echo ("Variable \"$TX_BUFFER\" angelegt und Event zugeordnet.
");
   }
   if(!IPS_VariableExists(IPS_GetVariableID($FUNC)))
   {
      $VARID = IPS_CreateVariable(0);
      IPS_SetName($VARID, $FUNC);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueBoolean($VARID, false);
      echo ("Variable \"$FUNC\" angelegt.
");
   }
   if(!IPS_VariableExists(IPS_GetVariableID($CRC)))
   {
      $VARID = IPS_CreateVariable(1);
      IPS_SetName($VARID, $CRC);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueInteger($VARID, 0);
      echo ("Variable \"$CRC\" angelegt.
");
   }
   if(!IPS_VariableExists(IPS_GetVariableID($COM_VAR)))
   {
      $VARID = IPS_CreateVariable(3);
      IPS_SetName($VARID, $COM_VAR);
      IPS_SetParent($VARID, IPS_GetParent ($IPS_SELF));
      SetValueString($VARID, "");
      $EVENTID = IPS_CreateEvent(0);
      IPS_SetParent($EVENTID, $IPS_SELF);
		IPS_SetEventTrigger($EVENTID, 0, $VARID);
      IPS_SetEventActive($EVENTID, true);
      echo ("Variable \"$COM_VAR\" angelegt und Event zugeordnet.
");
   }

   echo ("X10 Script ist bereit.
");

}
?>

Wenn Bedarf besteht und ich dazu komme kann ich das gerne noch etwas „anhübschen“.

Grüsse.

Hallo Kronos,

vielen Dank ! Werde es mal ausprobieren.

Gruss, Daniel.

Huch, der Thread ist ja total an mir vorbeigegangen. :o
Da ich leider kein X10 mehr habe, kann ich da auch nicht mehr viel machen.

Sieht aber schon ganz gut aus, was Ihr hier so treibt. :stuck_out_tongue:

cu…

Hallo Zusammen,

funktioniert super ! Vielen Dank Kronos.

Gruss, Daniel.

Prima, freut mich.

Grüsse.

Hallo,

ich überlege gerade ob ich jetzt schon auf IPS wechseln soll (war eigentlich erst mit Hauskauf/-bau und Wechsel auf neue Systemen geplant).

Da das meiste bei mir derzeit mit X-10 gesteuert wird und ich das PC-Interface CM15 verwende möchte ich gerne von Euch wissen ob dieses Script auch damit funktioniert. Bei meiner Suche hier im Forum konnte ich leider keine eindeutige Antwort auf diese Frage finden.

Wäre nett wenn mir hier jemand eine kurze Info zukommen lassen könnte.

Vielen Dank.


Darklord

Hallo,

mit den Scripts funktioniert x10 bei mir „ausreichend gut“. D.h. ich kann bei mir damit x10 Komponenten zuverlässig ansteuern. Allerdings würde ich in den Scripts noch eine Reihe von Performanceverbesserungen sehen (schnellere Schaltzeiten), die ich aus Zeitmangel bisher noch nicht angegangen bin.

Das Script erlaubt auch eine begrenzte Rückmeldung bzw. Erfassung der Schaltzustände (v.a. wenn x10 von anderen - nicht IPS - Sendern geschaltet wird)… das funktioniert bei mir derzeit noch nicht.

Am besten wäre es natürlich, wenn es ein unterstütztes x10 Modul gäbe in IPS :wink: - Meine Programmierkenntnisse reichen dafür leider nicht.

Gruss, Daniel.

Hallo.

Kann zur Performance wenig sagen weil das Script (bei mir) schon deutlich schneller schaltet als meine Vorgängersoftware. Viel geht da aber wohl nicht mehr da die Datenrate von X10 relativ niedrig ist und die Sache sonst unzuverlässig wird. Kommt aber auf die verbauten Komponenten an.

Grüsse.

Hi,

danke für Eure Antworten.
Jedoch habt Ihr leider nicht meine Frage damit beantwortet.:rolleyes:

Meine Frage lautete: kann ich mit dem CM15 arbeiten oder ist zwingend das Interface CM11 notwendig?

Viele Grüße

Darklord

Hallo,

zwischenzeitlich bin ich auf IPS umgestiegen:D

Ich versuche nun seit einigen Tagen X10 einzubinden, bin aber bisher gescheitert:(

Ich gehe so vor wie es beim alten Script beschrieben wurde.

Handling:
Zunächst muss man ein neues Script anlegen (Ich hab das mit dem öffnen nicht hinbekommen). Das neue Script sollte „X10TRX“ heissen.
In dieses neue Script kopiert man nun dieses Script hinein. Nun kann man die Variablennamen noch anpassen. Man sollte sie jedoch so lassen wie sie sind.
$hCOM muss noch auf die entsprechende Instanz ID gesetzt werden.
Jetzt sollte man das Script einmal über „Execute“ ausführen. Dabei werden alle nötigen Variablen angelegt.
An die Instanz der COM-Schnittstelle muss noch „Register Variable“ gehangen werden.
Die Einstellungen für den COM-Port selbst sind:

4800,8,1,N

!!! ACHTUNG !!!
In den Eigenschaften con „Register Variable“ muss die Variable aus $COM_VAR (normalerweise „COM.BUFFER“) eingetragen werden.
Unter „Advanced Options“ muss „Overwrite Variable“ angewählt sein.
!!! ACHTUNG !!!
Jetzt sollte das Script schon funktionieren.

Telegramme empfangen:
Werden Daten vom CM11 empfangen werden automatisch die Variabeln dazu angelegt bzw. geändert.

Leider bekomme ich die Variablen nicht angelegt und das mit COM.BUFFER und COM.VAR verstehe ich auch nicht so wirklich.

Die Suche im Forum brachte mich auch nicht weiter, deshalb hoffe ich, jemand von Euch kann mir weiterhelfen.

Anbei ein Screenshots, vielleicht erkennt jemand den Fehler.

Vielen Dank für Eure Hilfe.

Gruß

Darklord

Sorry,

Bilder vergessen:

Bild#2.JPG

Du nimmst sicher die angepasste Version des Skriptes? Das sieht genau wie die Fehler aus die ich hatte als ich es mit der alten Version probiert hatte.

Hi kronos,

verwendet wird das Script von weiter oben hier im thread.
Ich denke, dass ich eher einen Fehler bei der Erstellung der Register Variable gemacht habe. Vorhin habe ich noch was dazu gefunden, komme aber erst ab morgen abend wieder dazu mich weiter damit zu befassen.

Melde mich wieder bei Erfolg oder Nichterfolg…

Danke noch.

Gruß

Darklord

Ich habe alles bis auf die COM-Instant in einem Pfad. Das war glaube ich ein muss.

Hi,

ich habe gestern diesen Beitrag gefunden und abgearbeitet:

Leider bin ich noch immer nicht weiter gekommen.

Ich habe das Problem mit der Variablen COM.BUFFER.
Bei dieser kann ich den Schreibschutz nicht aufheben, siehe Bild.

Das einzigste was ich bis jetzt erreicht habe sind die zwei Variablen 35850 und 43960. Wenn ich diese lösche werden sie innerhalb weniger Sekunden neu angelegt.

Es wäre für mich sehr hilfreich, wenn mir jemand seine Baumansicht zeigen könnte. Damit könnte ich meine weiteren Schritte kontrollieren.

Vielen Dank.

Buffer.JPG

Hallo,

ich habe nun festgestellt, dass bei mir ebenfalls das „A5“ Problem besteht.
Dabei habe ich im thread des alten Scriptes gelesen, dass man Flowcontrol auf „None“ stellen soll.
Nur finde ich keine passende Einstellung dazu?!?

Jetzt nur mal eine generelle Frage dazu:
dies und der nicht aufhebbare Schreibschutz hat ja wohl nichts mit meiner Basic-Version zu tun, oder?

Selbstverständlich habe ich die Suche verwendet, bin aber leider nicht fündig geworden.

Ich hoffe auf einige Antworten von Euch die mir weiterhelfen können…

Vielen Dank.

Darklord

Ich nochmal,

so wie ich nun gelesen habe sind Variablen in den neueren Versionen von IPS nicht mehr per Script änderbar.
Über Flowcontrol konnte ich nach wie vor nichts finden.
Kann sich hierzu bitte jemand mal äußern?

Nachdem ich die fehlenden Variablen jetzt von Hand hinzugefügt habe wurden die restlichen Variablen mit der ID der von Hand eingefügten Variablen eigenständig erstellt. Diese werden auch bei Ausführung des Scriptes aktualisiert. Befehle werden jedoch weder erkannt noch ausgeführt.

Ich bin total auf dem Holzweg wie es scheint.
Denkanstöße in die richtige Richtung Eurerseits werden mir hoffentlich weiterhelfen.

Vielen Dank für Euer Verständnis.

Gruß

Darklord