Dashboard Fernbedienung

Hallo,

kann mir keiner helfen, ich möchte Kommandos von IPS an EG schicken.

Jörg

hi,
ja, kann ich schon. Ein bisschen jedenfalls. Hast du dir die Skripte von mir mal durchgelesen und verstehtst du die auch? Ich hoffe es ist halbwegs verständlich, ich bin in Php auch Anfänger. Weil so funktioniert es (im Prinzip :wink: )

Bei mir ist das alles zwar ein reiner Versuchsaufbau, aber man kann auf jeden fall manuell Aktionen in EG auslösen.

Also, wie weit bist du?
-Scripte verstanden? Wenn nicht, wo hakts?
-Client Socket und Netzwerk-Ereigniss-Empfänger angelegt und richtig konfiguriert?
-Was sagt das Debug Fenster des Client Socket?

Ich werde versuchen dir möglichst Zeitnah weiterzuhelfen, allerdings dauert es in dem Fall bei mir auch immer etwas, ich muss auch immer wieder erst die Konfiguration und Scripte nachgucken damit ich nicht aus Versehen Blödsinn schreibe.

gruß
goran

Hallo,

Clientsocket habe ich mit Ereigniss Empfänger von EG verbunden.
Serversocket habe ich mit Ereigniss Sender von EG verbunden.

Von den Scripts habe ich folgendes übernommen:

CSCK_SendText(44147 /*[Client Socket EG]*/, "quintessence
\r");

dann:

<?
$data = $IPS_VALUE;
$data = trim($data);
if ($data != "accept")
    {$data .= ":";
     $hash = md5($data);
     $hash .= "
";
     CSCK_SendText(44147 /*[Client Socket EG]*/, $hash);};

SetValueString(56073 /*[MediaPortal\Register Variable Client Socket EG]*/, $data);
?>

Hier bekomme ich folgende Fehler:
Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\15808.ips.php on line 2

Warning: Variable #56073 existiert nicht in C:\IP-Symcon\scripts\15808.ips.php on line 10

In EG sehe ich keine Veränderung.

Jörg

Daten in $IPS_VALUE stehen nur bei direktem Trigger zur Verfügung. Du kannst das Script also nicht von Hand ausführen.
Dann ist hier

 CSCK_SendText(44147 /*[Client Socket EG]*/, $hash);} 

ein ; zuviel.

Die Variablen IDs hast Du an deine auch angepasst.

Hallo,

Variablen IDs???
Ich möchte eigentlich Befehle von IPS nach EG schicken.
Wie mache ich das?

Jörg

SetValueString(56073 /*[MediaPortal\Register Variable Client Socket EG]*/, $data); 

das ist für mich eine Variable.

