Ich teste dein Skript mal eben bei mir, melde mich gleich...
Ankündigung
Einklappen
Keine Ankündigung bisher.
iTunes | Steuerung via Script über WebServer | Edomi
Einklappen
X
-
Also bei mir werden auch keine Live-Werte angezeigt, aber wenn du eine GA verbindest, dann werden die Werte korrekt auf den Bus geschrieben. Das Problem ist jetzt noch, dass es sein kann, dass das EXEC-Skript weiterläuft und du bei einem Neustart von EDOMI keinen freien Port bekommst, in 1.14 wird es hierzu eine Abhilfe geben.
PHP-Code:###[HELP]###
###[/HELP]###
###[DEF]###
[name = iTunes & AirPlay]
[e#1 = Autostart #init=1]
[e#2 = Port #init=12345]
[e#3 = ]
[e#4 = ]
[e#5 = ]
[e#6 = ]
[e#7 = ]
[e#8 = ]
[e#9 = ]
[e#10 = ]
[a#1 = Play]
[a#2 = Pause]
[a#3 = Stop]
[a#4 = FF]
[a#5 = FR]
[a#6 = AirPlay1 E/A]
[a#7 = AirPlay2 E/A]
[a#8 = AirPlay1 VOL]
[a#9 = AirPlay2 VOL]
[v#1 = 0] // Server-IP
[v#2 = 0] // Port
[v#3 = 0] // EXEC-Status
###[/DEF]###
###[LBS]###
<?php
function LB_LBSID($id) {
if ($E = getLogicEingangDataAll($id)) {
if (! is_null($E[1]['value']) && $E[1]['refresh']==1) {
setLogicElementVar($id,1,GLOBAL_SERVERIP); // Setze Server-IP
setLogicElementVar($id,2,$E[2]['value']); // Setze Port
callLogicFunctionExec(LBSID,$id);
}
}
}
?>
###[/LBS]###
###[EXEC]###
<?
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
sql_connect();
if (getLogicElementVar($id,3) == 0 ) { // Prüfen ob Sḱript bereits ausgeführt wird
setLogicElementVar($id,3,1); // Status von EXEC-Skript auf aktiv setzen
$ip = getLogicElementVar($id,1);
$port = getLogicElementVar($id,2);
if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
if (socket_bind($socket, $ip, $port)) {
while(true) {
$data = @socket_read($socket, 210);
$myString = $data;
$output = array();
parse_str($myString, $output);
if (array_key_exists('Play', $output)) { setLogicLinkAusgang($id, 1, $output['Play']);}
if (array_key_exists('Pause', $output)) {setLogicLinkAusgang($id, 2, $output['Pause']);}
if (array_key_exists('Stop', $output)) {setLogicLinkAusgang($id,3,$output['Stop']);}
if (array_key_exists('FF', $output)) {setLogicLinkAusgang($id,4,$output['FF']);}
if (array_key_exists('FR', $output)) {setLogicLinkAusgang($id,5,$output['FR']);}
if (array_key_exists('LS1', $output)) {setLogicLinkAusgang($id,6,$output['LS1']);}
if (array_key_exists('LS2', $output)) {setLogicLinkAusgang($id,7,$output['LS2']);}
if (array_key_exists('LSV1', $output)) {setLogicLinkAusgang($id,8,$output['LSV1']);}
if (array_key_exists('LSV2', $output)) {setLogicLinkAusgang($id,9,$output['LSV2']);}
usleep(1000*10); //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen!
}
}
}
}
sql_disconnect();
?>
###[/EXEC]###Zuletzt geändert von panzaeron; 01.02.2016, 17:07.
Kommentar
-
So, jetzt hab' ich mal drübber geguckt...
Also:- die EDOMI-IP ist für die Katz - die braucht man nicht beim Port-Bindung
- der UDP-String war "dreckig", d.h. mit Zeilenumbrüchen versehen (vom echo):
- es ist ohnehin zu empfehlen, alle Strings von "aussen" zu "reinigen" (siehe Quelltext)
- echo 'xyz' | nc IP PORT hängt einen Zeilenumbruch an den String... mit echo -n 'xyz'... passiert das nicht. Ist aber auch Wurscht - wird ja jetzt gefiltert
- die Live-Werte wurden nicht angezeigt, da der Zeilenumbruch das JS-Script irritiert hat - ein Bug... Wird behoben. Mit dem unten gezeigten LBS spielt das aber keine Rolle, da Zeilenumbrüche ja nun entfernt werden.
echo '... | nc ...'
Das geht natürlich nichtKorrekt wäre eher:
echo '...' | nc...
Hier also der quasi fertige LBS:
Natürlich muss am Ende noch "aufgeräumt" werden - also Socket schließen etc... Das habe ich mir jetzt mal geschenkt.
PHP-Code:###[HELP]###
###[/HELP]###
###[DEF]###
[name = iTunes & AirPlay]
[e#1 = Autostart #init=1]
[e#2 = Port #init=12345]
[e#3 = ]
[e#4 = ]
[e#5 = ]
[e#6 = ]
[e#7 = ]
[e#8 = ]
[e#9 = ]
[e#10 = ]
[a#1 = Play]
[a#2 = Pause]
[a#3 = Stop]
[a#4 = FF]
[a#5 = FR]
[a#6 = AirPlay1 E/A]
[a#7 = AirPlay2 E/A]
[a#8 = AirPlay1 VOL]
[a#9 = AirPlay2 VOL]
[v#1 = 0]
###[/DEF]###
###[LBS]###
<?php
function LB_LBSID($id) {
if (getLogicElementVar($id,1)!=1) { //dieses Konstrukt stellt sicher, dass EXEC nur einmal gestartet wird
setLogicElementVar($id,1,1);
callLogicFunctionExec(LBSID,$id);
}
}
?>
###[/LBS]###
###[EXEC]###
<?
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(0); //### Wichtig!
sql_connect();
if ($E=getLogicEingangDataAll($id)) { //Eingänge einlesen!
if ($socket=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP)) {
if (socket_bind($socket,'0.0.0.0',$E[2]['value'])) {
while(getSysInfo(1)>=1) {
$data=socket_read($socket,1024);
$data=preg_replace("/[^A-Za-z0-9&=]/",'',$data); //unerwünschte Zeichen entfernen
parse_str($data,$output);
if (array_key_exists('Play',$output)) {setLogicLinkAusgang($id,1,$output['Play']);}
if (array_key_exists('Pause',$output)) {setLogicLinkAusgang($id,2,$output['Pause']);}
if (array_key_exists('Stop',$output)) {setLogicLinkAusgang($id,3,$output['Stop']);}
if (array_key_exists('FF',$output)) {setLogicLinkAusgang($id,4,$output['FF']);}
if (array_key_exists('FR',$output)) {setLogicLinkAusgang($id,5,$output['FR']);}
if (array_key_exists('LS1',$output)) {setLogicLinkAusgang($id,6,$output['LS1']);}
if (array_key_exists('LS2',$output)) {setLogicLinkAusgang($id,7,$output['LS2']);}
if (array_key_exists('LSV1',$output)) {setLogicLinkAusgang($id,8,$output['LSV1']);}
if (array_key_exists('LSV2',$output)) {setLogicLinkAusgang($id,9,$output['LSV2']);}
usleep(1000*10);
}
}
}
}
sql_disconnect();
?>
###[/EXEC]###Zuletzt geändert von gaert; 01.02.2016, 17:47.EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Kommentar
-
DANKE !!
Das Problem ist jetzt noch, dass es sein kann, dass das EXEC-Skript weiterläuft und du bei einem Neustart von EDOMI keinen freien Port bekommst
Also bei mir werden auch keine Live-Werte angezeigt
GLOBAL_SERVERIP
Den Rest mit den „v“ usw. im Code muss ich noch behirnen ;-)
Nochmals danke !
Danke und LG, Dariusz
GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL
Kommentar
-
GLOBAL_SERVERIP habe ich nicht geschrieben, sondern global_serverIP
EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Kommentar
-
DANKE !!
Natürlich muss am Ende noch "aufgeräumt" werden - also Socket schließen etc... Das habe ich mir jetzt mal geschenkt.
Mit socket_close() habe ich folgenden Hinweis gefunden:
Summary: close() does not relinquish socket immediately.
With the BSD socket implementation (which is the socket interface used by PHP), a socket_close() may close the socket, but there may yet be data to send. Until the data is sent, the port will not be available. Therefore, all further bindings attempted on that port will not be acceptable due to the 'port can not be reused' (the approximate message, anyway) error. Ordinarily, if the REUSABLE socket option is set, the only thing that will raise such an error is a binding to a specific IP/PORT combination that is already bound.
In www heißt es mann soll zuerst shutdown danach close ausführen ...
Wie ist deine Meinung dazu, insbesondere in Bezug auf den LBS und EDOMI und an welcher Stelle :-) ??Danke und LG, Dariusz
GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL
Kommentar
-
Man - Du bist wirklich ein Copy/Paste-"Programmierer"Spaß... Mit ernsthaften Anteilen...
socket_close(...) schließt einen Socket, fertig. Natürlich reagiert die Gegenstelle nicht immer sofort, aber das ist nicht Dein Problem (bzw. das Problem des LBS). Der LBS sendet ja nix, der empfängt nur...EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Kommentar
-
Man - Du bist wirklich ein Copy/Paste-"Programmierer"Spaß... Mit ernsthaften Anteilen...
Bin interessiert und hinterfrage warum etwas ist wie es ist um es zu verstehen :-)Danke und LG, Dariusz
GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL
Kommentar
-
Zitat von gaert Beitrag anzeigenGLOBAL_SERVERIP habe ich nicht geschrieben, sondern global_serverIPZuletzt geändert von panzaeron; 01.02.2016, 19:21.
Kommentar
-
PHP unterscheidet nur bei Variablen, Konstanten und Eigenschaften von Klassen zwischen Groß-/Kleinschreibung. Bei Funktionen, Klassen und Methoden ist das nicht der Fall.
PS: Konstanten müssen ergo nicht immer groß, zumindest aber immer gleich geschrieben werden ;-)Zuletzt geändert von Jever; 01.02.2016, 19:33.
Kommentar
-
Hmmmm,
ich habe für 7 (die letzten) von 9 Variablen ein ERROR-LOG ...
Code:[SIZE=10px][FONT=courier new][COLOR=#FF0000]2016-02-01 19:24:58 707312 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 707483 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 707539 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 707588 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 707638 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 707797 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 707858 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 707909 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 707957 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 708004 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 708051 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 708098 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR 2016-02-01 19:24:58 708146 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 8 / Zeile 2 / Undefined variable: otuput ERROR 2016-02-01 19:24:58 708206 ? 1730 /usr/local/edomi/www/data/liveproject/lbs/EXE19000001.php: Code 2 / Zeile 2 / array_key_exists() expects parameter 2 to be array, null given ERROR[/COLOR][/FONT][/SIZE]
Copy/Paste Fehler (meine Äuglein schon zu müde) ?
Bildschirmfoto 2016-02-01 um 19.37.15.png
PHP-Code:###[HELP]###
###[/HELP]###
###[DEF]###
[name = iTunes & AirPlay]
[e#1 = Autostart #init=1]
[e#2 = Port #init=12345]
[e#3 = ]
[e#4 = ]
[e#5 = ]
[e#6 = ]
[e#7 = ]
[e#8 = ]
[e#9 = ]
[a#1 = Play]
[a#2 = Pause]
[a#3 = Stop]
[a#4 = FF]
[a#5 = FR]
[a#6 = AirPlay1 E/A]
[a#7 = AirPlay2 E/A]
[a#8 = AirPlay1 VOL]
[a#9 = AirPlay2 VOL]
[v#1 = 0]
###[/DEF]###
###[LBS]###
<?php
function LB_LBSID($id) {
if (getLogicElementVar($id,1)!=1) {
setLogicElementVar($id,1,1);
callLogicFunctionExec(LBSID,$id);
}
}
?>
###[/LBS]###
###[EXEC]###
<?php
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(0);
sql_connect();
if ($E=getLogicEingangDataAll($id)) {
if ($socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
if (socket_bind($socket, '0.0.0.0', $E[2]['value'])) {
while(getSysInfo(1)>=1) {
$data = socket_read($socket, 1024);
$data = preg_replace("/[^A-Za-z0-9&=]/",'',$data);
parse_str($data, $output); // $output = array();
if (array_key_exists('Play', $output)) {setLogicLinkAusgang($id,1,$output['Play']);}
if (array_key_exists('Pause', $output)) {setLogicLinkAusgang($id,2,$output['Pause']);}
if (array_key_exists('Stop', $otuput)) {setLogicLinkAusgang($id,3,$output['Stop']);}
if (array_key_exists('FF', $otuput)) {setLogicLinkAusgang($id,4,$output['FF']);}
if (array_key_exists('FR', $otuput)) {setLogicLinkAusgang($id,5,$output['FR']);}
if (array_key_exists('LS1', $otuput)) {setLogicLinkAusgang($id,6,$output['LS1']);}
if (array_key_exists('LS2', $otuput)) {setLogicLinkAusgang($id,7,$output['LS2']);}
if (array_key_exists('LSV1', $otuput)) {setLogicLinkAusgang($id,8,$output['LSV1']);}
if (array_key_exists('LSV2', $otuput)) {setLogicLinkAusgang($id,9,$output['LSV2']);}
usleep(1000*10); //z.B. 10ms warten - wichtig, um die CPU-Last zu begrenzen!
//socket_close($socket)
}
}
}
}
sql_disconnect();
?>
###[/EXEC]###
Eine Idee, denn ich erkenne auf den x-ten Blick keinen FehlerDanke und LG, Dariusz
GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL
Kommentar
-
Quatsch... otuput und output wird von der PHP-internen Tippfehlerkorrektur automatisch angepaßt
Mein "Fehler" - ich hatte Dein Script ja als Grundlage kopiert... Hätte mir auffallen müssenEDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Kommentar
-
Du sprichst mit einem Maschinenbauer in Rätseln
EDIT: OK, jetzt habe ich es auch gelesen otoput … die Äuglein sind schon wirklich müde ….
Zuletzt geändert von coliflower; 01.02.2016, 21:03.Danke und LG, Dariusz
GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL
Kommentar
Kommentar