Unterschiedlich.
Es gibt für beide Varianten Vor- und Nachteile.
Somit ist eine generelle Aussage wohl fehl am Platz.
Mal etwas zum Hintergrund:
Egal was Script, Module oder Instanzen in IPS so ‚treiben‘. Jede Änderung und jedes Update eines Objektes (aller Typen!) wird intern in IPS durch eine Nachrichtenschlange gejagt.
Ebenso werden immer alle diese Daten an die aktiven Clients (Console, WebFront, IPSView) übergeben.
Extrem viele und schnelle Änderungen erzeugen also eine deutlich höhere Last innerhalb IPS und auch auf den Clients.
Wer schon mal 500 Objekte gelöscht hat und dann eine Meldung mit ‚MessageBuffer‘ der Console hatte, der hat erlebt wie die Console einfach diese Flut an Meldungen nicht mehr verarbeiten konnte.
Wenn ich mir jetzt überlege das 10-30 Variablen alle 5 Sekunden beschrieben werden… vernachlässigbar
Somit Vorteile/Nachteile u.a. wenn du immer die Werte schreibst:
[ul]
[li]User kann mit einem Event auf aktualisieren Triggern.[/li][li]Je nach Datenmenge höhere Systemlast.[/li][li]Logfile wird je nach Intervall mehr oder weniger gefüllt.[/li][/ul]
Wenn du die Werte nur bei Änderungen schreibst:
[ul]
[li]User kann nicht mit einem Event auf aktualisieren Triggern.[/li][li]User sieht nur Statusänderungen und wenn jetzt lange nichts passiert, sieht er nicht ob überhaupt noch Daten empfangen und verarbeitet werden[/li][/ul]
Bei dem Archiv (Logging) bin ich gerade überfragt, ob es jeden Wert mitschreibt, oder selber noch mal prüft ob es eine Änderung gab. Habe ich noch nicht nachgesehen :o
Ich habe es z.B. bei meinem Homematic-Modul so gelöst, das ich es anhand des Timestamp der Gegenseite (CCU) entscheide ob der Wert neuer (=schreiben) oder älter (= nicht schreiben) ist.
Bei den XBees wird immer geschrieben, da es Events von der Hardware sind, welche der User in der Hardware selbst konfigurieren muss.
Und bei den SqueezeBoxen werden nur Änderungen geschrieben, weil ein Datensatz immer alle Werte (teilweise mehrfach) enthält.
Das dann bei 20-30 Variablen pro Gerät + MediaObjekt (Cover) alle 2 Sekunden; fand ich dann nicht mehr so sinnvoll immer alles zu schreiben.
Außerdem brauche eine Rückmeldung ob der neue Wert sich vom Alten unterscheidet.
Daraus ist das so etwas entstanden:
private function SetValueBoolean($Ident, $value)
{
$id = $this->GetIDForIdent($Ident);
if (GetValueBoolean($id) <> $value)
{
SetValueBoolean($id, $value);
return true;
}
return false;
}
Probleme mit ThreadSafe habe ich da nicht, da die Empfangsroutine der Daten im Splitter eine Semaphore nutzt. Somit können auch nie zeitgleich Daten in den Geräten empfangen und verarbeitet werden.
Michael