Android/Eventghost Communication Suite

So, schon mal einen Schritt weiter…

Mit deinem Skript, bzw beiden Skripten wurde nun der Timer angelegt.

Allerdings kommt jetzt dieser Fehler im Logger

IPS-Err-PHP  2016-02-19 22:46:36.017  Warning: Parameter type of InstanceID does not match
   Error in Script /usr/share/symcon/scripts/48860.ips.php on Line 46
  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
   46 in 48860.ips.php (call RegVar_SendText)

Zeile 46 ist

RegVar_SendText($IDRegVar, "quintessence
\r");             //  start handshake

mein sendData Skript ist wie erwähnt analog deinem

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

}
?>

sendtoDroid

<?
// 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."_+_");
    }
}
?>

„Testmeldung“ (Skript zum Senden)

<?
include_once "SendToDroid_include.ips.php";
// this library provides SendtoDroid() function;

$Wohnzimmer = 32907 /*[Client Socket TZM Tab1]*/;

SendtoDroid($Wohnzimmer,"Say,Bewegung im Garten erkannt");
?>

sind evtl in den letzten beiden Skripten auch noch alte Variablen??

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

Vor diesem Fehler stand nichts mehr… tritt aber nun auch nicht mehr auf

$Id_ClientSocket = IPS_GetParent($_IPS['SELF']);
$IDRegVar = @IPS_GetObjectIDByName("RegVarDataBuffer", $Id_ClientSocket);

Das Skript muss unterhalb dem Client Socket liegen. Vom Aufbau wie bei mir. Weil der holt die ID vom Parent und dann vom Objekt mit Name „RegVarDataBuffer“. Kannst auch an den beiden Stellen mal fest die richtigen ID`s eintragen. Dann bist du den Fehler auf jeden Fall los :slight_smile:

Edit: Solltest dich nicht auf den SAY-Command verlassen…schau lieber direkt ins terRemote Log. Das „Say“ klappt glaub ich nicht bei allen Tablets…

-Chris-

müsste doch so passen, oder?

der Fehler bleibt und im Event Log von terremote kommt nichts an. Müsste doch erst mal egal sein was da gesendet wird. Der Event müsste trotzdem im Log zu sehen sein denk ich?!?

Nein! > Siehe mein Screenshot und die eben kopierten Zeilen…

Falsch >>> regVarDataBuffer
Richtig >>> RegVarDataBuffer

Deshalb findet das Skript auch nichts :wink:

Aber ja, im Log vom terRemote siehste dann was :slight_smile:

-Chris-

Sorry, ich strapazier echt deine Nerven…

Wenn ich den Buffer jetzt selbst mit „nothing to send“ beschreibe und dann das Skript zum Senden starte kommt in terremote der Event an. Jedoch kommt auch dieser Fehler im Logger

IPS-Err-PHP  2016-02-19 23:50:17.586  Error: Call to undefined function CSCK_SetOpen()
   Error in Script /usr/share/symcon/scripts/48860.ips.php on Line 94
  134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
   33 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
  121 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_PhpErrorHandler)
      in IPSLogger_PhpFatalErrorHandler

wenn ich aber den Buffer nicht selber erst beschreibe funktioniert es nicht :mad:

Den CSCK Fehler kannste jetzt aber mal selbst lösen, alles vorkauen, davon lernst du ja nichts :slight_smile:
Ein Stichwort wäre glaub ich „IPS_SetProperty“. Ich hab jetzt mal Feierabend :stuck_out_tongue:

Schritt für Schritt zur Lösung arbeiten, mal ein wenig SELBST probieren und nicht wegen jedem „Furz“ fragen, dann lernt man um so mehr :wink:

-Chris-

Okay, okay! In Sachen lernen geb ich dir absolut recht… aber wenn man halt gar nicht drauf kommt was los ist wirds echt schwer.

Jetzt läufts ohne Fehler :smiley:

Wen es noch interessiert, hier der Code

 <?
// 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
       IPS_SetProperty($Id_ClientSocket, "Open", 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);
            IPS_SetProperty($Id_ClientSocket, "Open", 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,
            IPS_SetProperty($Id_ClientSocket, "Open", 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;

}
?>

Danke trotzdem nochmal, Bayaro! :slight_smile:

Immer gerne :slight_smile: Aber ein wenig selbst machen sollte man schon…wenn man immer auf die Hilfe anderer angewiesen ist, hat man auf Dauer wenig Freude an IPS :wink:

>> Ende gut…alles gut…gute Nacht :slight_smile:

Grüße,
Chris

Ich empfange seit der 4.1 nur noch das hier :

quintessence<LF><CR>

auch wenn ich vom Tablet was sende (egal was ) kommt immer nur das im debug Fenster

einer eine Idee ? kommt von einem Galaxy tab2 , das lief unter 4.0 noch alles bestens

Hallo,

ich habe ein Problem mit dem Senden von formatierten Text zum Androidgerät! Solange ich keine Zeilenumbrüche im payload habe erhalte ich das korrekte „Network Event“ in terRemote auf dem Tablet. Wenn Zeilenumbrüche in Text vorhanden sind wird als „Network Event“ der Text bis zum ersten Zeilenumbruch genommen und der payload immer nur bis zum zweiten Zeilenumbruch! Kann mir einer einen Tipp geben wo ich da eventuell etwas ändern muß damit der ganze Text als formatierter String gesendet wird?
Hintergrund ist der ich möchte das Tablet als „Whatsapp-Relais“ missbrauchen und damit Texte in eine Whatsappgruppe schicken! Unformatierter Text geht wunderbar!

MfG Tommy

Zur Info! Problem gelöst! Falls jemand das gleiche Problem hat.

Das Zauberwort heißt „Base64 kodieren und dekodieren“!! Ich sende den formatierten Text Base64 kodiert zum Tablet (terRemote) und dekodiere die Nachricht im Tasker wieder.
Danke fürs evtl. mitdenken!

Problem gelöst!

siehe hier Android/Eventghost Communication Suite - Seite 17

MfG Tommy

hab alles nach Anleitung eingerichtet.
Es läuft auch ganz gut.
Habe nur ein Problem:
Der Client Socket wird nach einem abgesetzten Befehl immer mit rotem Ausrufezeichen versehen, das dann später grau wird. Erneutes Senden geht danach trotzdem weiterhin.
Wenn ich die Schnittstelle neu starte,ist das Ausrufezeichen bis zum nächsten Befehl weg, danach wieder da :confused:

Im Meldungsfenster wird ausgeworfen: Client Socket: Fehler beim Lesen: End of file"

Marc

Hallo zusammen,

ich hab das Ganze jetzt nach Anleitung von https://www.symcon.de/forum/threads/19614-Android-Eventghost-Communication-Suite?p=283573#post283573
eingestellt. Eventghost läuft zZ in der V 0.5.0 Beta4 (V0.4.1 selbes Verhalten)

Grundsätzlich funktioniert die Verbindung. dH EG bekommt ein Senden von IPS mit und umgekehrt.

ABER
mehr als ein

quintessence<LF><CR>

empfange ich nicht (auf Beiden Seiten :confused: )
=> sende text von EG zu IPS => IPS empängt

quintessence<LF><CR>

mehr nicht
=> sende text von IPS zu EG => EG empängt

quintessence<LF><CR>

mehr nicht

irgendwie startet das Handshake nicht…

Kann mir hier irgendwer weiterhelfen?

Ich habe diese Fage auch schon vor 2 Monaten gestellt :frowning:
Habs auch nicht mehr zum laufen gebracht. Bei mir kam auch nur noch das an .

Ich glaube das lösen wir nicht mehr :frowning:

…lief es denn bei euch schon mal? Also bis auf das unschöne rote Ausrufezeichen klappt es bei mir reibungslos…

Gesendet von meinem D6603 mit Tapatalk

Schreibe gern noch mal zusammen was bei mir eingestellt ist, basiert aber letztlich auch nur auf den zusammen gesammelten Infos aus dem Thread.

Gesendet von meinem D6603 mit Tapatalk

Jo, das lief über ein Jahr sauber, erst mit 4.0 gings net mehr

Ich benutze terremote, wenn das dienlich sein könnte :wink:

Gesendet von meinem D6603 mit Tapatalk

ich bin erst mit 4.0 wieder eingestiegen, da lange kein eigenes Haus. Jetzt beginne ich wieder (V4.1 Beta) und stelle fest, dass IPS <=> EG nicht sauber zu funktionieren scheint.

Ich hab jetzt die grundsätzliche Communication mit Hilfe dieser Hilfestellung https://www.symcon.de/forum/threads/11722-Dashboard-Fernbedienung hinbekommen.

Die scripte hier bekomme ich allerdings nicht zum laufen. Wenn als, jemand, bei dem das funktioniert, seine Scripts und Baumstruktur posten könnte, wäre uns sicher geholfen.

Dank

es hat jetzt alles eine ganze Zeit gut funktioniert.
Plötzlich sagt aber trremote im Log „Can not find the server“.
An den Ports wurde nichts geeändert. Wenn ich den Debugmodus im Datemempfangs auf IPS ankucke während ich bei in terremote etwas absetze, kommt nun auch nur noch „quintessence<LF><CR>“ Was ist da los?

Senden an Android funktioniert.

Danke für eure Hilfe.