IPS -> terRemote , Hilfe benötigt

Moin :slight_smile:

Nachdem ich günstig an ein Samsung Galaxy Tab E gekommen bin, versuche ich mich seit gestern Abend daran eine Kommunikation zw. IPS und dem Tab hinzubekommen. Scheinbar bin ich als Android DAU etwas begriffsstutzig und benötige ein wenig Hilfe (das Tab wäre fast im Kamin gelandet) :rolleyes:

Installiert ist Tasker, terRemorte + Plugin (sollte doch fürs erste ausreichen?)

1.) Serversocket in IPS ist angelegt um auf Nachrichten vom Tab zu reagieren , (noch nicht getestet) alternativ POST Variante in Tasker über json (noch nicht erfolgreich getestet, scheinbar Denkfehler bei der config)

2.) Client Socket in IPS ist angelegt um zum Tab zu senden. Verbindung zum Tab steht auch (aktiv). Einstellungen in terRemote wie in diversen Threads beschrieben eingestellt.

Wie bekomme ich jetzt etwas über den Socket zum Tab?
Im Thread von BB wird sich größtenteils auf Eventghost bezogen, was ich aber nicht nutze. Benötige ich trotzdem diese ganze Handshake Geschichte oder kann man darauf verzichten ?
Wie würde ein einfaches Say ‚Hallo‘ Script aussehen um eine Sprachausgabe auf dem Tablet zu erzeugen? Irgenwie habe ich da gerade ein Brett vorm Kopf !?

Davon abgesehen ist in terRemote auch eine Option auf UDP zu reagieren, ich habe zwar keinen Plan wie, aber wäre das nicht auch eine einfachere Variante ?

Gruß
Jens

Moin,
wie schon per PN geschrieben habe ich leider momentan echt wenig Zeit, deshalb kann ich Dir leider nur ein paar Bröckchen hinwerfen weil ich selbst nicht mehr so ganz weiß wie ich es gemacht habe…
Ich hab ja auch nur die Richtung IPS=>Android (in meinem Falle Telefon) gebaut.
Dazu brauchst Du nur terRemote, Tasker wird dazu nicht benötigt. Auch Eventghost nicht.

Meine Socket-Konfig sieht so aus:

1.JPG

Das „sendData“-Script dort sieht so aus bei mir:

<?

 //Fügen Sie hier Ihren Skriptquellcode ein
// This Script send events to any Eventghost compatible Client via RegisterVariable -> IPS_Client_Socket
// Outgoing Events are read from "BufferToSend" Variable. This works like a send Buffer
// You should use my "SendToDroid() function to write Commands to the Buffer.

// Register variable MUST be named: "regVarDataBuffer"

// If you want to communicate with Eventghost PC please read comment near line 80

// During communication idle and Client Socket is dissabled (Gray Icon), this improved stability and prevent from mess up logging
// If Client is not reachable (Cleint Software Down) ClintSocket become Red Icon, this is cleard after first succesfull Event transfer.
// It works fine for me, but maybe your enviroment need any aditional error handling, check area around line 62

// The Script had been tested with: Eventghost for PC , Eventghost for Anroid, terRemote for Android
// rev 1.0 created by Bernhard Baptist  04.10.2012

// Change Configuration parameters if needed
$maxRetry = 5;  // retries until buffer is cleared
$socketReadyDelay = 10; //delay between retries if socket not ready
$msgDelay = 10;  // delay in sec until timeout and command re-send command

//-------------------------------------------------------------------------------------------
// Nothing to configure below this line

$Id_ClientSocket = IPS_GetParent($_IPS['SELF']);
$IDRegVar = @IPS_GetObjectIDByName("regVarDataBuffer", $Id_ClientSocket);
$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
                IPS_SetScriptTimer($IPS_SELF, $msgDelay);          //arm Timer for retry if Fail

    break;

    Case "TimerEvent":
        IPS_SetScriptTimer($IPS_SELF, 0);                          //stop Timer
        $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 "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){                           // check if Payload should be added
                     $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 event is sent
                    }
                 else {
                     RegVar_SendText($IDRegVar,$data_to_send."
\r");  //here the event is sent
                    }
             RegVar_SendText($IDRegVar, "close
\r");
// Eventghost PC does not send "close" so we cannot do proper handshake
// Remark next three lines in case your Client is Eventghost PC
// unremark this line: //    sleep(1);

             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);
            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:                                                                   // send Hash ti initiate handshake
            $data .= ":";
             $hash = md5($data);
             $hash .= "
";
         RegVar_SendText($IDRegVar, $hash);
        Break;
        }

}


// common helper Function
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;

}
?>

Dann gibt es ein Script, dass von einem beliebigen Event getriggert wird:

<?
include_once "42551.ips.php";
 //Fügen Sie hier Ihren Skriptquellcode ein
//CSCK_SendText(35650 /*[Client Socket - Grandstream Telefon CK]*/, "Beliebiger Datensatz"); //Sendet den Text "Beliebiger Datensatz" auf dem Client Socket mit der ID 12345
$CK_Telefon = 35650 /*[Client Socket - Grandstream Telefon CK]*/;

SendtoDroid($CK_Telefon,"Say,Bewegung vor der Haustuer erkannt");
?>

Das Script das in obigem Script included wird ist das Folgende:

<?

 //Fügen Sie hier Ihren Skriptquellcode ein
// Call this function to add new command to ClientSocket message queue
// Args[$IDBuffer = ID of ClientSocket] [$new... command to be send]
function SendtoDroid($Id_ClientSocket,$new) {


$IDBuffer = @IPS_GetObjectIDByName("BufferToSend", $Id_ClientSocket);
$IDSendScript = @IPS_GetObjectIDByName("sendData", $Id_ClientSocket);


$maxQueueLenght = 10;  // max Commands in Queue
$old = GetValueString($IDBuffer);
// cleanup queue if too much commands pending
if (substr_count ($old,"_+_") >  $maxQueueLenght) {
   $old ='nothing to send';    //todo: add error processing if required
     }
if ($old == 'nothing to send') {
   SetValue($IDBuffer,$new."_+_");
  IPS_RunScript($IDSendScript);
    }
    else {
    SetValue($IDBuffer,$old.$new."_+_");
    }
}
?>

Ich glaube das ist „schon“ alles, damit IPS an das Android sendet.
Auf Android-Seite muss das terRemote entsprechend konfiguriert sein damit es auf Nachrichten reagiert - da kann ich gerade nicht gucken weil meine Frau telefoniert. :rolleyes:

Vlt. kommst Du damit ja schon einen Schritt weiter…
VG, Hocky

Danke Dir für die Antwort, damit kann ich erst mal spielen. Scheint das gleiche zu sein wie bei BB im Thread und ist wohl auch von da und muss dann wohl auch so benutzt werden (bezgl. Handshake).

Ein kleines Problem hätte ich dann noch … die Registervariable kann man ja nicht mehr zum Socket schieben und auch nicht direkt dort erstellen, wie bekommt Ihr das hin das die RegVar direkt darunter ist ??

Gruß
Jens

Strg + X
Verschiebt Objekt mit Strg + V

Sollte noch funktionieren.

Sonst eben kurz ein Script mit IPS_SetParent erstellen.
Michael

Danke für den Hinweis, das mit den Tastenbefehlen kannte ich noch gar nicht :eek:
Habs jetzt mit SetParent gelöst, das hat funktioniert.

Ist aber auch irgendwie nicht konsequent umgesetzt, oder? Warum kann ich die RegVar nicht da erstellen bzw. wenn ich es nicht darf/kann, warum kann ich sie dann trotzdem dahin verschieben ? Für mich irgendwie nicht logisch :confused:

So, Rückmeldung :slight_smile:

Sprachausgabe funktioniert schon mal, also bekomme ich den Rest auch irgendwie hin :):slight_smile:

Kann man bei der Sprachausgabe eigentlich andere Stimmen einstellen? Irgendwie klingt deutscher Text mit der Original Stimme „blöd“ :rolleyes:

Gruß
Jens

Ich noch mal :slight_smile:

Wenn ich Tasker auf meinem 2. Android Tablet installieren möchte, muss ich die App dann ernsthaft noch ein zweites mal kaufen ?? :eek:
Wenn ich im Playstore unter „meine Apps“ nachsehe, dann kann ich die App zwar sehen, aber nicht einfach installieren, sondern nur kaufen !?
Unter „Mein Konto“ sind mit dem anderen Tablet gekaufte Apps unter „Bestellverlauf“ zu sehen :confused:

Gruß
Jens

Macht es euch doch schwieriger als es sein muss:

Android App IPSymconVoice

Damit ist viel einfacher :wink: Nutze es bei allen Droids :smiley:

Bin noch auf 3.4…

Danke für den Hinweis, werde ich mir mal anschauen.
Ich hoffe es ist so einfach wie es sich anhört :rolleyes::smiley: