Hallo zusammen,
hiermit die Anleitung.
a) So sieht meine Strukur aus:
b) Die Sockets:
- Server Socket einrichten (z.B. Name Server Socket LCN Out) einrichten, Port 2000
- IP und Port des LCN Client Socket anpassen IP 127.0.0.1, Port 2000
(nun sende IPS alle Commandos an den Server Socket)
- Client Socket einrichten (z.B. Name Client Socket LCN In), die IP Adresse zeigt eure LCN Anbindung (in der Regel Port 4114)
Die Scripte in der LCN Kategorie an legen.
a) Script „Mxx LCN Repeat“ (Name muss so lauten)
<?php
$id_client_socket = XXXXXX;
$id_server_socket = XXXXXX;
if ($_IPS['SENDER'] == "Execute")
{
return;
}
if ( ($id_RequestStatus = @IPS_GetObjectIDByIdent('RequestStatus', $_IPS['SELF'])) == false)
{
$Name = "RequestStatus";
$Ident = "RequestStatus";
$id_RequestStatus = IPS_CreateVariable(3);
IPS_SetParent($id_RequestStatus,$_IPS['SELF']);
IPS_SetName($id_RequestStatus, $Name);
IPS_SetIdent($id_RequestStatus, $Ident);
IPS_SetVariableCustomAction($id_RequestStatus, $_IPS['SELF']);
SetValueString($id_RequestStatus, 'none');
}
$startstring = substr($_IPS['MESSAGE'], 0 ,2);
// Warten wenn der vorhergehende Befehl noch nicht verarbeitet ist
if ( ($_IPS['SENDER'] == "RunScript") and ($_IPS['SENDER_NAME'] == "Server") )
{
if ($startstring == '>M')
{
// warten darauf, das letzte Befehl des Moduls verarbeitet wurde
for ($WaitCounter = 1; ( ($WaitCounter <= 6) and ( GetValueString($id_RequestStatus) != 'none') ) ; $WaitCounter++)
{
if ($WaitCounter > 3)
{
IPS_LogMessage( IPS_GetName($_IPS['SELF']) , ' overlap ' . $WaitCounter);
}
ips_sleep(300);
}
$requesttype = substr($_IPS['MESSAGE'], 8 ,3);
switch ($requesttype)
{
case '!MW': //Messwert Anfrage
{
SetValueString($id_RequestStatus, 'Messwert');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!RE': // Sollwert Anpassung
{
SetValueString($id_RequestStatus, 'Regler');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!A1': // Ausgang schalten
{
SetValueString($id_RequestStatus, 'Ausgang 1');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!A2': // Ausgang schalten
{
SetValueString($id_RequestStatus, 'Ausgang 2');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!A3': // Ausgang schalten
{
SetValueString($id_RequestStatus, 'Ausgang 3');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!A4': // Ausgang schalten
{
SetValueString($id_RequestStatus, 'Ausgang 4');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!R8': // Relais schalten
case '!RL': // Relais schalten
{
SetValueString($id_RequestStatus, 'Relais');
$_IPS['MESSAGE'][10] = '8';
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!TS': // Taste Senden
{
SetValueString($id_RequestStatus, 'Taste');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!LA': // Lämpchen
{
SetValueString($id_RequestStatus, 'Laempchen');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
case '!SM': // Satusabfrage
{
SetValueString($id_RequestStatus, 'Statusabfrage');
//SetValueString($id_RequestCommand, $_IPS['MESSAGE']);
}
break;
default:
IPS_LogMessage('LCN_Repeat', 'Unbekannter Coammdo Typ '. $startstring . " " .$requesttype);
break;
}
// erstes Kommando senden
CSCK_SendText($id_client_socket ,$_IPS['MESSAGE'].chr(10)); // an den Client Socket LCN
for ($RepeatCounter = 1; ($RepeatCounter <= 12); $RepeatCounter++)
{
IPS_Sleep(100);
$RequestStatus = GetValueString($id_RequestStatus);
if ($RequestStatus == 'requested')
{
SetValueString($id_RequestStatus, 'none');
return;
}
else
{
//echo '.';
CSCK_SendText($id_client_socket ,$_IPS['MESSAGE'].chr(10)); // an den Client Socket LCN
}
}
IPS_LogMessage('LCN Repeat', 'Retrys aufgebraucht ' . $_IPS['SELF'] .' '. $RequestStatus );
return;
}
else
{
IPS_LogMessage('LCN_Repeat', 'Unbekannter Coammdo Typ '. $_IPS['MESSAGE'] );
}
}
if ( ($_IPS['SENDER'] == "RunScript") and ($_IPS['SENDER_NAME'] == "Client") )
{
$modulidtring = substr($_IPS['MESSAGE'], 5 ,3);
$RequestStatus = GetValueString($id_RequestStatus);
switch ( $RequestStatus )
{
case 'Messwert': // Messwertanfrage
{
//if ( ($startstring == '%M') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Messwert erhalten
if ( (substr($_IPS['MESSAGE'], 0 ,9) == '%M000' . $modulidtring . '.') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Messwert erhalten
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
// echo '? Messwert '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Regler': //Sollwert Anpassung
{
//if ( (substr($_IPS['MESSAGE'], 0 ,9) == '%M000' . $modulidtring . 'S') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Sollwert erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')// Sollwert erhalten
{
// Antwort :M00000x??255
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Regler '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Taste': //Taste wurde gesendet
{
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Taste '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Ausgang 1': //Ausgang geschaltet
{
//if ( (substr($_IPS['MESSAGE'], 0 ,10) == ':M000' . $modulidtring . 'A1') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Ausgang erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Ausgang '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Ausgang 2': //Ausgang geschaltet
{
//if ( (substr($_IPS['MESSAGE'], 0 ,10) == ':M000' . $modulidtring . 'A2') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Ausgang erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Ausgang '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Ausgang 3': //Ausgang geschaltet
{
//if ( (substr($_IPS['MESSAGE'], 0 ,10) == ':M000' . $modulidtring . 'A3') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Ausgang erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Ausgang '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Ausgang 4': //Ausgang geschaltet
{
//if ( (substr($_IPS['MESSAGE'], 0 ,10) == ':M000' . $modulidtring . 'A4') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Ausgang erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Ausgang 4'. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Relais': //Relais geschaltet
{
//if ( (substr($_IPS['MESSAGE'], 0 ,9) == ':M000' . $modulidtring . 'R') or ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') )// Relais erhalten
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!')
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Relais '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Laempchen': // Lämpchen geschaltet
{
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') //
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Lämpchen '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
case 'Statusabfrage': //Status Abfrage
{
if ($_IPS['MESSAGE'] == '-M000' . $modulidtring . '!') //
{
SetValueString($id_RequestStatus, 'requested');
}
else
{
//echo '? Statusabfrage '. $RequestStatus . " " . $_IPS['MESSAGE'];
}
}
break;
default:
//IPS_LogMessage('LCN_Repeat', 'Unbekannter Request Typ '. $_IPS['MESSAGE'] );
break;
}
SSCK_SendText($id_server_socket ,$_IPS['MESSAGE'].chr(10)); // an den Server Socket LCN
return;
}
if ($_IPS['SENDER'] == "TimerEvent")
{
return;
}
Im Script Cient Socket und Server Socket eintragen
b) Script „Konfiguriere LCN Repeat“
<?php
$parent = IPS_GetParent($_IPS['SELF']);
$script_id_repeat = IPS_GetScriptIDByName('Mxx LCN Repeat', $parent);
if (false)
{
foreach( IPS_GetChildrenIDs($_IPS['SELF']) as &$instance)
{
if ( substr( IPS_GetName($instance), 0 , 2 ) == 'M0')
{
//IPS_DeleteScript($instance, true);
}
}
foreach( IPS_GetChildrenIDs(IPS_GetParent( $_IPS['SELF'] )) as &$instance)
{
if ( IPS_GetName($instance) == 'Transfer_Tabelle')
{
//IPS_DeleteScript($instance, true);
}
}
}
if (true)
{
$objects = IPS_GetInstanceListByModuleID("{0E31FED6-E465-4621-95D4-AAF2683C41EC}");
$number_of_moduls = count($objects);
$script_transfer_tabelle = '<?php' . chr(10) . '$'. 'Transfer_Tabelle = [' .chr(10) ;
foreach( $objects as &$instance)
{
$name = IPS_GetName( $instance) ;
$int_modul_id = intval( substr($name, strlen($name) -4, 3 ), 10 ) ;
$modul_id = sprintf("%'.03d", $int_modul_id);
$Script_name = 'M' . $modul_id. ' LCN Instance ' . $instance;
if (( ($script_id = IPS_GetObjectIDByName($Script_name,$_IPS['SELF'] )) == false ) )
{
$script_id = IPS_CreateScript(0);
IPS_SetParent($script_id, $_IPS['SELF']);
IPS_SetName($script_id, $Script_name);
}
IPS_SetScriptContent($script_id,
"<?php" .chr(10)
.'$'."id_basis_skript = $script_id_repeat;" . chr(10)
."include (".'$'."id_basis_skript . '.ips.php');" );
$script_transfer_tabelle .= '[ "Modul_id" => '. $int_modul_id . ', "script_id" => ' . $script_id . ' ],'. chr(10);
}
$script_transfer_tabelle .= ' ]; '; // Transfertabelle abschliessen
if (( ($script_id = IPS_GetObjectIDByName('Transfer_Tabelle',ips_getparent($_IPS['SELF']) )) == false ) )
{
$script_id = IPS_CreateScript(0);
IPS_SetParent($script_id, ips_getparent($_IPS['SELF']));
IPS_SetName($script_id, 'Transfer_Tabelle' );
}
IPS_SetScriptContent($script_id, $script_transfer_tabelle);
}
Dieses Script ausführen.
Wenn es richtig gelaufen ist, entsteht für jedes LCN ein Script und im Verzeichnis liegt jetzt zusätzlich ein Script mit dem Namen „Transfer Tabelle“.
c) Script „Transfer Client to Modul“
<?php
$id_client_Socket = XXXXXXX;
$id_transfer_tabelle = IPS_GetScriptIDByName('Transfer_Tabelle', IPS_GetParent( $_IPS['SELF']));
include ("$id_transfer_tabelle.ips.php");
if ($_IPS['SENDER'] == 'RegisterVariable')
{
//echo $_IPS['INSTANCE'];
$string = explode(chr(0x0A),$_IPS['VALUE'] );
for ($i=0; ( $i <= (count($string) -1) ); $i++)
{
if (strlen($string[$i]) >= 3)
{
auswertung($string[$i], $_IPS['INSTANCE'], $Transfer_Tabelle, $id_client_Socket );
}
}
};
function auswertung($lcninput, $Instance, $transfer_tab, $id_client_Socket )
{
$segmentid = substr($lcninput, 1 ,4);
if ($segmentid == 'M000')
{
$Modul_id = substr($lcninput, 5, 3);
$int_Modul_id = intval($Modul_id);
$paramter = Array("MESSAGE" => $lcninput, "SENDER_NAME" => 'Server');
$ex_script_id = get_script_id($transfer_tab, $int_Modul_id);
IPS_RunScriptEx($ex_script_id, $paramter);
//IPS_RunScriptEx($transfer_tab[$int_Modul_id]['script_id'], $paramter);
return;
}
else
{
CSCK_SendText ($id_client_Socket, $lcninput.chr(10)) ;
}
}
function get_script_id($Transfer_Tabelle, $serach_Modul)
{
$instance = false;
foreach( $Transfer_Tabelle as &$index)
{
if (intval($index["Modul_id"]) == $serach_Modul)
{
$instance = $index["script_id"];
}
}
return $instance;
}
Im Script euren Client Socket eintragen
d) Script „Transfer Client to Modul“ anlegen
<?php
$Username = 'LCN USERNANEM';
$Password = 'LCN Password';
$id_client_Socket = XXXXXX;
$id_Server_Socket = XXXXXX;
$id_transfer_tabelle = IPS_GetScriptIDByName('Transfer_Tabelle', IPS_GetParent( $_IPS['SELF']));
include ("$id_transfer_tabelle.ips.php");
if ($_IPS['SENDER'] == 'RegisterVariable')
{
//echo $_IPS['INSTANCE'];
$string = explode(chr(0x0A),$_IPS['VALUE'] );
for ($i=0; ( $i <= (count($string) -1) ); $i++)
{
if (strlen($string[$i]) >= 3)
{
auswertung($string[$i], $_IPS['INSTANCE'], $Transfer_Tabelle, $id_client_Socket, $id_Server_Socket, $Username, $Password) ;
}
}
};
function auswertung($lcninput, $Instance, $transfer_tab, $id_client_Socket, $id_Server_Socket, $Username, $Password)
{
$segmentid = substr($lcninput, 1 ,4);
if ($segmentid == 'M000')
{
$Modul_id = substr($lcninput, 5, 3);
$int_Modul_id = intval($Modul_id);
$paramter = Array("MESSAGE" => $lcninput, "SENDER_NAME" => 'Client');
$ex_script_id = get_script_id($transfer_tab, $int_Modul_id);
IPS_RunScriptEx($ex_script_id, $paramter);
//IPS_RunScriptEx($transfer_tab[$int_Modul_id]['script_id'], $paramter);
return;
}
else
{
// SSCK_SendText ($id_Server_Socket, $lcninput.chr(10)) ;
if ($lcninput == 'Username:')
{
CSCK_SendText($id_client_Socket , $Username .chr(10));
}
else if ($lcninput == 'Password:')
{
CSCK_SendText($id_client_Socket , $Password .chr(10));
}
else if ((substr($lcninput, 1 , 4) == 'ping'))
{
SSCK_SendText ($id_Server_Socket, $lcninput.chr(10)) ;
}
else if ((substr($lcninput, 0 , 5) == '+M004'))
{
SSCK_SendText ($id_Server_Socket, $lcninput.chr(10)) ;
}
else
{
echo 'da ist was offen ', $lcninput;
SSCK_SendText ($id_Server_Socket, $lcninput.chr(10)) ;
}
}
}
function get_script_id($Transfer_Tabelle, $serach_Modul)
{
$instance = false;
foreach( $Transfer_Tabelle as &$index)
{
if (intval($index["Modul_id"]) == $serach_Modul)
{
$instance = $index["script_id"];
}
}
return $instance;
}
Im Script LCN User / Password, Client Socket und Server Socket eintragen.
d) Instanz Register Variable Client anlegen.
Ziel Script: „Transfer Client to Modul“
Gateway: Client Socket LCN IN
e) Instanz Register Variable Server anlegen.
Ziel Script: „Transfer Server to Modul“
Gateway: Server Socket LCN OUT
Ich hoffe nicht vergessen zu haben. Viel erfolg. Fragen immer gerne