Jump to content

Recommended Posts

Geschrieben

Hallo,

 

als ich von tinker in der CT las, war ich gleich angetan. ich bin gerade am Basteln eines Homecontrols. Klar, es gibt das schon einiges. Aber wie es oft so ist, nicht das was man möchte.

 

Meine Lösung sieht derzeit so aus: Ein Arudino Mini kommuniziert via seriell mit einem Linuxsystem (nächste Woche raspberry pi). Daten lesen und schreiben in die Datenbank erledigt ein Pythonskript. Das Zeitnahe bedienen eines Aktors über die Weboberfläche regelt SOAP. Also die PHP-Variableninhalte werde an Python-Variablen übergeben. Ich kann also künftig direkt mit PHP ansteuern? Das wäre schon was...

Gruß

Joachim Müller

Geschrieben

Servus,

 

also ich denke, dass es möglich sein wird. Es heißt, dass evtl sogar schon diese Woche die PHP Bindings fertig werden könnten... Ich freu mich auch schon sehr drauf! Hab heut auch schon meine 2te Lieferung bekommen...

 

Wie das letzt endlich aussieht bin ich auch mal gespannt. Gerade im Hinblick auf "Events"... Tue was, wenn die Helligkeit über 600 Lux steigt --> Rollo Runterlassen oder Tue was bei Tastendruck auf LCD-Taster1

 

Letztendlich kommuniziert man mit dem brick-daemon ja immer via tcp-ip. Das wird wohl auch über php machbar sein. ich bin auf jedenfall gespannt wie wir das nutzen können! Ich hätt jetzt selbst nur keine Ahnung wie man via php diese "speziellen" TCP-Pakete absetzen kann (sieh TCP-IP low-level Doku).

 

Gruß

Christian

 

Geschrieben

Und ich schätze immer noch, dass die PHP Bindings diese Woche verfügbar sein werden.

 

Hier mal ein Beispiel Programm, das die Versionsinformation und die aktuelle Position eine Linear Poti Bricklets ausliest.

 

<?php

require_once('Tinkerforge/IPConnection.php');
require_once('Tinkerforge/BrickletLinearPoti.php');

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletLinearPoti;

$host = 'localhost';
$port = 4223;
$uid = '7jb';

$ipcon = new IPConnection($host, $port);
$lp = new BrickletLinearPoti($uid);

$ipcon->addDevice($lp);

echo "getVersion():\n";
var_dump($lp->getVersion());

echo "getPosition():\n";
var_dump($lp->getPosition());

?>

 

Hier die Ausgabe des Programms mit dem PHP Kommandozeilen Tool ausgeführt. Die Minimum PHP Version wird 5.3 sein. Das ganze funktioniert auch mit dem PHP Modul in Apache.

 

getVersion():
array(3) {
  ["name"]=>
  string(24) "Linear Poti Bricklet 1.0"
  ["firmwareVersion"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
  ["bindingVersion"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(0)
    [2]=>
    int(0)
  }
}
getPosition():
int(43)

 

Hier noch ein Beispiel mit Callback

 

<?php

require_once('Tinkerforge/IPConnection.php');
require_once('Tinkerforge/BrickletLinearPoti.php');

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletLinearPoti;

$host = 'localhost';
$port = 4223;
$uid = '7jb';

$ipcon = new IPConnection($host, $port);
$lp = new BrickletLinearPoti($uid);

$ipcon->addDevice($lp);

function cb_position($position) {
    echo "position changed: $position\n";
}

$lp->registerCallback(BrickletLinearPoti::CALLBACK_POSITION, 'cb_position');
$lp->setPositionCallbackPeriod(20);

$ipcon->dispatchCallbacks(-1);

?>

 

Und hier die Ausgabe nach Bewegen des Potis.

 

position changed: 45
position changed: 52
position changed: 56
position changed: 55
position changed: 48
position changed: 43
position changed: 39
position changed: 34
position changed: 30
position changed: 26
position changed: 23
position changed: 21
position changed: 20

 

Da PHP keine Threads unterstütz und die Workarounds alle recht plattformspezifisch sind muss man selbst dafür sorgen das Callbacks ausgeliefert werden.

 

Dafür ist die dispatchCallbacks Methode der IPConnection da. Der kann man ein Zeitspanne in Sekunden übergeben, die Callbacks ausgeliefert werden sollen bevor dispatchCallbacks returned. -1 wie im Beispiel bedeutet unendlich.

 

Falls ihr Vorschläge oder Kommentare dazu habe dann würde ich sie gerne hören.

Geschrieben

ja aber das war ja irgendwie klar, oder? Jeder der schon ein bisschen mit php rumgefrickelt hat weiß doch, dass ein Script nach dem "abarbeiten" idr. zuende ist...

 

Ich hab auch noch keine wirkliche Idee wie man das Nutzbar macht :). Eine kleine Anregung möchte ich aber noch liefern:

http://winbinder.org

Das ist ein System um nativ wirkende (!!) Windows-Anwendungen zu schreiben. Hab auch schon mal kurz mit rumgespielt und war mittelmäßig bis stark beeindruckt. Leider gibt’s seit fast 2 Jahren nichts neues mehr von dem Projekt.

 

Gruß

Christian

Geschrieben

Die Callback Lösung ist nicht wirklich berauschend. Wenn man das in eine Webapplikation einbauen würde, was bei PHP ja zu erwarten ist, ist das aus meiner Sicht unbenutzbar ?

 

Der Sinn der Callbacks ist, dass du nicht pollen musst um Ereignisse mitzubekommen. Man kommt aber an fasst alle Informationen auch ohne Callbacks. Typischerweise hast du da ein Programm das länger läuft wenn du Callbacks nutzt.

 

Im Rahmen einer Webapplikation wird aber PHP immer nur kurz ausgeführt um die Webseite zu erstellen. Dort hast du kein lange laufendes PHP Programm, daher machen dort Callbacks wenig Sinn. Oder verstehe ich jetzt hier was falsch?

 

In einem lange laufenden Standalone PHP Programm musst du eben dafür sorgen dispatchCallbacks regelmässig aufzurufen, wenn du Callbacks nutzt. Das ist bisher die portabelste Lösung auf die ich bis jetzt gekommen bin.

 

Christian, mir ist nicht ganz klar was du mir mit WinBinder sagen willst. Ich sehe zumindest nichts was dich hindern sollte WinBinder und Tinkerforge in einem Programm zu verwenden.

Geschrieben

Christian, mir ist nicht ganz klar was du mir mit WinBinder sagen willst. Ich sehe zumindest nichts was dich hindern sollte WinBinder und Tinkerforge in einem Programm zu verwenden.

 

Ne ich wollte darauf auch gar nicht hinaus sondern einfach mal auf dieses Projekt hinweisen bei dem man mit PHP an sich Windows-Anwendungen (mehr oder weniger) entwickeln kann. War mir bis letzte Woche völlig fremd dass so etwas geht :)

Geschrieben

Wenn du WebSockets verwendest hast du aber auch ein PHP Programm auf dem Server das dauerhaft (zumindest länger) läuft und dann kannst du in der Schleife die die Clients bedient auch zwischendurch mal dispatchCallbacks() aufrufen und alles ist gut :)

Geschrieben

ich hatte da jetzt eher an einen mehr oder weniger transparenten webserver gedacht, für den es dann javascript bindings gibt. Also dass man anstatt Phyton/Java/C... zu nutzen, einen Browser und Javascript nimmt.

Aber ich sehe ein, dass das wenig mit php zu tun hat :-)

Geschrieben

Das wäre in der Tat eine Möglichkeit Javascript Bindings zu machen. Aber warum so kompliziert? Wenn ich in Javascript schon WebSocket habe dann kann ich auch gleich von Javascript aus direkt mit brickd reden.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...