Hallo Uwe,
erstmal Entwarnung, nachdem ich eine Problem in meiner Zentrale beseitigt habe sieht es jetzt schon sehr gut aus.
Ich habe eine Testroutine gemacht, die all 8 sec fortlaufende Werte von 1.0-1.14 erzeugt und an STATE sendet. Die Schleife ist nach 15 Durchläufen genau 120 Sekunden lang. Der siebte Wert der Folge hat abweichend den Wert 0.5 und erstreckt sich von Sek. 56 bis 1:04. Nach 120 s beginnt der Zyklus von vorn. Die Statiskwerte, die dabei entstehen wurden alle aufgezeichnet und mit Offset 1,2,3-7 vertikal gestaffelt. Im Bild sind die Werte für ~FILL und ~SEC ausgeblendet. HISTORY_LEN hat den Wert 1 (Minute). Die roten und blauen Kästen entsprechen genau einer Minute. Ich habe sie so eingezeichnet, dass man den Effekt des 1-Minuten-Zeitfensters (möglichst gut) auf die MIN- und MAX-Werte erkennen kann.
Der rote Kasten bezieht sich auf den MIN-Wert (grün, Offset 4). Die rechte Grenze ist am Übergang des MIN-Wertes von 0.5 auf 1.0. Die linke Grenze befindet sich gerade vor dem ersten STATE-Wert (orange, Offset 1) bzw. Eingangswert ("Wrapper", gelb, kein Offset) der nach 0.5 wieder auf 1 gegangen ist, d.h. im Kasten/Zeitfenster sind nur Werte, die >= 1 sind. Das sieht also ok aus.
Der blaue Kasten bezieht sich auf den MAX-Wert (rot, Offset 5). Die rechte Grenze ist am Übergang des MAX-Wertes von 1.14 auf 1.08. Die linke Grenze ist gerade vor dem STATE-Wert bzw. Eingangswert der von 1.14 auf 1.00 zurückgegangen ist. Im Kasten/Zeitfenster sind also nur Werte die <=1.08 sind. Auch das sieht ok aus.
Ein anderes Thema ist das Verhalten beim, bzw. nach dem Reset. Nach einem Reset zeigen ~FILL und ~SEC eine 0 an. STATE und die Statistik-Werte MEAN, MEDIAN, MIN und MAX bleiben zunächst unverändert.
Trifft nun eine neuer Eingangswert ein, wird der STATE-Wert ersetzt und als ~SEC die Zeitspanne seit dem Eintreffen des letzten STATE-Wertes vor (!) dem Reset angezeigt. Offenbar bleibt der Zeitstempel des zuletzt empfangenen STATE-Wertes erhalten, trotz des Resets. Das Verhalten nach dem Reset in Bezug auf eine nicht gelöschte Vorgeschichte des letzten Messwertes macht das Verständnis kompliziert. Vielleicht wäre es besser, den ursprünglichen Zeitstempel durch den Zeitpunkt des RESET zu ersetzen. Dann weiß man jedenfalls genau, zu welchem Zeitpunkt die Statistik beginnt.
Eine zweite Frage wäre die Initialisierung. Zur Zeit ist es so, dass nach einem Reset STATE und die Statistikwerte MEAN, MEDIAN, MIN und MAX verschieden sind. Mit dem ersten Eingangswert nach einem Reset schaltet die Statistik aber komplett um auf dien vorigen (!) Eingangswert, der noch von vor dem RESET ist. Das liegt anscheinend daran, dass dieser Wert den ersten Wert für die Statistikberechnung liefert. Gleichzeitig wird als STATE schon der neue Wert angezeigt, der auch die MIN- und MAX-Werte beeinflusst.
Das berührt die Frage, ob eintreffende Werte den bisherigen Wert darstellen oder den ab jetzt geltenden. Aufgrund der Erfahrung, dass neue Werte vor allem bei aufgetretenen Änderungen generiert werden, muss man wohl die zweite Variante bevorzugen, wie es jetzt auch der Fall ist.
Die Überpüfung der Bildung von MEAN und MEDIAN habe ich bisher nicht hinbekommen, was nicht heißt, dass sie nicht richtig wären. Es ist nur äußerst kompliziert, Testfälle zu schaffen, an denen sich das leicht ablesen lässt.
Im Moment würde ich aber sagen, dass im eingeschwungenen Dauerbetrieb das Ganze sehr plausibel und richtig aussieht. Bei der Initialiserung nach dem RESET müsste man noch einmal überlegen, wie das am besten wäre. Abgesehen von der mathematischen Exaktheit ist hierbei auch leichte Nachvollziehbarkeit wichtig, wenn man nicht sehr viele Rückfragen zum Verständnis riskieren möchte.
Hier wäre noch das Skript zur Erzeugung der Eingangswerte:
Code: Alles auswählen
object o = dom.GetObject("Test:1").DPByHssDP("SET_STATE");
object o1 = dom.GetObject("Test:1").DPByHssDP("STATE");
real rVal;
integer iLT = ((localtime.ToInteger() % 84600) % 120) / 8;
if (iLT == 7) {rVal = 0.5;}
else {rVal = 1.0+iLT.ToFloat()/100.0;}
! WriteLine(iLT);
! WriteLine(rVal);
o.State(rVal);
! WriteLine(o1.State());
object oLogit = dom.GetObject("CUxD.CUX2801001:1.LOGIT");
oLogit.State("Wrapper"#";"#rVal);
Das Problem mit der Zentrale war übrigens ein (experimentelles) Shell-Skript zur Anbindung von Smarthome-Komponenten der Fritzbox, das schon seit zwei Jahren auf der Zentrale läuft. Das blockierte die REGA einmal pro Minute für ca. 8 Sekunden, was zur Auslassung und Verschiebung von geloggten Datenpunkten führte. Dadurch waren die Ergebnisse völlig unverständlich und wirkten fehlerbehaftet. Durch Ausführen im Hintergrund ließ sich das Problem anscheinend lösen.
Ich bin die nächsten zwei Tage anderweitig beschäftigt, also melde ich mich wohl erst am Samstag wieder.
VG,
Peter