NEWS
Liste aus Temperaturen, Mittelwert wiedergeben [gelöst]
-
Hallo freunde,
ich habe ein Blockly Script welches mir Täglich einen Temperatur wert via Pushover schickt, nennen wir es "Status".
Nun möchte ich aber zusätzlich einen Mittelwert der letzen 24 stunden haben, bekomme es aber irgendwie gedanklich nicht hin es umzusetzen.
Mir wurde reichen wenn der Temperatur wert stündlich genommen wird, und dann einmal täglich der Mittelwert der letzten 24 Datenpunkte raus gezogen wird.
Am besten diese auch wieder überschreibt, also nur 24 werte in einer liste, aus welcher ich dann nach belieben den Mittelwert zeihen kann.
Vielleicht kann mir ja jemand auf die Sprünge helfen -
@Dom-Sch
Siehe hier. -
Ah toll, danke, etwa sowas habe ich mir vorgestellt, leider bin ich noch blutiger Anfänger, währe cool wenn ich das in blockly umsetzen könnte, um es im Nachhinein besser verstehen oder ggf. mal bearbeiten zu können.
-
@Dom-Sch sagte in Liste aus Temperaturen, Mittelwert wiedergeben:
das in blockly umsetzen
Erstelle erst einmal einen Datenpunkt vom Typ "Feld"("array"), in dem die 24 Werte gespeichert werden.
Als nächstes fülle den Datenpunkt mit den aktuellen Temperaturwerten.Das Script zum Füllen anschließend löschen und mit folgendem Blockly den Mittelwert ermitteln und in einen Datenpunkt schreiben.
-
hallo paul53,
erstmal danke für deine Hilfe, währe ich wohl nie drauf gekommen.
rein aus interesse wüsste ich mal gern wo diese list erzeugt wird, kann man die als datenpunkt irgendwo sehen? finde den datenpunkt nicht.des weiteren habe ich probleme mit dem "entferne letzen wert", das finde ich in meinem blockly garnicht. kann bei diesem block nur "setze für" oder "füge als" auswählen, aber nicht "entferne"
-
@Dom-Sch
so z.B. kannst du dir die Werte ins Log schreiben lassen.
-
@Dom-Sch sagte:
finde den datenpunkt nicht.
Den Datenpunkt musst Du im Reiter "Objekte" manuell anlegen. Oder per Blockly unter javascript.0
@Dom-Sch sagte in Liste aus Temperaturen, Mittelwert wiedergeben:
"entferne letzen wert", das finde ich in meinem blockly garnicht.
-
@Dom-Sch
Ich muss jetzt mal ganz dumm Fragen.. wieso dieser Aufwand mit der Liste ?Mit 2 Datenpunkten kannst du das Problem einfach lösen:
DP1: Anzahl der aufaddierten Werte
DP2: Summe der aufaddierten Werte
nach 24 Werten (oder alternativ per Zeitplan:
Teile DP1 durch DP2, speichere als Tageswert, setze DP1=0, setze DP2=0.A.
-
So, nun hab ich es endlich geschafft einen Datenpunkt zu erzeugen und ihn auch beschrieben mit 96 werten (habe es im Gedanken auf alle 15min geändert) natürlich vorerst alle gleich.
Wenn ich es richtig verstanden habe, brauche ich ja einen zweiten Datenpunkt der mit zur Ausgabe des Mittelwertes dient ?! Stimmt das so ?
Habe dein Script (Paul53) mal nachgebaut, ganz oben als Objekt ID habe ich den erstellten Datenpunkt ausgewählt (also die liste mit 96 werten).
Im Log taucht nun folgendes auf :
Das Script sieht nun so aus:
-
@Dom-Sch sagte
einen zweiten Datenpunkt der mit zur Ausgabe des Mittelwertes dient ?! Stimmt das so ?
Ja, Typ: Zahl, Einheit: °C
@Dom-Sch sagte in Liste aus Temperaturen, Mittelwert wiedergeben:
Im Log taucht nun folgendes auf :
Wurde der Datenpunkt "temp liste 1" vorher mit 96 Temperaturwerten gefüllt ?
@Dom-Sch sagte in Liste aus Temperaturen, Mittelwert wiedergeben:
auf alle 15min geändert
Dann muss der Zeitplan auch alle 15 Minuten triggern: "*/15 * * * *"
-
Ja werte habe ich rein schreiben lassen, hatte jetzt nur jede minute zum testen eingestellt, das dürfte doch nicht das problem herbeirufen oder, löscht ja nur einen wert und setzt einen neuen davor... sollte ihm doch egal sein wie oft das passiert, oder ?!
-
@Dom-Sch sagte:
das dürfte doch nicht das problem herbeirufen
Nein. Die Fehlermeldung deutet darauf hin, dass kein Array eingelesen wurde. Deshalb füge mal 2 Debug-Blöcke ein:
-
Habe nun den Datenpunkt "liste" geändert.
Erst den selbst erstellten Datenpunkt benutzt, nun den mit Blockly erstellten Datenpunkt, jetzt scheint es zu gehen, hab ich wohl was falsch gemacht beim erstellen
Kann man nen Datenpunkt einfach kopieren ? wollte den eigentlich wo anders haben, währe aber auch nicht ganz so dramatisch wenn nicht ... hab es 1:1 versucht nachzubauen, trotzdem scheint er den Datenpunkt nicht zu mögen, als welchen Grund auch immer, vielleicht muss er einfach im Verzeichnis javascript.0 liegen -
@Dom-Sch sagte:
hab ich wohl was falsch gemacht beim erstellen
Eher beim Befüllen mit den 96 Werten. Das kann man nicht per Hand, sondern nur per Script machen.
-
Hatte ich auch so gemacht wie du erlärt hast. stehen in beiden datenpunkten 96 werte drin. Mit dem einen geht es mit dem anderen nicht. Verstehe ich auch nicht wirklich.
Egal, geht ja jetzt, vielen Dank
-
Du hattest natürlich recht
Den Datenpunkt noch mal neu gefüllt, jetzt kann ich auch diesen nehmen, an dem Ort wo ich möchte. -
@xbow42
"und so umbauen" ..... wie geht das ????Hat sich erledigt - einfach blind Vielen Dank für die Anleitung
Hier mein Script:
Zu beachten ist, das sich durch die Mittelwertsberechnung bei einer grafischen Darstellung ein Shift ergibt....
-
@Muhagl Ich hab das so gelöst für einen laufenden Durchschnitt für 15min:
-
@paul53
Hallo,
bei mir läuft Dein blockly zum gleitenden Mittelwert seit einiger Zeit ohne Probleme:var Liste, Summe, i, Mittel; // einmalig Liste befüllen Liste = getState("0_userdata.0.Variablen.Lux_Durchschnitt").val; schedule("*/15 * * * * *", async function () { Liste.pop(); Liste.unshift(getState("zigbee.1.04cf8cdf3c7b6097.illuminance").val); setState("0_userdata.0.Variablen.Lux_Durchschnitt"/*Lux_Durchschnitt*/, Liste, true); Summe = 0; for (i = 1; i <= 80; i++) { Summe = (typeof Summe == 'number' ? Summe : 0) + Liste[(i - 1)]; } console.log(('Summe ist ' + String(Summe))); Mittel = Math.round(Summe / 80); setState("0_userdata.0.Variablen.Lux_Durchschnitt_Wert"/*Lux_Durchschnitt_Wert*/, Mittel, true); console.log(('Mittel ist ' + String(Mittel))); });
Neuerdings bekomme ich diesen Fehler:
15:28:30.012 error javascript.0 (10504) at Object.<anonymous> (script.js.common.Verschiedenes.Lux_Durchnitt_berechnen:8:9) 15:28:45.002 error javascript.0 (10504) script.js.common.Verschiedenes.Lux_Durchnitt_berechnen: TypeError: Liste.pop is not a function
Downgrade des javascript Adapters hat nicht geholfen, ebensowenig Neueingabe des scripts.
Was kann ich tun? -
@zahnheinrich
Offenbar enthält der Datenpunkt "0_userdata.0.Variablen.Lux_Durchschnitt" keine Liste mehr.
Welche Version des Javascript-Adpters? In neueren Versionen wurde auf JSON umgestellt, so dass es sein kann, dass die Liste neu befüllt werden muss. Einmalig ausführen:Vorher den Javascript-Adapter aktualisieren.