PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vbusmonitor funkt nicht



h.schmidt
02.04.08, 18:36
Ich hab unter OpenSuse eibd von der TU-Wien am laufen. Mit dem Kommando groupswrite kann ich Gruppenadressen auf den Bus senden. Der Zugriff auf den EIB-Bus sollte somit prinzipiell funktionieren.

Jetzt möchte ich alle Gruppenadressen, die über den Bus gesendet werden loggen und ggf. in eine DB schreiben. Testen wollte ich den Zugriff mit den Examples vbusmonitor1 und vbusmonitor2. Leider liefern beide Programme keine Resultate. Dabei habe ich bereits das "fflush(stdout);" hinzugefügt.

Hat jemand eine Idee, woran das liegen könnte?

Für Hilfe wäre ich sehr dankbar.

Mike
02.04.08, 21:46
Du hast sicher vergessen die Adresstabelle der BCU auf 0 zu setzen. Ist die Tabelle nicht leer, so werden nur in der Adresstabelle vorhandene Adressen empfangen.
bcuaddrtab <URL> -w 0 setzt die Tabelle auf 0. Für URL musst du die url das Backends einsetzen. Z.b. ft12:/dev/ttyS0 .

Grüße
Mike

jonofe
02.04.08, 22:19
zur Info...
lt. Aussage von Martin Koegler ist die saubere Variante den Befehle groupsockerlisten zu verwenden, um sich mit dem eibd zu verbinden und den Bustraffic mitzuschneiden.


Habe ich auch so gemacht und dann per php, die Telegramme in eine mySQL Datenbank geschrieben.

Grüße

André

h.schmidt
02.04.08, 23:07
Vielen Dank für die schnellen Antworten.

Funkt ... :Prost:

NetFritz
03.04.08, 23:56
Hallo


@ jonofe
lt. Aussage von Martin Koegler ist die saubere Variante den Befehle groupsockerlisten zu verwenden, um sich mit dem eibd zu verbinden und den Bustraffic mitzuschneiden.

Wie wird den groupsocketlisten mit php augerufen.
Habe vbusmonitor1 durch groupsocketlisten ersetzt geht aber nicht.
Muß "fflush(stdout);" noch hinzugefügt werden.

Gruss NetFritz

jonofe
05.04.08, 00:21
Ich mach das so ...


#!/usr/bin/php
<?php

chdir ( dirname ( __FILE__ ) );

include_once "eib_telegram.php";
#!/usr/bin/php
<?php

chdir ( dirname ( __FILE__ ) );

include_once "eib_telegram.php";
include_once "../config/config_eib.php";
include_once "../generic/generic.php";
include_once "../generic/sql.php";

write_pid ( "eib_listener" );

function exit_listener($sig_no) {
global $eib_msg_queue, $handle;
pclose ( $handle );
msg_remove_queue ( $eib_msg_queue );
echo "closed msg_queue by exit_listener()\n";
exit ();
}

// Signalverarbeitung einrichten


declare ( ticks = 1 )
;
pcntl_signal ( SIGTERM, "exit_listener" );
pcntl_signal ( SIGINT, "exit_listener" );
pcntl_signal ( SIGHUP, "exit_listener" );

set_time_limit ( 0 );

// Ãffne Socket zur EIB Verbindung
$handle = popen ( $BIN_DIR . 'groupsocketlisten ip:localhost', 'r' );

//
// MAIN LOOP
//


if ($handle) {
// main loop für Telegramme auf dem KNX
stream_set_blocking ( $handle, 1 );
while ( ! feof ( $handle ) ) {
if ($data = fgets ( $handle )) {
log_msg ( date ( "Y-m-d H:i:s " ) . ":" . $data );
flush ();

// init message queue zum Senden von EIB Telegrammen an den eib_server
$eib_msg_queue = msg_get_queue ( $eib_msg_queue_id, 0600 );

// Sende Message an Prozess "ir_sender"
msg_send ( $eib_msg_queue, 1, $data, true, true, $msg_err );
}
}
}

?>
Das ist mein eib_listener, der einfach alle Telegramme vom Bus liest und message_queue an andere Prozesse weiterreicht. Hat den Vorteil, dass der Listener zeitlich beispielsweise unabhängig von der Logik, der Zeitsteuerung und der VISU ist. Dies sind separate php-Prozesse, die den eib_listener nicht beeinflussen.
Habe die entscheidende Stelle in rot markiert.

