PHP Modul: IPS_SetProperty

Moin,

ich habe eine Frage bzgl der Nutzung von IPS_SetProperty/IPS_ApplyChanges.

Im Tibber_Realtime Module wird ein Websocket verwendet, hin und wieder kommt es vor, das die Verbindung stecken bleibt. Dazu habe ich einen Timer und wenn der abläuft wird die Instanz geschlossen, zufällig zwischen 60-120 sek gewartet und dann wieder geöffnet.

Laut Tibber-Doku soll das so auch ablaufen. Verbindung schließen, warten, neu aufbauen.

No data due to networking issues: it may be wise to implement reconnect mechanism in case no data has been received for several minutes. During a retry, the old websocket connection must first be destroyed and proper jitter and exponential delay implemented.

Nun nutze ich dafür

IPS_SetProperty($io_id, 'Active', false/true);
IPS_ApplyChanges($io_id);

Laut Review-Richtline Nr. 13

Aber wie würde ich es sonst sauber implementieren können? Oder wäre das ein Ausnahmegrund?

Viele Grüße

Ein ApplyChanges reicht aus. Active (heißt der nicht Open??) brauchst du dafür nicht anfassen. Wenn der durch den User auf false stand, ist er danach immernoch geschlossen. Das musst du dann ggf. andersweitig abfangen und die Abfragen garnicht mehr starten.

Hi,

entweder verstehe ich deine Ausführung nicht, oder du meine :wink:

Der User macht gar nichts… Schaltet der User die Instanz aus, bleibt sie das auch.

Schaltet der User die Instanz an, läuft ein Timer mit, kommen Daten an, beginnt der Timer von neu.

Läuft der Timer jedoch ab (weil keine Daten kommen), DANN wird ein neuer Timer gestartet mit einer zufälligen Zeit zwischen 60-120 sek, die Instanz geschlossen und im Anschluss, nach Ablauf des Timers, wieder gestartet.

Dafür muss ich den Websocket aber schließen. Es läuft ja auch alles, die Frage ist aber, ist das ganze noch Review-Konform… Das Modul ist schon 2x (zurecht) wegen IPS_SetProperty Nutzung nicht durchgekommen, ich gehe daher diesmal alles nochmal durch und da fiel mir das auf.

Viele Grüße

1 „Gefällt mir“

@tobiasr meint bestimmt den IO also die websocket Instanz.

Wenn deine Instanz eine übergeordnete Instanz mit der Einstellung Open/Close aktive/inaktiv hat, dann nutzt man normalerweise diese und baut keine eigene in seine Instanz ein.

Michael

Das ist ein valider ausnahmegrund :slight_smile:

paresy

1 „Gefällt mir“

Genau diese i/o instanz (WS-Client) muss ich ja programmatisch für 60-120 sek schließen. Und das mache ich derzeit über das deaktivieren/aktivieren der Instanz mit

IPS_SetProperty($io_id, 'Active', false/true);
IPS_ApplyChanges($io_id);

Die Doku dazu gibt, für mich, keine andere Methode her, die Verbindung zu schließen.

perfekt, das ist schonmal gut. Jetzt muss ich mich mit den „eigenarten“ von Listen beschäftigen :crazy_face:

Ja, aber du solltest sie natürlich nur neu öffnen, wenn sie vorher auch schon aktiv war.
Wenn der User sie vorher deaktiviert hat, darfst du sie nicht einfach wieder aktivieren.
Michael