Bei der Entwicklung meines ersten LBS habe ich folgende Problemstellung:
Mein LBS soll eine IP Steckdose mfi mPower schalten und überwachen. Der EXEC Teil als Daemon überwacht den Status der IP Steckdose (z.B. wenn jemand die Steckdose per mPower Webinterface geschaltet hat.) Die Kommunikation funktioniert per ssh. Die Erweiterung des php um die ssh2 libs war noch recht einfach und fiunktioniert auch.
Im EXEC Bereich wird eine ssh Verbindung zur IP Steckdose aufgebaut und bleibt ja auch bestehen, was die Performance erheblich verbessert, da beim Polling nicht jedes Mal der Verbindungsaufbau gemacht werden muss. Nur bei fehlerhaftem Polling, wird die SSH Verbindung neu aufgebaut.
Gleiches wollte ich nun im LBS Teil auch machen, um die Steckdose Ereignis-getriggert (Änderung eines Eingangs) zu schalten. Funktionierte zunächst auch über eine statische Variable, die dann die SSH connectioin enthält. Beim Einfügen einer zweiten Steckdose in meine Logikseiten geht das natürlich unweigerlich schief, da für den LBS Teil ja keine neue Instanz angelegt wird, sondern derselbe Programmcode verwendet wird, nur mit anderen Eingangsparametern. Damit überlebt also nur die SSH Verbindung, die beim Aktivieren von edomi zuletzt initialisiert wird, da diese Verbindung in meiner statischen Variable $connection steht.
Ich habe es nun zunächst so gelöst, dass meine statische Variable $connection ein Array von SSH connections enthält, das mit der IP Adresse der Steckdose indiziert ist, so dass für jeden LBS dieses Typs eine eigene statische Variable angelegt wird. Das funktioniert soweit auch.
Meine Fragen sind:
1. Gibt es einen eleganteren Weg?
2. Sollte das Schalten der IP Steckdose per SSH nicht ohnehin in einen EXEC Bereich ausgelagert werden?
3. Wie kann ich Signale vom LBS Bereich in den EXEC Bereich senden, wenn dieser schon als Daemon läuft? Muss ich das selbst machen. z.B. mit einer MessageQueue?
4. Sollte ich ggf. Schalten und Pollen in zwei LBS zerlegen, dann könnte das Schalten im EXEC Bereich des Schalten-LBS gemacht werden.
Ich hoffe das in etwa klar geworden ist, was ich meine.
Ich warte auf eure Anregungen?
VG
André
Mein LBS soll eine IP Steckdose mfi mPower schalten und überwachen. Der EXEC Teil als Daemon überwacht den Status der IP Steckdose (z.B. wenn jemand die Steckdose per mPower Webinterface geschaltet hat.) Die Kommunikation funktioniert per ssh. Die Erweiterung des php um die ssh2 libs war noch recht einfach und fiunktioniert auch.
Im EXEC Bereich wird eine ssh Verbindung zur IP Steckdose aufgebaut und bleibt ja auch bestehen, was die Performance erheblich verbessert, da beim Polling nicht jedes Mal der Verbindungsaufbau gemacht werden muss. Nur bei fehlerhaftem Polling, wird die SSH Verbindung neu aufgebaut.
Gleiches wollte ich nun im LBS Teil auch machen, um die Steckdose Ereignis-getriggert (Änderung eines Eingangs) zu schalten. Funktionierte zunächst auch über eine statische Variable, die dann die SSH connectioin enthält. Beim Einfügen einer zweiten Steckdose in meine Logikseiten geht das natürlich unweigerlich schief, da für den LBS Teil ja keine neue Instanz angelegt wird, sondern derselbe Programmcode verwendet wird, nur mit anderen Eingangsparametern. Damit überlebt also nur die SSH Verbindung, die beim Aktivieren von edomi zuletzt initialisiert wird, da diese Verbindung in meiner statischen Variable $connection steht.
Ich habe es nun zunächst so gelöst, dass meine statische Variable $connection ein Array von SSH connections enthält, das mit der IP Adresse der Steckdose indiziert ist, so dass für jeden LBS dieses Typs eine eigene statische Variable angelegt wird. Das funktioniert soweit auch.
Meine Fragen sind:
1. Gibt es einen eleganteren Weg?
2. Sollte das Schalten der IP Steckdose per SSH nicht ohnehin in einen EXEC Bereich ausgelagert werden?
3. Wie kann ich Signale vom LBS Bereich in den EXEC Bereich senden, wenn dieser schon als Daemon läuft? Muss ich das selbst machen. z.B. mit einer MessageQueue?
4. Sollte ich ggf. Schalten und Pollen in zwei LBS zerlegen, dann könnte das Schalten im EXEC Bereich des Schalten-LBS gemacht werden.
Ich hoffe das in etwa klar geworden ist, was ich meine.

Ich warte auf eure Anregungen?
VG
André
Kommentar