Grüße

Andre

NetFritz
05.04.08, 16:53
Hallo

Habe mal ein Test-Script geschrieben.


#!/usr/bin/php5
<?php
error_reporting(E_ALL);
$command="/usr/bin/groupsocketlisten ip:127.0.0.1";
# $command="/usr/bin/vbusmonitor1 ip:127.0.0.1"

$handle = popen($command, 'r');

if (!$handle) {
die("Konnte Busmonitor nicht initialisieren!");
}

while (!feof($handle)) {
if ($data = fgets($handle)){
echo "$data \n";
}
}
?>


Wenn ich das Script mit vbusmonitor1 aufrufe zeigt mir echo das Rohtelegramm an.
Rufe ich das Script mit groupsocketlisten auf so habe ich keine Ausgabe.

Vermutlich fehlt in groupsocketlisten "fflush(stdout)".
Ich habe die Version 0.0.2.1 von eibd auf meinen Ubuntu Rechner.
Inzwischen gibt es die Version 0.0.3.
Ich habe 0.0.3 von der Aktualisierungsverwaltung noch nicht installieren lassen,da ich nicht sicher bin ob da
"fflush(stdout)" schon drin ist.
Ist in der Version 0.0.3 schon "fflush(stdout)".

Gruss NetFritz

travis
09.07.08, 09:46
das mit dem aufrufen von den beispielen in c aus php ist umständlich und nicht notwendig.

Man kann direkt von php auf eibd zugreifen.
dazu gibt es auch beispiele und eine php class in dem eibd sourcen.

ich hab was gebraucht aber mittlerweile lese ich status vom bus nur noch direkt mit php von eibd und nutzt da cacheread was dafür ausgelegt ist sehr oft abgefragt zu werden.

auch habe ich die info bekommen das vbusmonitor nicht der "richtige" weg ist auf dem bus auf ein ereignis zu warten. sondern man sollte groupsocket verwenden. (was auch direkt von php aus geht)

ich merke mir keinen status mehr in einer mysql db sondern fragen den bus jedes mal und cacheread ist schnell genug.

ich selber habe mir zwei eib classen in php zusammengestellt (grösstenteils aus dem php beispiel von eibd) und in zend framework eingebunden. Dort habe ich eine normale Oberfläche für den PC und jetzt auch eine Wepapp für das Iphone (in iphone look&feel)
alle geräte auf dem bus liegen dabei sauber in einer config datei und werden flexibel ausgelesen

tabatux
09.07.08, 10:51
Hallo Tavis,

Hast Du vielleicht ein paar Beispiele(Screenshots, Code-Snips) dazu?
Bin ziemlich neugierig, würde gern auch so was Basteln ;)

Danke und Gruß
Dirk

travis
09.07.08, 11:19
code muss ich mal raussuchen was man so versteht.
auf jeden fall mal die beispiele mit php aus eibd sourcen ansehen

hier mal ein paar screen

die pc lösung ist funktionell aber nicht schön ;)
bin halt kein css freak
die "schönen" sind fürs iphone

hier mal ein kleines beispiel:


$eibc = new EIB_Connection( 'localhost' );

$addr = "3/2/1"

$eib = new EIB_Tools();
$r = $eib->cacheread($eibc,$addr,0);
if (($r[1] ==-1 ) or ($r[1] ==-2 )or ($r[1] ==-3 ))
{
$status = array('na','na','na');
} else {
if ($r[2] == 1)
$status = array('1',true,'An');
else
$status = array('0',false,'Aus');
}


die klassen sind 1:1 aus den eibd sourcen wobei EIB_tools hab ich nur in eine class gepackt. Die Funktionen sind 1:1 aus dem Beispiel.

tabatux
09.07.08, 15:21
sieht echt gut aus :D
hast Du auch irgedwelche Logiken implementiert?

travis
09.07.08, 18:57
nein ... noch nicht.

betonung liegt auf noch - aus reinem zeitmangel

kommt aber noch
erst mach ich jetzt meine iphone steuerung fertig (kann das aber erst ab nächste woche,da ich das 3G jetzt erst bekomme)

was ich wohl auch schon gemacht hab. 1 oder 2 zentralle Funktionen in das Menü von meinem VDR eingebaut bzw Reelbox AVG