So, ich hab bei diesem Thema inzwischen etwas weitergearbeitet.
Wie schon weiter vorne erwähnt gibt es Market noch eine zweite App welche als Mittler zwischen Tasker und IPS arbeiten kann. <terRemote> bzw. das entsprechende Tasker Pluggin dazu.
Die frühen terRemote Versionen hatten noch ein paar Bugs und konnten so wie Eventghost(Android) keine Payloads an Tasker weitergeben.
Nach einigem Mailkontakt mit dem Programmierer hat er dies nun eingebaut bzw. korrigiert.
Was sind Payloads ?
Eigentlich werden von Eventghost nur „Events“ verschickt. Dieser Event löst vereinfacht gesagt am Zielsystem ein Kommando aus.
Ein Payload ist noch ein weitere Datenatz der dem Event mitgegeben wird und am Zielsystem quasi als Aufrufparameter für das Kommando dienen kann.
wozu?
Bsp: Sprachausgabe am Client:
Ohne payload muß für jeden zu sprechenden Text ein eigener dedizierer Macro/Task konfiguriert werden. Der zu sprechende Text ist also am Zielsystem hardgecodet. Hat man viele verschiedene Textvarianten ist das ein erheblicher Aufwand.
Mit payload wird der zu sprechende Text aber direkt dem Event mitgegeben. Am Client braucht man daher nur noch einen einzigen Macro/Task konfigurieren. Der kann dann alle zu sprechende Texte bedienen.
Ich hab das sendData Script von weiter vorne so angepaßt das es eine einerseits mit terRemote klarkommt, und auch Paylods verschicken kann.
Installation und das zweite notwendige Script um den Buffer zu befüllen ist bereits in Post#46 Seite 4 beschrieben.
Das Trennzeichen zwischen Event und optionalem Payload ist ein ‚,‘.
Der Aufruf von
SendtoDroid($IDBuffer,$IDsendScript,'say,Guten Morgen');
sendet den Event ‚say‘ zu terRemote.
Dieser startet in terRemote ein mit diesem Event verbundenes Macro. ( zb. Popup, Sprachausgabe, Tasker Task)
Wird in dem Macro die Variable ${payload.0} verwendet, so wird dann beim Aufruf „Guten Morgen“ eingesetzt.
<?
$Id_ClientSocket = IPS_GetParent($_IPS['SELF']);
$IDRegVar = @IPS_GetObjectIDByName("regVarDataBuffer", $Id_ClientSocket);
$maxRetry = 10; // retries until buffer is cleared, further error processing
$socketReadyDelay = 10; //delay in sec if socket not ready
$msgDelay = 5; // delay in sec until command is resent
// Nothing to configure below this line
$IDBuffer = CreateVariableByName($Id_ClientSocket, 'BufferToSend', 3);
$IDerrorCount = CreateVariableByName($Id_ClientSocket, 'errorCount', 1);
Switch ($_IPS['SENDER'])
{
Case "Execute":
// reserved for debug
//break;
Case "RunScript":
if (IPS_GetInstance($Id_ClientSocket)['InstanceStatus'] != 102) {// Check if Socket is Active
CSCK_SetOpen($Id_ClientSocket,true);
IPS_ApplyChanges($Id_ClientSocket);
if (IPS_GetInstance($Id_ClientSocket)['InstanceStatus'] != 102) {
IPS_SetScriptTimer($IPS_SELF, $socketReadyDelay); //arm Timer for retry
echo "Keine Verbindung zu ".IPS_GetName($Id_ClientSocket);
Return; // Stop in case Socket Open fail
}
}
RegVar_SendText($IDRegVar, "quintessence
\r"); // start handshake
break;
Case "WebFront":
// reserved for future use
break;
Case "TimerEvent":
IPS_SetScriptTimer($IPS_SELF, 0); //arm Timer for retry
$errorCount=GetValue($IDerrorCount);
$errorCount=$errorCount+1;
if ($errorCount < $maxRetry) {
SetValue($IDerrorCount,$errorCount);
IPS_RunScript($_IPS['SELF']);// Run next try
}
else {
SetValue($IDerrorCount,0);
SetValueString($IDBuffer,"nothing to send");
// todo: add additional error processing there
}
break;
Case "Variable":
break;
Case "RegisterVariable":
$data = $IPS_VALUE;
$data = trim($data);
Switch ($data) {
Case "accept": // ready to send data
$buffer=GetValueString($IDBuffer); //re-read in case modified meanwhile
$data_to_send= substr($buffer,0,strpos ($buffer ,"_+_"));
$posPayload = strpos ($data_to_send ,",");
if ($posPayload > 0){
$payload = "payload ".substr($data_to_send,$posPayload+1);
RegVar_SendText($IDRegVar,$payload."
"); //here the payload is sent
$data_to_send= substr($data_to_send,0,$posPayload);
RegVar_SendText($IDRegVar,$data_to_send."
\r"); //here the command is sent
}
else {
RegVar_SendText($IDRegVar,$data_to_send."
\r"); //here the data is sent
}
// terRemot does not send "close"
// IPS_SetScriptTimer($IPS_SELF, $msgDelay); //arm Timer for retry if Fail
// break;
// case "close": // data successfull send
IPS_SetScriptTimer($IPS_SELF, 0); //Send Ok, stop Timer
SetValue($IDerrorCount,0);
RegVar_SendText($IDRegVar, "close
\r"); // stop handshake --> terremote
sleep(1);
CSCK_SetOpen($Id_ClientSocket,false);
$buffer=GetValueString($IDBuffer); //re-read in case modified meanwhile
if (substr_count ($buffer,"_+_")> 1) {
$pos_next =strpos ($buffer ,"_+_");
SetValueString($IDBuffer,substr($buffer,$pos_next+3,strlen($buffer))); //update
sleep(1); // todo: find minimum delay
IPS_RunScript($_IPS['SELF']); // re-run to process next command
}
else{
SetValueString($IDBuffer,"nothing to send");
}
break;
case "declined": // any problem
// todo: add logic to recover,
CSCK_SetOpen($Id_ClientSocket,false);
IPS_SetScriptTimer($IPS_SELF, 1); //arm Timer for retry
break;
Default: // handshake
$data .= ":";
$hash = md5($data);
$hash .= "
";
RegVar_SendText($IDRegVar, $hash);
Break;
}
}
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;
}
?>
Nach dem gleiche Prinzip kann man sich auch Daten vom Droid nach IPS schicken lassen.
Passendes Script dazu hab ich grad in Erprobung.
Damit kann man dann die diversen in den Tabletts verbauten Sensoren und Systemvariablen auslesen (das besorgt wieder Tasker) und diese Daten dann mittels terRemote an IPS schicken.
Derzeit hat ist terRemote hinsichtlich des Übertragungsprotokolls noch nicht so stabil wie Eventghost(Android). Ich bin auch deßhalb mit dem Entwickler noch in Kontakt.
Wie gesagt, der Thread hier ist eher Betatest, wenns mal perfekt ist dann starte ich einen neuen.
gruß
bb