Anbindung Android-Tabs via EventGhost (Android-Version)

Hallo bb, ich habe das mit der Erhöhung des „sleep“ Befehls getestet, das hilft nichts, ich bin zwar nicht so der Profi im Skripte interpretieren, mir scheint aber auch, das diese Zeit nicht auf den close Befehl wartet, sondern nur greift wenn der close kam und dann 1 Sekunde danach das skript erneut startet für den nächsten Befehl…

Es sieht tatsächlich so aus als ob das Android dafür verantwortlich ist, wie es Raketenschnecke beschrieben hat, es schickt einfach nicht den close Befehl, etweder er ist sofort da oder er kommt nie… (übrigens habe ich das Galaxy Tab2 mit der Version 4.0.3 und feste IP habe ich auch)

Während das Pad eingeschaltet war ist der Fehler bei ca. 30 Befehlen nicht einmal aufgetreten. Bei mir ist das dann nur im Standby ohne an den Strom angeschlossen zu sein aufgetreten. Aber bei 4 Befehlen fehlt das close mindestens einmal.

Naja, auf jedenfall kann man damit leben und es geht dank dem Skript auf jedenfall kein Befehl verlohren. Ich werde das Thema jedenfalls weiter verfolgen. Vielen Dank noch mal.

[QUOTE=helhau;173757]
Während das Pad eingeschaltet war ist der Fehler bei ca. 30 Befehlen nicht einmal aufgetreten. Bei mir ist das dann nur im Standby ohne an den Strom angeschlossen zu sein aufgetreten. Aber bei 4 Befehlen fehlt das close mindestens einmal.
QUOTE]

Verstehe, werd das mal nachstellen probieren.
Meine Tablett sind immer an. Es wird nur das Display ausgeschaltet.
Bei mir läuft im Hintergrund (auch bei ausgeschaltetem Display) das Webfront. Dieses wird immer refresht. Vieleicht „schläft“ das Tablett dadurch nicht ganz so tief.

Schau mal bei den Wlan Optionen, da gibts doch einen Schalter WLAN immer Ein.
Wobei ich mich bei den Standby Optionen von Android wirklich nicht auskenne. Da gibts wohl vermutlich so wie beim Pc auch diverse unterscheidliche Schlafmodi.

gruß
bb

Meine Tablett sind immer an. Es wird nur das Display ausgeschaltet.
Bei mir läuft im Hintergrund (auch bei ausgeschaltetem Display) das Webfront. Dieses wird immer refresht. Vieleicht „schläft“ das Tablett dadurch nicht ganz so tief.

Wie machst Du das ausschalten? Irgendwie finde ich das nicht in Tasker unter Display und auch sonst nirgends. Einschalten geht, das habe ich mit Plugins / Secure Settings hinbekommen.

Danke Dani

Haha, da hab ich jetzt ein DejaVu.

Mit dem Problem hab ich mich auch einige Zeit rumgequält, gibt hier auch irgendwo eine Thread dazu.

Zum Einschalten braucht man zwei Befehle die in einem Makro hintereinander gesendet werden.
1.) Bleibe aktiv - Modus: an Steckdose zu finden unter „DISPLAY“
2.) Ein Tasker Popup anzeigen lassen - zu finden unter ALARM
Das Tasker Popup ist wichtig, sonst geht das Display nicht an 1sec reicht

Zum Ausschalten hab ich drei Befehle:
1.) Bleibe aktiv - Modus: Nie zu finden unter „DISPLAY“
2.) 2 Sekunden Warten - zu finden unter „TASK“
3.) Display Timeout auf 10 sek zu finden unter „DISPLAY“

Displayhelligeit steht auf AUTO
WLAN steht auf IMMER AN

Geht bei mir mit:

  • 4.0.3 ODYS NEXT
  • 2.3 Samsung Galaxy S
  • 2.1 Superpad 3 ( China Tablett)

gruß
bb

So, habe mich jetzt auch ein wenig dem Script gewidmet und vermutlich das Problem bei mir gefunden.

Wenn der Socket zu ist und die Variable = „nothing to send“ dann klappt der Scriptaufruf. Debug gibt folgendes aus

debug.PNG

das Script möchte dann aber noch ein „close“ bekommen um alles korrekt abzuschliessen, dies fehlt aber anscheinend, was dann die Variable nicht zurücksetzt und den Socket nicht schliesst. Muss aber gestehen das ich EG auf dem Desktop habe zum Testen, sollte ja aber nicht daran liegen. Muss ich noch was einstellen in EG?

Gruss
Dani

