Android/Eventghost Communication Suite

Hallo zusammen,

ich habe, zumindest fuer mich , einen eleganteren Weg gefunden.

Tasker kann Dateien lesen. Per SSH/SCP kopiere ich ein File nach /mnt/obb (tmpfs im ram, root erforderlich).
Das sollte aber auch mit einem FTP oder einer Samba Server App funtionieren.

Tasker prueft auf Aenderung der Datei oder dessen Attribute und fuert dementsprechend Tasks aus.
Um das Display zu steuern mache ich nur ein ‚touch /mnt/obb/on‘ bzw. ‚touch /mnt/obb/off‘
Tasker Profile/Event/File/File Attribute Change erkennt es und startet den jeweiligen Task.

Die Readline Action kann z.b. den Inhalt einer Datei lesen und dann per Sprachausgabe wiedergeben.

Gruss, Michael

Hallo bb,
dein Script ist klasse. Vielen Dank. Ich bin nur noch nicht ganz soweit es nutzen zu können :wink:

Servus Zusammen,
ich hoffe mir kann jemand helfen:

  1. beim ersten Mal kann ich eine Variable senden. Wenn ich sie danach nochmal zu EventGhost (EG) schicke, dann kommt immer nur quintessence an (siehe Bild). Woran kann das liegen?

  2. Wenn ich nun Ereignisse aus DVBViewer erhalte (siehe Bild), wie zB die RDS-Infos, wie kann ich die in EG auslesen und weiterleiten? Dafür finde ich kein Makro/ keine Funktion in EG. Das senden einer manuellen Nachricht funktioniert.