CSCK_SendText(44147 /*[Client Socket EG]*/, "quintessence
\r");  

das ist der CLSK. dafür musst Du schon deine eigenen IDs verwenden.

Warning: Variable #56073 existiert nicht in C:\IP-Symcon\scripts\15808.ips.php on line 10

Wenn nix da wo soll er es hinschreiben.

Hallo,

bezüglich Variable, sorry war blind;
Die RegVar hab ich angepaßt und mit dem Client Socket verbunden.

das ist der CLSK. dafür musst Du schon deine eigenen IDs verwenden

Was ist ein CLSK? Die Client Socket ID ist meine.

Kannst Du mir eine kurze Schritt für Schritt Anleitung geben was ich machen muß um Befehle an EG zu senden, eventuell auch die Einstellungen von EG?

Danke
Jörg

Edit:
Jetzt hab ich folgendes geschafft:
Mit dem Script:

<?
CSCK_SendText(44147 /*[Client Socket EG]*/, "quintessence
\r");
?>

gesendet an den Client Socket, der mit dem Ereigniss Empfänger in EG verbunden ist sehe ich
TCP.quintessence [‚127.0.0.1‘] in EG.
Ich habe den Server Socket, der mit dem Ereigniss Sender in EG verbunden ist, mit der RegVar Server Socket verbunden, diese hat folgendes Zielscript :

<?
$data = $IPS_VALUE;
$data = trim($data);
if ($data != "accept")
    {$data .= ":";
     $hash = md5($data);
     $hash .= "
";
     CSCK_SendText(44147 /*[Client Socket EG]*/, $hash);};

SetValueString(27690 /*[MediaPortal\xxx]*/, $data);
?>

Eigentlich sollte sich nach meinem Verständniss jetzt die Variable xxx aktualisieren.
Leider tut sich nichts.

Bitte um Hilfe.

Jörg

So jetzt ist es soweit.
Ich hatte eine Aktualisierung der Variable und das wars.
Jetzt sehe ich in EG keinen EIngang mehr.
Ist EG irgendwie instabil?

Jörg

Also,

CLSK ist CLientSoKet.

Clsk erstellen, Host ist die IP des Rechners auf dem EG läuft. Port kann man frei wählen, bei mir 1024.
Der Clsk bekommt eine Register Variable. In dieser als „Übergeordnete Instanz“ den Clsk angeben. Ziel Skript der Register Variable ist dieses hier (genannt Verbindungsaufbau):

<?
$data = $IPS_VALUE;
$data = trim($data);
if ($data != "accept")
	{$data .= ":";
	 $hash = md5($data);
	 $hash .= "
";
	 CSCK_SendText(55308 /*[Client Socket-EventGhost]*/, $hash);};
?>

Der Netzwerk-Ereigniss-Empfänger im EG bekommt den gleichen Port (bei mir eben 1024). Kein Pw angeben.

Um die Kommunikation anzustoßen ist ein weiteres Skript notwendig (bei mir Startskript genannt):

<?
CSCK_SendText(55308 /*[Client Socket-EventGhost]*/, "quintessence
\r");
?>

So, wenn du bis jetzt alles richtig gemacht hast, kannst du im Clsk das „Debug“ Fenster öffnen.
Dann startest du das „Startskript“ und solltest es etwa so sehen können
.

NOCH siehst du in EG gar nix. Aber EG ist jetzt bereit Befehle zu empfangen. Du kannst jetzt mit dem 3. Skript (senden) befehle an EG senden:

<?
RegVar_SendText(27640 /*[Client Socket-EventGhost\Register Variable]*/,"blub
\r");
?>

Und diesen Befehl (hier bei mir halt „blub“) müsstest du auch in EG sehen und kannst damit Aktionen auslösen…

schöne grüße
goran

Hallo,

vielen Dank, bin alles noch mal durchgegangen und jetzt klappt es.
Mein Fehler war ich hatte localhost statt der IP angegeben, anscheinend war das nicht wirklich stabil.
Kannst Du mir bei EG auch weiterhelfen?
Ich möchte gerne einen Befehl mit IPS senden, z.B. „down“, dieser sollte dann in EG den Befehl Cursor Down vom Mediaportal Plugin auslösen.

Danke

Jörg

Edit: Bin ein bischen probieren hab ichs geschaftt; einfach den Befehl der von IPS gekommen ist unter der auszuführende Makro ziehen.

Hi,

danke Eurer Kommunikation bin ich nun auch endlich weiter gekommen, und zwar einen Riesenschritt: ich kann Befehle an EG schicken und auch zurück.

Allerdings klappt das noch nicht reibungslos. Vermutlich ein Verständnisproblem meinerseits.

Momentan habe ich nur noch ein Problem:

  1. wenn von EG ein Befehl an IPS geschickt wird bekomme ist diese Fehlermeldung (ich hab das Script etwas angepasst so dass ich den reinen EG-Befehl in meiner Empfangs-Variable habe):

Error in Script C:\IP-Symcon\scripts\42214.ips.php on Line 13 IPS-Wrn-PHP  2011-01-31 20:41:45.152  Notice: Use of undefined constant accept - assumed 'accept'
Error in Script C:\IP-Symcon\scripts\42214.ips.php on Line 19 IPS-Wrn-PHP  2011-01-31 20:43:30.128  Notice: Use of undefined constant cookie - assumed 'cookie'

hier das dazugehörige Script:


// Quelle: http://www.ip-symcon.de/forum/f20/dashboard-fernbedienung-11722/index2.html
#################### Konfig Ende ###############################################
$serversocket = 57167 /*[EG MePo Server Socket]*/;
$received = 26845 /*[EG MePo Server Socket\EG MePo SS RegVar\Received]*/;
$praefix = "MePo.";
#################### Konfig Ende ###############################################

// Etablieren der Kommunikation
$data = $IPS_VALUE;
if ($data == "quintessence
\r")
{
	SSCK_SendText($serversocket, cookie);
}
else
{
	if ($data == "f882a23cc28ace6fd543abc94322344e
")
	{
		SSCK_SendText($serversocket, accept);
	}
	else
	{
	   // Bearbeiten und Abspeichern des von EG empfangenen Befehlsstring
		$code = strstr($data, $praefix);      //Prüfung auf korrektes Befehls-Präfix
		if ($code != false)                //wenn "MePo" vorhanden ...
		{
			$code = str_replace("close", "", $data); // abschneiden von "close" aus dem EG-Befehls-String
			SetValueString($received, $code); //schreiben des finalen EG-Befehls in Variable zur weiteren Verwendung
		}
	}
}

kann mir hier jemand auf’s Pferd helfen?

SSCK_SendText($serversocket, 'accept'); 

so ist es richtig. Es ist ja ein String. Beim cookie das gleiche.

Hallo Rainer,

Treffer!LochindenBauchfreu

das korrekte Script:


// Quelle: http://www.ip-symcon.de/forum/f20/dashboard-fernbedienung-11722/index2.html
#################### Konfig ####################################################
$serversocket = 57167 /*[EG MePo Server Socket]*/;
$received = 26845 /*[EG MePo Server Socket\EG MePo SS RegVar\Received]*/;
$praefix = "MePo.";
#################### Konfig Ende ###############################################

// Etablieren der Kommunikation
$data = $IPS_VALUE;
if ($data == "quintessence
\r")
{
	SSCK_SendText($serversocket, 'cookie');
}
else
{
	if ($data == "f882a23cc28ace6fd543abc94322344e
")
	{
		SSCK_SendText($serversocket, 'accept');
	}
	else
	{
	   // Bearbeiten und Abspeichern des von EG empfangenen Befehlsstring
		$code = strstr($data, $praefix);      //Prüfung auf korrektes Befehls-Präfix
		if ($code != false)                //wenn "MePo." vorhanden ...
		{
		   $search = array("
", "\r", "close"); //Definition der Suchstrings (zur Entfernung)
			$code = str_replace($search, "", $data); // abschneiden der Suchstrings  aus dem EG-Befehls-String
			SetValueString($received, $code); //schreiben des finalen EG-Befehls in Variable zur weiteren Verwendung
		}
	}
}

07.02.2011 Nachtrag: Erweiterung um Entfernung Zeilenumbrüche aus String (das alte Script hat einen Zeilenumbruch mit in die Stringvariable geschrieben was zu Fehlern in der Auswertung führte)

Stimmt, du hast natürlich Recht. Komischerweise funktioniert es bei mir genau so wie ich gepostet habe:

{SSCK_SendText(42074 /*[Server Socket-EventGhost]*/, cookie);}

warum? Keine ahnung :smiley:

Was mir allerdings noch aufgefallen ist, die Variante von Raketenschnecke und mir um den empfangen Eg-Code in eine Variable zu schreiben funktioniert nicht immer. Falls die Daten vom SSCK schön nacheinander kommen und jeweils eine einzelne „Zeile“ in der Registervariable belegen funktioniert das einwandfrei.
Allerdings habe ich immer wieder den Fall das die Daten ohne Leerzeichen oder Zeilenumbruch ankommen. Und dann bekomme ich in meine Variable nur Müll geschrieben.
Hier funktioniert es:

Und hier nicht:

Meine Idee hierzu wäre jetzt, die Daten der Registervariable erst mal in den Buffer zu schreiben. Siehe hier
Und dann mit

preg_match

den Bereich zwischen „Ips_“ und „close“ auszulesen und in die Endgültige Variable zu schreiben.
Mit Codebeispielen kann ich hier allerdings erst mal nicht dienen.

grüße
goran

soja.jpg

sonicht.jpg

hi goran,

kurze Statusmeldung von mir dazu (kann mich heute nicht näher damit befassen):

bei ir funktionierts ganz gut,. bis auf eine Ausnahme:

kommen Befehle von EG als repeats in kurzer Abfolge (z.B. Volume.UP 30 Mal hintereinander) läuft IPS/ EG nach ca 20 Datensätzen auf ClientSocket-Fehler.

im Log findet man dann sowas:


02.02.2011 13:47:38.748 | 57167 | WARNING | Server Socket        | Socket Fehler [192.168.70.103] - Socket Error # 10054

Muss ich mal näher untersuchen. Habe seit gestern eine 2. Squeezebox am Start, wenn beide in Betrieb sind kann ein solcher Fehler ebenfalls vorkommen (IPS wird mit Statusmeldungen der beiden Boxen bombardiert). Das hat heute morgen mein IPS in die Knie gezwungen. Hatte aber noch keine Zeit mir das näher anzuschauen.

Hi Ihr,

ich hab mir vor ein paar Tagen einen Error-Handler für den EG-Clientsocket gebaut.

Warum?
-> IPS läuft auf einem zentralen Server, Mediaportal auf einem dedizierten PC. Wenn Mediaportal runtergefahren wird geht der Client-Socket im IPS auf Error (logisch, Client ist ja wech)

Was macht der Socket on/off/ Error-Handler?
-> ich habe im IPS eine Variable, die den Status des MePo-PC (online/offline) beinhaltet (wird per PING ermittelt). Diese Variable triggert bei Wertänderung ein Script, welches folgendes tut:

[ol][li]wenn der MePo-PC runtergefahren wird schaltet das Script den ClientSocket ab
[/li][li]wenn MePo hochgefahren wird schaltet das Script den CS ein - hierbei ist es in der Regel so, dass beim ersten Aktivieren des CS die gegenstelle im MePo-Rechner noch nicht erreichbar ist -> der CS meldet einen Fehler
[/li][li] nun setzt das Script einen Timer von 10 sec auf aktiv , nach Ablauf des Timers wird das Script erneut gestartet und aktiviert den CS erneut
[/li][li] das Ganze läuft solange bis entweder der Status vom CS ok ist (wenn MePo online) oder der CS deaktiviert wird (bei MePo offline)
[/li][/ol]

Installation:

[ul][li]Script anlegen, Code unten in das Script einkopieren
[/li][li] Variablen im Konfigbereich des Scripts anpassen
[/li][li] Ereignis anlegen: Zyklisch, Datumsmuster: keine, Zeitmuster: 10 sec
[/li][li] Ereignis anlegen (unterhalb des Scripts): bei Variablenänderung, muss auf die Variable (nicht im Screenshot zu sehen) referenzieren die den Status des Rechners mit installiertem EG enthält (bei mir MePo)
[/li][/ul]

hier das Script, unten erklärend ein Screenshot der Struktur


<?
// Quellen: http://www.ip-symcon.de/forum/f18/socketverbindung-geschlossen-verfuegungsstehungs-statusabfrage-9348/
########################## Konfig ##############################################
$socket_id = 54659 /*[EG MePo Client Socket]*/;
$Mepo_Status = getValueBoolean(43787 /*[Haussteuerung\Sensoren_Aktoren\Wohnzimmer\MePo.Raketenschnecke.loc\Status MePo (Ist)]*/);
$inst = IPS_GetInstance(54659/*[EG MePo Client Socket]*/);
$timer = 14738 /*[EG MePo Client Socket\Socket on/off/ Error-Handler\]*/;
// Socket-Status: 102 offen, 104 geschlossen
########################## Konfig Ende #########################################


if(($inst['InstanceStatus'] != 102) && ($Mepo_Status == true)) // Fehlerbehandlung wenn CS Status = Fehler und MePo = "Ein", Aktivierung 10sec-Timer
{
	//socket öffnen
	CSCK_SetOpen($socket_id,true);
	IPS_ApplyChanges($socket_id);
	IPS_SetEventActive($timer, true);
}
elseif (($inst['InstanceStatus'] == 102) && ($Mepo_Status == true))  // wenn MePo = "Ein" und Clientsocket "OK" dann Timer deaktivieren
{
	//Timer deaktivieren
   IPS_SetEventActive($timer, false);
}
elseif (($Mepo_Status == false) && ($inst['InstanceStatus'] != 104))// wenn MePo = "Aus" und  Clientsocket Fehler
{
	//Socket schliessen
	CSCK_SetOpen($socket_id,false);
	IPS_ApplyChanges($socket_id);
   IPS_SetEventActive($timer, true);
}
else
{
	//Timer deaktivieren
   IPS_SetEventActive($timer, false);
}
?>

Nachtrag: Script ergänzt

Interessant. Beschäftige mich auch gerade ein wenig damit EG anzubinden. Raketenschnecke letztes Script sieht ja schon gut aus. Aber muss man dann nicht auch wieder die Kommunikation initialisieren? Also „quintessence“ und co wieder senden? Würde das dann nicht sinnvoll sein da da direkt mit einzubauen? Und eigentlich brauch man ja auch kein Ping mehr, wenn ich die Statusmeldungen die InstanceStatus rausgibt schlicht interpretiert? :wink:

Anti

Gesagt getan ich hab mal was gebastelt:


<?
// timer auf sich selbst
IPS_SetScriptTimer($IPS_SELF, 5);
 
$regVarId =  IPS_GetParent($IPS_SELF);
$regVarScriptId = RegVar_GetRXObjectID($regVarId);
$inst =IPS_GetInstance($regVarId);
$csckId =$inst["ParentID"];
 
//$print_r (IPS_GetInstance($regvar));
//echo $regVarId . " - " . $regVarScriptId. " - " . $csckId;
 
// Status Variable anlegen
@$connectedID = IPS_GetVariableIDByName ("Connected", $IPS_SELF);
if ($connectedID == 0) {
 $connectedID = IPS_CreateVariable(0); //Variable anlegen
 IPS_SetName($connectedID, "Connected");
 IPS_SetParent($connectedID, $IPS_SELF);
 SetValue ($connectedID, false);
}
$connected = GetValue ($connectedID);
 
// Auswerten des Status
$inst =IPS_GetInstance($csckId);
$status = $inst['InstanceStatus'];
echo $status ." - " . ($connected?"yes":"no");
if ($status == 102) { // Connected
 if (! $connected) {
  CSCK_SendText($csckId, "quintessence
\r");
  SetValue ($connectedID, true);
 }
}
 
if ($status == 104) { // Closed
 // setzen wir mal status var
 SetValue ($connectedID, false);
}
if ($status == 200) { // Connection Broken
 // setzen wir mal status var
 SetValue ($connectedID, false);
}

?>

Einfach unter der RegVar Instanz ein Skript anlegen, reinkopieren und einmal ausführen, Rest sollte von allein passieren. Die angelegte Variable connected kann man dann auch abfragen ob der pc da ist (sofern er immer EG startet)

Anti

Hallo zusammen,

ich hab’ gestern schon mal versucht hier eine Frage zu stellen; allerdings hab’ ich dummerweise damit ein neues Thema eröffnet. Dieses hat Paresy inzwischen in „EventGhost einbinden“ umbenannt.

Mit meinem eigentlichen Problem bin ich aber immer noch nicht weiter. Deshalb möchte ich gerne die Frage hier nocheinmal stellen. Ich bin sicher, dass man mir hier aufs Pferd helfen kann.

Deshalb bitte ich hiermit nochmals um Hilfe: Wie genau bekommen, bei der Verbindung zu EventGhost, der Client- und Server-Socket in IPS „noch je eine Registervariable“ zugeordnet? Ich vermute fast, dass es geradezu trivial ist, aber ich bekomm’s einfach nicht auf den Schirm. Ich denke, dass ein screenshot eines entsprechenden Objektbaumes mein blindes, inneres Auge öffnen könnte.

Verzweifelte Grüße
Thomas

Mit einem Objektbaum, kann ich dir leider nicht dienen. Aber einfach eine Registervariable anlegen und als übergeordnete Instanz dem Server/Client zuweisen.