Das klappt wunderbar mit der WLAN-Verbindung, vielen dank. Leider habe ich nun das Problem, das EG wohl eine WLAN Verbindung voraussetzt, meine LAN-Verbindung wird nicht akzeptiert :(. Mal schauen ob der Entwickler auf meine Mail reagiert.

Gruss
Dani

Nö, grad getestet. Am China Tablett hab ich Wlan und Lan. Es funktioniert über beide Wege.
Wäre auch unlogisch, aus Applikationssicht ist es egal ob eine TCP Verbindung über Lan oder Wlan reinkommt. Ein Anwendungsentwickler muß sich da nicht drum kümmern - zum Glück.

gruß
bb

Sehe hier keinen Unterschied ob EG zur gleichen Zeit an ist oder nicht. Sicherheitshalber abschalten kann aber nicht schaden. Ich hab die IPS<->Tablett Kommunikation auch auf einen anderen Port als 1024 gelegt. Muß auch nicht sein, fühl mich aber besser wenn ich weiß da da nicht irgendwelche automatisch erstellten Firewall Konfigurationen rumspucken können.
Das wirds aber bei dir nicht sein, denn der Hash kommt ja durch.

gruß
bb

Ach ja sorry, du hast vollkommen recht. War unkonzentriert. Während man Dienst in einer Telecon sitzt sollte man nicht privat in Foren posten :smiley: Naja das geplapper meiner Chinesen war auch nicht soo spannend.

Früher hatte ich die Wartezeit auf close hardgecodet. Jetzt läuft sie über den Timer und die msgDelay Konstante in Zeile 7.

Ich versuch nochmal das irgendwie nachzustellen.

Nö, grad getestet. Am China Tablett hab ich Wlan und Lan. Es funktioniert über beide Wege.
Wäre auch unlogisch, aus Applikationssicht ist es egal ob eine TCP Verbindung über Lan oder Wlan reinkommt. Ein Anwendungsentwickler muß sich da nicht drum kümmern - zum Glück.

Ja, hast recht. Mit Umstecken und neuem Reboot ging es, nur Umstecken reichte wohl nicht. Nun habe ich die nächste Baustelle, beim Ausschalten wird bei mir LAN deaktiviert, damit geht dann DisplayOn nicht. Gibt aber sicher auch dafür irgendwo eine Lösung.

Gruss
Dani

So, hab’s jetzt mit EG auf dem Tablet getestet, da läuft es wunderbar. Das „close“ kommt an von EG und das Programm läuft rund durch.

Anscheinend laufen da die Desktop und die Tablet-Version etwas anders. Muss mal schauen ob ich dies hinbekomme, da ich auch einen Touchscreen-PC an der Wand habe und da auch EG drauf habe.

Danke und Gruss
Dani

Servus

hab in meinem auf Seite4 geposteten Script um die Message Queue zu füllen grad einen blöden Fehler entdeckt.

// cleanup queue if too much commands pending 
if (substr_count ($old,"_+_")> $maxQueueLenght) { 
   $old =='nothing to send';    //todo: add error processing if required 
    } 

ist falsch und muß

// cleanup queue if too much commands pending 
if (substr_count ($old,"_+_")> $maxQueueLenght) { 
   $old ='nothing to send';    //todo: add error processing if required 
    } 

heisen.

sorry
bb

Hallo zusammen

Leider konnte ich kein offizielles Protokoll finden welches Eventghost(PC) zum versenden von Events benützt.
Drum hab ich heute mal mit einem Netzwerksniffer etwas reengineering betrieben.

Ergebnis: Eventghost(Android) verhält sich etwas anders als Eventghost(PC), terRemote(Android) und EGRemote(Android).

Grundsätzlich können zwar alle Applikationen miteinander Eventghost(Android) sendet aber als einziger am Ende der Kommunikation eine Bestätigungsmeldung.
Das ist einerseits gut ( die kommunikation wird so sehr stabil), andererseits schlecht da die anderen Applikationen dieses Feature (???) nicht haben.
Das Eventghost(Android) ist zzt. auch allgemein die stabilste App, leider wird sie scheinbar vom Entwickler nicht mehr betreut, da seine Webseite tot ist.

Mein Script läuft aus obigem Grund momentan auch nur mit Eventghost(Android) korrekt.

—> nicht das sich jemand wundert und unnötig Zeit vergeudet.
Werd mal sehen was man da noch machen kann.

gruß
bb

Vielen dank für die Infos.

Habe mich auch schon gewundert warum die Homepage nicht mehr erreichbar ist. Habe im Moment auch noch eine andere IPS Baustelle, dannach will ich aber da nochmals an diese IPS <-> PC Eventghost Schnittstelle.

Gruss
Dani

Hi bb,

sehr spannende Infos.
Wie schätzt du das ein: besteht eine Chance, das wenigstens eine der beiden noch aktiven Entwicklungen in Richtung IPS zu bekommen sind -sprich: Payload und Stabilität auf einen brauchbaren Stand zu bekomen?

Hi

kann dir bei interesse gerne mal die Traces der verschiedenen Apps schicken. Sind halt nur Quick&Dirty Screenshots.
Wirklich schade das Eventghost(Android) tot ist. das macht echt den besten und stabilsten Eindruck.

Ob die anderen App Entwickler Interesse haben deren Apps an unsere Stabilitätsanforderungen anzupassen ?
Hmm, ich glaub eher nicht. Die haben ja einen ganz anderen Fokus.
Überlege mal: Bei einem Marktpotential von bestenfalls 10-20 zusätzlichen Lizenzen wären das bei einem App Preis von aktuell 3.99 etwa …€.
Also dafür kann man nicht erwarten das jemand seinen Compiler anwirft. Selbst wenns nur ein paar Zeilen Code sind.

Ich bleib aber trotzdem dran, mal sehen wie es weitergeht.

gruß
bb

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

hallo bb,

das sind ja gute Nachrichten. Endlich ein Ansatz, das hier der Text der Sprachausgabe von IPS mitgegeben werden kann. Ich habe natürlich gleich das Skript angepasst läuft super durch und die beiden Befehle gehen suber raus. Allerdings muß ich am Tablet das noch einrichten heute Abend und fertig testen. Bin gespannt, das würde natürlich vieles erleichtern.

Eine Kleinigkeit ist mir in deinem Skript aufgefallen. Mit dem Befehl „CSCK_SetOpen($Id_ClientSocket,false);“ wird im Skript an 2 Stellen der Client socket geschlossen. Direkt nach dem Befehl fehlt meines erachtens das er auch tatsächlich zu ist der Befehl „IPS_ApplyChanges($Id_ClientSocket);“. Da ich nicht so der Profi bin könnte ich da auch daneben liegen, schaus dir mal an…

Also ich werde gespannt das Thema verfolgen. Hier eine stabile Verbindung zu haben wäre nicht schlecht.

Grüße und vielen Dank helhau

Servus

bin da auch noch am basteln, kann gut das irgendwo noch ein Vertippsler sitzt.

Wenns dir nur um Sprachausgabe geht, so mußt den Event nicht bis zum Tasker weiterreichen (geht aber auch wenn man will), da terRemote selbst schon das TTS ansprechen kann.
Erst ab der neuesten Revision akzeptierts nun die Payloads.

Leider ist die Doku von terRemote auch etwas dürftig. Mußte lang probieren bis ichs raus hatte. ${payload.0} ist die
Zaubervariable.

Wenn man die Events an Tasker weiterreicht, so könnte man auch mehrere Variablen mitgeben (d.h. mehrere Payloads).
sehe zzt. aber nicht wirkliche ein Verwendung dafür, darum akzeptiert meine Script auch nur eine.

viel Glück
bb

ps. jetzt fehlen noch ein paar geile Anwendungsideen für die Android<->IPS<->Android Kommunikation.
Wenn jemand mitliest schreibts mal rein, ggfl. kann ichs dann in den Scripten gleich entsprechende vorbereitungen treffen.

Hallo bb,

habe nun am Tablet getestet, das klappt wunderbar. Terremote kann nun vorlesen. Allerdings kann terremote ja nur Englisch… (oder habe ich da was übersehen), deshalb wollte ich das an Tasker weiterleiten.

Aber genau jetzt komme ich nicht mehr weiter. Wie kann ich jetzt das Payload an den Tasker weitergeben? Was muß zusätzlich im im terremote eingestellt werden, was in Tasker, damit der Text kommt?

Anwendungen fallen mir außer Sprache noch GPS Position vom Handy ein, welche in IPS dargestellt wird… irgendwas ähnliches habe ich schon mal gelesen. Aber ob das so sinnvoll ist, wenn hauptsächlich die Frau zuhause ist und ich unterwegs… :wink:
Vielleicht Bewohnerstatus anhand Handyposition bestimmen… (Anwesend/Abwesend)
Hm, die geile Anwendungsidee ist das zwar auch nicht. Aber die kommen dann schon noch… Aber Sprache ist auf jedenfall schon mal sehr gut und auch Wichtig!

Grüße helhau