Ich will auch in die andere Richtung dann variablen übergeben (zB IDs von Radio und Fernsehprogrammen. So kann ich dann den DVBviewer komplett aus IPS steuern.

Grüße
Matthias

Servus zusammen,

zu 2.
ich weiß jetzt wie ich den payload vom DVBviewer weiterleiten kann:
Mit Plugin „Netzwerke Ereignis: Sender“ geht das so: „eg.plugins.NetworkSender.plugin.Send(„DVBViewer“, [str(eg.event.payload)])“. So leite ich den payload (=Inhalt des Events DVBViewer) an IP-Symcon weiter.
Also zB RDS-Text beim Radio hören.

Wenn ich einfach den Text "5
" ohne die Scripte an die Reg.Var. schicke, dann kommt die 5 in EventGhost an. Lasse ich mir den payload, der in EG ankommt, zeigen, dann ist das aber die IP-Adresse „[127.0.0.1]“. Was ist denn der Text, wenn er nicht der payload ist?

LÖSUNG:
Bei EventGhost scheint das was dieses Script verschickt NCIHT der payload zu sein sondern der Suffix!
http://www.dvbviewer.tv/forum/topic/52486-actionids-aus-payload-in-eventghost-auslesen-und-an-dvbviewer-senden/

Meine 1. Frage ist noch immer offen. Warum wird meine Zahl nicht verschickt sondern es kommt dieses „quintessence“ als Suffix an?

Gruß
Matthias

Hallo zusammen,

ich benötige mal etwas Unterstützung.

Die Kommunikation zwischen IPS und Terremote laufen problemlos. Jetzt möchte ich aber gerne von Terremote etwas zu IPS schicken.

Aktuell sieht es wie folgt aus:

Macro in Terremote:

  • Name: IPS_Server
  • enabled: ja
  • Events: Tasker event -lichtan
  • Aktion: Network Event (EventGhost) - lichtan
    —Event: lichtan
    —payload: das was nach IPS geschickt werden soll

wenn ich jetzt auf testen drücke empfängt IPS auch etwas:
(debug: client server)

  • RECEIVED quintessence
  • TRANSMITTED IPS_Server
  • RECEIVED 9ea8da7c9393d86ab374b93be5297d5d

und es wird eine String-Variable mit dem Namen 9ea8da7c9393d86ab374b93be5297d5d angelegt. Die Variable ist aber leer.

hat wer einen Denkanstoß für mich? ich kommt gerade absolut nicht mehr weiter.

Schöne Grüße
Stephan

Servus Stephan

hats du irgendwas am „receiveData“ Script rumgebastelt ?

Die Zahlenkolonne die du erhältst ist der hash Wert der Kommunikation. Quasi eine Art Checksumme.
Die sollte eigentlich vom Script verschluckt werden.
Als nächstes sollte dein Event also „lichtan“ empfangen werden. Der würde dann eine variable „lichtan“ anlegen.

Hab bitte Verständnis das ich wegen der vielen Updates von terremote nur mehr rudimentären Support für die Scriptsammlung leisten kann.
Siehe auch Post #1.

schöne grüße
bb

danke für dein Feedback,

die Scripte habe ich alle 1:1 aus deiner Anleitung übernommen.

Ohne mir jetzt die Scripte im Detail angesehen zu haben… was macht das Script wenn ein falscher Hash-Wert zurückgeliefert wird? Ich habe teilweise Fehlermeldungen im Log von terremote mit Verbindungsbroblemen. Die folgenden Sachen werden aber trotzdem übertragen:

  • RECEIVED quintessence
  • TRANSMITTED IPS_Server
  • RECEIVED 9ea8da7c9393d86ab374b93be5297d5d

Das bedeutet doch dass die Kommunikation eigentlich funktioniert oder?

Ich werde der Sache mal weiter auf den Grund gehen. Eine Lösung, sobald gefunden, werde ich hier natürlich veröffentlichen Vielleicht bin ich ja nicht der einzige der dieses Problem hat.

Schöne Grüße
Stephan

ok, hier eine neue Erkenntnis:

scheinbar stimmt der Hash-Wert den Terremote zurück gibt nicht mit dem von IPS erzeugten Hash-Wert überein. Wenn ich die Prüfung deaktiviere funktioniert die Kommunikation problemlos.

Hat jemand ne Idee?

Schöne Grüße
Stephan

Servus

Hmm, das ist aber merkwürdig. Die Hash Geschichte hat immer funktioniert, und klappt auch bei mir. Da hat sich noch nie was geändert.

Du kannst es für dich leicht anpassen, indem du den von terremote gelieferten Werte außm Debugfenster der Registervariable rauskopierst und dann ins Script einträgst.

Man könnte ihn natürlich auch errechnen (gibt sicher irgendwo den passenden Algorythmus dazu) der Einfachheit halber hab ich ihn hardgecodet.

gruß
bb

Hallo,

bei mir kommt auch immer die Meldung mit „quintessence“.
Wo kann ich die Hash-Prüfung deaktivieren oder ins Script einbauen?

Vielen Dank

Gerd

Hallo,

vielen Dank an Bernhard für die Scripte. das Funktioniert bei mir wunderbar.

Ich habe derzeit zwei verschiedene Tablets im Einsatz, ein Odys Noon und ein Archos 97 Platinum.
Leider finde ich bei beiden keine Möglichkeit das Display aus- und wieder ein zu schalten.

Ich habe schon alle möglichen Versuche unternommen, aber bisher ohne Erfolg.

Hat ggfs. jemand eins der Tablets und eine Lösung dazu?

Gruß
Christian

Suche mal nach Tasker.
http://http://www.ip-symcon.de/forum/threads/19782-ODYS-NEXT?p=183256#post183256

Ich habe hier mal eine Alternative zur Fernsteuerung meiner Tablets ausgearbeitet. Ist zwar noch im Aufbau, aber macht schon mal Lust auf mehr.

Bye,
Norman

Hat das Programm einer auf dem Raspery am laufen ?

Es war ein laaaaaaanges hin und her, aber jetzt macht mein Tablet endlich was es soll :slight_smile:

>>> Tablet-Display-Status wird an IPS gemeldet (an/aus), Display kann von IPS per Skript eingeschaltet werden und es wird erkannte Bewegung (durch Tablet-Front-Kamera) an IPS gemeldet (wie ein Bewegungsmelder mit 1 Min. Timeout) :cool:

Danke an alle, die hier im Thread alle für mich notwendigen Infos geposted haben!!! :slight_smile:

>> Screenshots von allem befinden sich hier: Android Tablet als Wand-Tablet einrichten (Tasker, terRemote, motion detector, …)

Grüße,
Chris

Hallo BB,

vielen Dank für Dein Script.

Ich bekomme immer in terremote den Fehler „No permission to send Tasker events“ (genau wie in #59 und #84)

Ich habe die Tipps dort auch schon umgesetzt, sogar das Android Tablet in Werkzustand zurück gesetzt und alles wieder neu installiert, aber der Fehler bleibt.

Den Author von terremote habe ich auch angeschrieben, aber noch keine Antwort bekommen.

Kann mir hier vielleicht einer weiterhelfen?

Hein09

Versuche seit ein paar Tagen die Kommunikation von IPS zum Android Tablet (terremote)herzustellen aber ich komm einfach nicht weiter… Mit Eventghost klappt die Verbindung 1a zum Tablet.

Vorab, läuft das evtl unter IPS 4.0 nicht??
Mein Problem ist dass der verdammte Timer unter „sendData“ nicht angelegt wird. Der Rest an Konfiguration passt soweit alles… Ich denke hier muss auch der Hauptgrund liegen warum bei terremote im log nichts ankommt. In der Register Variable sehe bei Debug auch nichts. Den Buffer selber zu beschreiben mit „nothing to send“ führt auch nicht zum Erfolg :frowning:

Vielleicht hat ja jemand eine Idee und könnte helfen!?!

Danke!

Kann mir hier echt keiner helfen??? :confused:

Hi!

Hab es unter IPS 4 noch nicht probiert. Aber spontan fällt mir kein Grund ein, warum das nicht funktionieren sollte. Von daher behaupte ich > es muss gehen!

Hast du dir die Bilder mal hier angeschaut, vlt. siehst du da noch eine Einstellung die nicht stimmt bei dir?!
Android Tablet als Wand-Tablet einrichten (Tasker, terRemote, motion detector, …)

Ansonsten beschreib doch mal ein wenig genauer wo es klemmt und poste ein paar Screenshots von deinen Einstellungen…

Grüße,
Chris

Hi Bayaro,

danke erst mal das du dich zu meinem Problem meldest!! Ich bin echt schon am durchdrehen mit der Geschichte :frowning:

Hier mal ein paar Screenshots


Der Client Socket ist geöffnet und zeig keinen Fehler an!
An den Skripten hab ich nichts verändert bis auf das „Sendeskript“ in dem die ID des Client Sockets geändert worden ist…

Hier noch ein Auszug vom Logger…

IPS-Err-PHP  2016-02-19 21:21:34.429  Warning: Script #0 does not exist
   Error in Script /usr/share/symcon/scripts/48860.ips.php on Line 47
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   37 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
      in IPSLogger_PhpErrorHandler
   47 in 48860.ips.php (call IPS_SetScriptTimer) IPS-Err-PHP  2016-02-19 21:21:34.719  Notice: Undefined variable: IPS_VALUE
   Error in Script /usr/share/symcon/scripts/48860.ips.php on Line 67
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   44 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
   67 in 48860.ips.php (call IPSLogger_PhpErrorHandler) IPS-Err-PHP  2016-02-19 21:21:34.787  Notice: Undefined variable: IPS_VALUE
   Error in Script /usr/share/symcon/scripts/48860.ips.php on Line 67
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   44 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
   67 in 48860.ips.php (call IPSLogger_PhpErrorHandler)

Tablet ist ein Lenove Tab2. Wie gesagt wenn ich über Eventghost vom PC an des Tablet sende geht das ohne Probleme. Die Sache kommt astrein im Log von terremote an.

Wenn du noch Daten brauchst sag bitte Bescheid!!

Danke schon mal!!

P.S. Ach ja, deine Screenshots hab ich allesamt angeschaut… aber dazu komm ich noch gar nicht wenn die Kommunikation von IPS -> terremote nicht funktioniert

Und die Moral von der Geschichte…Skript ist veraltet mit alten Systemvariablen…die müssen durch die neuen ersetzt werden:
Systemvariablen — IP-Symcon :: Automatisierungssoftware

Die Zeile mit „Script #0 does not exist“ kann ich grad nicht zuordnen :confused: Was kommt davor noch?

Und was steckt da im Skript dahinter für ein Befehl/Code? >> 48860.ips.php on Line 47

Hier mal meine überarbeitete/neue Version vom „sendData“ Skript:

<?
// 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;

}
?>

Und so sieht das bei mir aus im Objektbaum:
terremote_clientsocket.jpg

[HR][/HR]

Das hier ist dann der ServerSocket:
terremote_serversocket.jpg

Und das hier der Inhalt von meinem überarbeiteten/neuen „receiveData“ Skript:

<?
// This Script receives events fom any Eventghost compatible Client via IPS_Server_Socket -> RegisterVariable
// Incoming Events are interpreted as IPS - Variables, Payloads are interpreted their content
// This means: If a event with payload is received. Then the payload is written in the variable with the same name as event has.
//                    If a event without payload is received. Then the the Variable with the same name as the event is set to ""
//
// Payloads are interpreted as String.

// PLEASE NOTE: Only one Payload is allowed !!!

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


// Change ID to your ClientServerID
$ID_ServerSocket = 26555 /*[Tablet WZ SS]*/;

// Set to false if you want to create variables manually --> take care the variable must 100% match with event name
// IF set to true the script will create a new variable each time a new event is received first  --> less work if you have lot of events
$autoCreateVariables = true;

// Default: Variables are located below the ClientServer Instance.
// Option: Change ID to the Categorie or Instance you want to have your Variables stored
$IDInstanceVariables = 56779 /*[Hardware\Tablets\Android_13.3_WZ	erRemote_Variablen]*/; //$ID_ServerSocket;

//----------------------------------------------------------------------------------------------------------------------------------
// below here nothing to be changed
$IDRegVar = @IPS_GetObjectIDByName("regVarDataBuffer", $ID_ServerSocket);
$IDPayloadBuffer = CreateVariableByName($ID_ServerSocket, "ReceiveBuffer", 3);

$data = trim($_IPS['VALUE']);
$myID = "IPS_Server";                                     //  any random IDString
$hash = md5($myID.":");                                 //  calculate hash

Switch ($data) {

    Case "quintessence":                                    // ready to send data
       RegVar_SendText($IDRegVar, $myID."
");      // send your ID String, Client will calculate hash
    Break;

    Case $hash:
         RegVar_SendText($IDRegVar, "accept"."
");     // Confirm hash is correct and initiat data transfer
    Break;

    Default:
        if ( substr($data,0,7) == "payload") {       // check if paylod or event received
             $payload = substr($data,8);             // remove string payload
             if ($payload == "withoutRelease") {     // Eventghost PC send always with payload, but if empty the content is "withoutRelease"
                 $payload = "";
                    }
             SetValueString($IDPayloadBuffer,$payload); // write Payload to Buffer temporarly
              }
        else {                                         // we got an event
            $event = substr($data,strpos($data,"close"));     // remove "close"   <<<-- maybe to be adjusted for alternative EG Clients
            if ($autoCreateVariables == true) {
                    $IDVar = CreateVariableByName($IDInstanceVariables, $event, 3);
                    }
            else {
               $IDVar = @IPS_GetVariableIDByName($event, $IDInstanceVariables);
              }
            If ($IDVar <> Null) {
                 $payload = GetValue($IDPayloadBuffer); // fetch payload from Buffer
                      SetValueString($IDVar,$payload);       // write data to variable
                      SetValueString($IDPayloadBuffer,"");
                }
            }
    Break;
        }
// ---------------------------------------------------------------------------------------------------------------------
// Standard Function to Get VarID
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;

}
?>

Ich hab mal bewusst alles geposted, weil ich keine Ahnung mehr habe, was ich da so geändert habe oder nicht :smiley: Irgendwas war da…aber ist zu lang her :smiley:

Ich weiß noch, dass das bei mir auch nicht gleich auf Anhieb lief. Immer mal den Port vom terRemote geändert und Tablet Neustart usw usw usw…und irgendwann lief es dann :slight_smile: Glaub das terRemote wollte bei mir auch nicht als Dienst laufen oder keine Ahnung g

Schau einfach mal, was du mit den ganzen Infos so anfangen kannst, übearbeite die Skripte oder tausche sie aus und dann kannst dich ja mit neuen Fragen/Fehlern melden :slight_smile:

Grüße,
Chris