Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Richtig - wenn kein Client das Script aufruft gibt's auch keine (Client)-IP Die Server IP (lokal) ist übrigens in der EDOMI-Konstante global_serverIP verfügbar.
EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Du musst/kannst in der edomi.ini festlegen, wie die WAN-IP Deines Servers ermittelt werden soll (per Fritzbox, Webdienst oder EDOMI-Server). Solange dies nicht konfiguriert ist, bleibt das SysKO leer...
Die o.g. Konstante hat mit dem SysKO nix zu tun - dies nur als Hinweis
EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
global_serverIP: die lokale IP des Servers (wie bei der Installation angegeben)
System-KO "Server-IP": enthält ggf. die öffentliche IP des Servers (also die IP, unter der der Server theoretisch im Internet erreichbar ist - bzw. der DSL-Router)
$_SERVER['REMOTE_ADDR']: die IP des Clients(!), der eine PHP-Seite auf dem Server abruft (funktioniert natürlich nur per Browser)
Die Erläuterungen sind natürlich nicht vollständig, sondern dienen nur zum Verständnis in diesem Kontext...
EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Wieso willst du denn die Variable $buf außerhalb der while-Schleife verwenden?
Wenn du die while-Schleife verlässt, beendet sich den EXEC Skript.
Aber auch außerhalb ist die Variable $buf verfügbar. Solange du sie nicht in einer anderen Funktion verwendest ist alles gut..
wenn ich eine if mit der variable $buf machen möchte, funktioniert die derzeit nur in der schleife. Sobald Sie außerhalb der schleife ist, funktioniert es nicht mehr (siehe Code)
Problem ist: $buf bekommt alle 3s von der EMA Daten, allerdings wird der Logikausgang 2 durch die Schleife in viel öfter in den MonitorLog geschrieben. Ich wollte damit erzielen, dass Ausgang 2 nur alle 3s gesetzt wird wenn $buff Daten vom sick erhält. Oder soll ich eine while schleife in der Schleife bauen ???
Code:
// connection
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$bind = socket_bind($sock,$myip );
socket_connect($sock, $ip, $port);
socket_set_nonblock($sock);
socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);
// read loop
while (1)
{
$buf = socket_read($sock,2048); // read data from socket
if ($buf!='')
{
setLogicLinkAusgang($id,1,ascii2hex($buf));
}
usleep(100000);
}
if ($buf!='hh@B')
{
setLogicLinkAusgang($id,2,1);
}
Ich glaube du solltest mal grundsätzlich erklären was du machen willst.
Also zum Beispiel:
1. Dauerhaft Lesen was die EMA sendet
2. Auf bestimmte Daten der EMA reagieren (z.B. hh@B empfangen => hh senden => xyz in EDOMI machen)
Sonst kannst du dein Skript noch 10 mal neu designen.
Dein Ausgang 2 wird im o.g. gar nicht gesetzt, da er außerhalb der while Schleife liegt und nie erreicht wird.
Dass Ausgang 1 öfter gesetzt wird ist klar, da socket_read() false zurückgibt, wenn nichts gelesen wird, daher ist false!=''. Glaube ich zumindest.
Aber am wichtigsten ist der o.g. Hinweis:
Schreib möglichst genau auf was das Skript können muss, dann kann dir auch geholfen werden.
Dein Ausgang 2 wird im o.g. gar nicht gesetzt, da er außerhalb der while Schleife liegt und nie erreicht wird.
Dass Ausgang 1 öfter gesetzt wird ist klar, da socket_read() false zurückgibt, wenn nichts gelesen wird, daher ist false!=''. Glaube ich zumindest.
Ausgang 1 gibt kein false...gibt die Daten so raus wie sie kommen alle 3s....passt also. Ausgang 2 wird von der while Schleife aber öfter gesetzt mit 1 da ja immer "true" in denen 3s Pause.
Vom Prinzip her ist es eigentlich ganz simpel was ich möchte
EMA sendet --> SEND NORM
LBS soll zurück senden --->CONF_ACK
EMA sendet --> NDAT
LBS soll zurück senden --->CONF_ACK
EMA sendet --->NDAT2
LBS soll zurück senden ---->CONF_ACK
EMA sendet --->NDAT3
LBS soll zurück senden ---->CONF_ACK
EMA sendet --->NDAT4
LBS soll zurück senden ---->CONF_ACK
spiel beginnt von vorne.....
Jetzt war ich mir unschlüssig dies alles in einem LBS zu bauen. Mit Ausgang 2 wollte ich einen weiteren LBS triggern der CONF_ACK übernimmt. Wobei das ja eigentlich auch in einem LBS funktionieren sollte.
immer wenn die EMA sendet muss halt mit CONF_ACK geantwortet werden. Ich hab mir halt gedacht den hex (NDAT, NDAT2 usw) in eine variable zu schreiben und dann halt oder Funktion bauen um CONF_ACK zu schicken. Dies wollte ich halt mal mit SEND_NORM teste. in Hterm funktioniert die ganze Sache auch soweit....ist halt schwierig in php umzusetzen...
quasi
if $buf = ($a or $b or $c usw.)
{
$sockwrite($sock, 'CONF_ACK)
}
oder hab ich da etwas falsch verstanden???
Zudem müssten die Daten von $buf noch auf Ausgang gelegt werden da ich die Daten ja auswerten muss, aber das wäre ja dann
if $buf = ($a)
setLogikAusgang(id,3, $buff) usw. Daten würde ich remanent in KO speichern, wobei Sie ja auch alle 3s neu kommen.
Zudem muss ich halt einen Ausgang setzen auf ca. 2,7 welcher mir angibt, dass senden erlaubt ist(Quasi merker). Ich kann nur zur EMA senden wenn diese gerade nicht sendet. (tpoll 3s) Wäre aber erstmal nicht so von Bedeutung da ich ja immer nur mit CONF_ACK antworte und eigentlich gar nicht über EDOMI unscharf etc schalten möchte. Dies passiert weiterhin nur über EMA selbst......dient lediglich der Statusanzeige Fenster usw.
und was bedeutet NDAT, NDAT2, NDAT3, NDAT4??? Sind das hier Platzhalter oder sind das genau die Strings, die da kommen?
Und warum muss da HEX drauf gemacht werden?
Ja sind Platzhalter, also die Nutzdaten. SEND_NORM und CONF_ACK sind ebenfalls Platzhalter. Diese werden dann mit den HEX werten aus der Schnittstellenbeschreibung von Telenot gefüllt.
<?php // configuration $myip = '192.168.0.10'; // IP wo dieses Skript gestartet wird $ip = '192.168.0.47'; // IP wo ser2net läuft $port = 5332; // Port auf dem ser2net lauscht
function send($sock, $cmd) { $result = socket_write($sock,$cmd); return $result; }
// read loop while (1) { $buf = socket_read($sock,2048); // read data from socket if ($buf) { switch ($buf){ case 'SEND_NORM': send($sock, 'CONF_ACK'); // weiterer Code was nach einem SEND_NORM noch gemacht werden soll
break; case 'NDAT': send($sock, 'CONF_ACK'); // weiterer Code was nach einem NDAT noch gemacht werden soll
break; case 'NDAT2': send($sock, 'CONF_ACK'); // weiterer Code was nach einem NDAT2 noch gemacht werden soll
beak; case 'NDAT3': send($sock, 'CONF_ACK'); // weiterer Code was nach einem NDAT3 noch gemacht werden soll
break; case 'NDAT4': send($sock, 'CONF_ACK'); // weiterer Code was nach einem NDAT4 noch gemacht werden soll
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar