NEWS
[Linux Shell-Skript] WLAN-Wetterstation
-
@Negalein Ich muss mal schauen was performanter in der Abfrage ist. Habe mal ein kleines JS "zusammen gehämmert" was die Daten per History (hab aber erst gegen Mittag mit dem sammeln begonnen) zieht:
Macht aktuell nur Min/Max/Durchschnitt und °C über 20°C?Mir war schon klar, dass ich es machen "darf"
Daran liegt es auch nicht, nur ist es direkt über das Script viel zu Ressourcen fressend, dass geht per DB/History und JS performanter (und auch einfacher).
Dann muss ich mir noch was mit dem Datenmanagement und den Datenpunkten überlegen.- Die Tagestemperaturen sollten so bleiben? Ein 31°C-Tag zählt zu >30 und zu >25 und zu >20 (ja, es war ja auch einer über 20/25°).
- soll(te) das 1x täglich (bspw. Mitternacht) aktualisiert werden? Die Datenmenge wären pro Datenpunkt 86400 / 16 = 5.600 DPs die sonst abgefragt werden müssen. Das sollte man nicht im Minutentakt ausführen ^^
-
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Mir war schon klar, dass ich es machen "darf"
kennst mich doch. Du bist da der King
Daran liegt es auch nicht, nur ist es direkt über das Script viel zu Ressourcen fressend, dass geht per DB/History und JS performanter (und auch einfacher).
kein Problem.
Die Tagestemperaturen sollten so bleiben? Ein 31°C-Tag zählt zu >30 und zu >25 und zu >20 (ja, es war ja auch einer über 20/25°).
genau. Am liebsten so wie am Screenshot. Auch mit den kalten Tagen
soll(te) das 1x täglich (bspw. Mitternacht) aktualisiert werden? Die Datenmenge wären pro Datenpunkt 86400 / 16 = 5.600 DPs die sonst abgefragt werden müssen. Das sollte man nicht im Minutentakt ausführen ^^
Ja, 1x am Tag sollte reichen. Geht eh nur um Tageswerte
-
@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Auch mit den kalten Tagen
Das ist auch easy going und recht einfach umzusetzen, ich habe zum testen aber erst mal nur die 4 Werte genutzt.
Aber egal ob es dann per Influx oder History wird, die Anzahl der "warmen/kalten" Tage ist etwas tricky. Ich möchte eigentlich eine Einzelabfrage umgehen, d.h. zB. für August 19 wären das 31 Tage x 13 Messwerte x Anzahl der Messwerte...
Deswegen wird es wohl auf einen JSON-Datenpunkt hinauslaufen, der dann täglich um die entsprechenden Gradtage erhöht wird. Dann brauche ich die Vorjahresmonatsabfrage immer nur einmalig für den Monat ausführen.
...mal drüber schlafen -
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
mal drüber schlafen
Ich werde dich virtuell dabei unterstützen
-
@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Ich werde dich virtuell dabei unterstützen
War auch teilweise erfolgreich, wenn auch mehr Fragen offen sind als ich derzeit Antworten habe. Die Werte ermitteln ist "easy peasy", aber die Statistik hat doch so ihre Fallstricke.
Zumindest läuft es aktuell auf InfluxDB hinaus, da es viele (auch wg. Grafana) eh am laufen haben. History produziert nur zusätzlich eine Menge an Daten, ist deutlich langsamer und ineffizient in der Abfrage zu handeln.
Ich hatte zwar zuvor schon eine tägliche Auswertung angedacht, dass muss aber nun so sein, denn eine monatliche Auswertung würde zu lange dauern. Bei einem Turnus von 16 Sekunden der Wetterstation haben wir ~ 5.600 Messwerte pro Tag pro Unit. Wir bräuchten also die Aussentemperaturwerte, Regenmenge und Windgeschwindigkeit. Eine Abfrage der Tageswerte dauert per Influx aber schon 2-3 Sekunden (die Ermittlung der div. Werte ist dabei so gut wie nicht messbar). Da ist die monatliche Abfrage nicht mehr zu handeln: 3 Sek x 3 Abfragen x 30 Tage = ~fast 5(!) Minuten...
...also täglich speichern, einlesen, addieren...
...und so nebenbei mal Gedanken gemacht, wie denn die DPs überhaupt aussehen müssen damit man die dynamisch in der VIS anzeigen kann...btw: Fragen etc. zum eigentlichen Thread natürlich weiter gerne hier, aber IMHO sind die letzten Posts nicht OT, sondern gehören doch irgendwie zum Thema und es "dürfen" sich auch gerne mehr beteiligen
-
@Negalein Dann mal ein erster Test. Neues JS anlegen (am besten in einer neuen Instanz, dann knallt es dir nicht im Fehlerfall den eigentlichen JS-Adapter weg. Sollte zwar nicht, aber man weiß ja nie... ) :
/* Wetterstation-Statistiken (c)2020 by SBorg V0.0.1 - 05.09.2020 erste Alpha + Min/Max/Durchschnitt/Temp über 20°? holt die Messwerte aus einer InfluxDB und erstellt eine Statistik ToDo: vieles ;) known issues: keine */ let werte = []; let zeitstempel = new Date(); let start = new Date(zeitstempel.getFullYear(),zeitstempel.getMonth(),zeitstempel.getDate(),0,0,0); start = start.getTime(); let end = new Date(zeitstempel.getFullYear(),zeitstempel.getMonth(),zeitstempel.getDate(),23,59,59); end = end.getTime(); sendTo('influxdb.0', 'query', 'select * FROM "javascript.0.Wetterstation.Aussentemperatur" WHERE time >= ' + (start *1000000) + ' AND time <= ' + (end *1000000), function (result) { if (result.error) { console.error('Fehler: '+result.error); } else { //console.log('Rows: ' + JSON.stringify(result.result[0])); for (let i = 0; i < result.result[0].length; i++) { werte[i] = result.result[0][i].value; } } /* const json = JSON.stringify(result.result[0][0]); const obj = JSON.parse(json); console.log(obj.ts); console.log(obj.value); */ Math.sum = (...werte) => Array.prototype.reduce.call(werte,(a,b) => a+b); let Durchschnitt = (Math.sum(...werte)/werte.length).toFixed(2); if (Math.max(...werte) > 20) {console.log('Temperatur lag heute über 20°C');} console.log('Tiefstwert: ' + Math.min(...werte) + '°C'); console.log('Höchstwert: ' + Math.max(...werte) + '°C'); console.log('Durchschnitt: ' + Durchschnitt + '°C'); console.log('Erster Messwert: ' + new Date(result.result[0][0].ts).toISOString() + ' ***' + result.result[0][0].value); console.log('Letzter Messwert: ' + new Date(result.result[0][werte.length-1].ts).toISOString() + ' ***' + result.result[0][werte.length-1].value); console.log('Anzahl Datensätze: ' + werte.length); }); function timeConverter(UNIX_timestamp){ let a = new Date(UNIX_timestamp); let months = ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez']; let year = a.getFullYear(); let month = months[a.getMonth()]; let date = a.getDate(); let hour = a.getHours(); let min = a.getMinutes(); let sec = a.getSeconds(); let time = pad(date) + '. ' + month + ' ' + year + ' ' + pad(hour) + ':' + pad(min) + ':' + pad(sec) ; return time; } function pad(n) { return n<10 ? '0'+n : n; } console.log('Daten ab ' + timeConverter(start)); console.log('Daten bis ' + timeConverter(end));
Anpassen musst du nur #16 ob dein Influx unter Instanz "0" läuft und den DP-Zweig für die Aussentemperatur.
Sollte dann so nach dem starten aussehen:
Interessieren würde mich dann- allgemeine Laufzeit
- dein System (PI, bzw. CPU + RAM)
- sind die Werte plausibel
- speziell gegen ~23:5x Uhr
- Laufzeit
- Anzahl der Datensätze
Wenn der Ansatz so funktioniert werde ich zum "master-Branch" auf GitHub einen "Beta" anlegen, um dort dann das aktuelle JS vor zu halten.
-
OT
nur für Euch zur Info, Montag Aldi Nord, allerdings nur Online, Gruß Bernd
-
++++ inklusiv Support von @skokarl , der demnächst für Neulinge hier kommt ....
-
@Glasfaser sagte in [Linux Shell-Skript] WLAN-Wetterstation:
++++ inklusiv Support von @skokarl , der demnächst für Neulinge hier kommt ....
Ich komm seit nem halben Jahr zu nix mehr, eine Baustelle nach der anderen, Corona Mist,
und noch nen Mops Welpen für die Frau....also, Support erst ab 2022
außerdem bin ich bei Euren geilen Views und Datenbanken schon lange raus ... -
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Dann mal ein erster Test.
Du bist der Hammer
Also, das Log sieht gut aus.
Interessieren würde mich dann
allgemeine Laufzeit
wie meinst du das?
dein System (PI, bzw. CPU + RAM)
Synology 718+, 10 GB RAM, im Docker
sind die Werte plausibel
Ja, auf den ersten Blick sind sie es
speziell gegen ~23:5x Uhr
Laufzeitwie meinst du das?
Anzahl der Datensätze
stehen die auch wieder im Log? Um 23:59? Oder sind die dann anders zu finden?
-
@SBorg Ich sehe wie sich die Umsetzung der von mir lang erwarteten Extremwerte anbahnt und stehe gern für Tests bereit. Ich hab mir das für bestimmte Werte per Blockly schon selber hemdsärmelig zusammengebastelt indem ich jeweils den aktuellen Wert mit dem Extremwert vergleiche und ggf. in den Extremwert Datenpunkt schreibe.
Das direkte Außlesen aus der DB gefällt mir aber viel besser. -
@skokarl sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Ich komm seit nem halben Jahr zu nix mehr, eine Baustelle nach der anderen
Willkommen im Club
@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
wie meinst du das?
Wie lange das Skript für die Bearbeitung braucht. Bei dir auf der Synology waren es bei ~900 Datensätze 700ms. Das ist absolut akzeptabel.
Auf meinem performanten Quad Core, bei der ungefähr selben Anzahl an Datensätzen, aber schon mit drei Abfragen (Temp, Wind und Regen): 35ms
rot: Start | grün Ende@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
speziell gegen ~23:5x Uhr
Laufzeitwie meinst du das?
Anzahl der Datensätze
stehen die auch wieder im Log? Um 23:59? Oder sind die dann anders zu finden?
Die Datensätze stehen bei jedem Aufruf zum Ende der Skriptverarbeitung immer da. Die variieren halt je nach deinem Intervall der Station, ob du in Influx alles loggst, oder nur Änderungen, oder...
Ein Test kurz vor Mitternacht verarbeitet dann in etwa die maximal auftretenden Datensätze. Aber es muss nicht unbedingt 23:59 Uhr sein, denn die paar Datensätze wenn du es um 23:55 Uhr ausführst machen den Bock nicht wirklich fett.
Zumindest sieht es nach einer zufriedenstellenden Performance aus. Ich habe aus versehen einen Fehler bei den Timecodes gemacht und alle Datensätze abgefragt. 173.000 Datensätze in 5 Sekunden. Influx ist echt flott@Rushmed Ich hatte das schon lange auf der Agenda, nur nie direkt beim Shell-Skript. Das taugt an der Stelle einfach nicht. Da ist JS einfach die bessere/performantere Wahl.
-
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
@Rushmed Ich hatte das schon lange auf der Agenda, nur nie direkt beim Shell-Skript. Das taugt an der Stelle einfach nicht. Da ist JS einfach die bessere/performantere Wahl.
Du bist der Spezialist, ich freu mich nur auf die Lösung und kann helfen die lauffähig zu bekommen.
-
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
speziell gegen ~23:5x Uhr
Wenn ich das richtig sehe, sind es 102 ms für 1319 Datensätze.
Und kurz nach Mitternacht mit nur 2 Datensätzen auch 100 ms.
Spielt dann eigentlich keine Rolle, ob 2 oder 1300 Datensätze.
-
@Negalein Sieht gut aus
Wenn man noch Zeit für die Ausgabe abzieht absolut ideal. Auch die Durchschnittsberechnung funktioniert.
Auf GitHub gibt es nun einen "beta-Branch", dort liegt zukünftig das aktuelle JS. Bitte mal testen wie schnell das ist.
Bei mir ~1.2 Sekunden, allerdings werden hier schon drei Datenbankabfragen über einen Zeitraum von einem Monat gefahren. Sind bei mir immerhin 33k Datensätze und dann noch die Auswertung. Ist ein reiner Performancetest ob auch notfalls eine Monatsauswertung durchführbar wäre.
Die Daten sollten auch soweit stimmen, nur über 20/25° stimmt dann nicht mehr und die Regenmenge ist nonsens. Die ist kein Einzelwert wie die anderen Messwerte, sondern addiert sich auf. Dann darf ich aber nicht jeden Messwert nochmals aufaddieren... -
@SBorg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Bei mir ~1.2 Sekunden, allerdings werden hier schon drei Datenbankabfragen über einen Zeitraum von einem Monat gefahren. Sind bei mir immerhin 33k Datensätze
15:36:18.125 info javascript.1 (1029) Start javascript script.js.common.Wetterstatistik 15:36:18.137 info javascript.1 (1029) script.js.common.Wetterstatistik: registered 0 subscriptions and 0 schedules 15:36:27.631 info javascript.1 (1029) script.js.common.Wetterstatistik: Daten ab 06. Aug 2020 00:00:00 15:36:27.632 info javascript.1 (1029) script.js.common.Wetterstatistik: Daten bis 06. Sep 2020 23:59:59 15:36:27.664 info javascript.1 (1029) script.js.common.Wetterstatistik: Temperatur lag heute über 20 °C 15:36:27.665 info javascript.1 (1029) script.js.common.Wetterstatistik: Temperatur lag heute über 25 °C 15:36:27.666 info javascript.1 (1029) script.js.common.Wetterstatistik: Tiefstwert: 9.5 °C 15:36:27.667 info javascript.1 (1029) script.js.common.Wetterstatistik: Höchstwert: 32.77 °C 15:36:27.668 info javascript.1 (1029) script.js.common.Wetterstatistik: Durchschnitt: 20.78 °C 15:36:27.669 info javascript.1 (1029) script.js.common.Wetterstatistik: Maximum Windböe: 60.51 km/h 15:36:27.689 info javascript.1 (1029) script.js.common.Wetterstatistik: Regenmenge: 97581.90 l/m² 15:36:27.700 info javascript.1 (1029) script.js.common.Wetterstatistik: Regenmenge/Tag: 21.1 l/m² 15:36:27.700 info javascript.1 (1029) script.js.common.Wetterstatistik: Erster Messwert: 2020-08-05T22:00:01.627Z ***14.72 15:36:27.700 info javascript.1 (1029) script.js.common.Wetterstatistik: Letzter Messwert: 2020-09-06T13:33:04.987Z ***18.88 15:36:27.700 info javascript.1 (1029) script.js.common.Wetterstatistik: Anzahl Datensätze: 37375
Was sagt der Meister?
Mir ist noch was aufgefallen.
Die Daten sind vom 6. 9. 2020
Heute hatten wir aber definitiv keinen Höchstwert von 32,77 °C
Oder von welchem Zeitraum nimmt er diesen Wert?Ah, sehe gerade, beim Regen 97581 l/m²
Das dürfte utopisch sein.
wären 251 l/m² seit Betreb der Station. -
19:37:01.630 info javascript.0 (3836) Start javascript script.js.Wetterstation_Statistik 19:37:01.650 info javascript.0 (3836) script.js.Wetterstation_Statistik: registered 0 subscriptions and 0 schedules 19:37:11.462 info javascript.0 (3836) script.js.Wetterstation_Statistik: Daten ab 06. Aug 2020 00:00:00 19:37:11.463 info javascript.0 (3836) script.js.Wetterstation_Statistik: Daten bis 06. Sep 2020 23:59:59 19:37:11.468 info javascript.0 (3836) script.js.Wetterstation_Statistik: Temperatur lag heute über 20 °C 19:37:11.469 info javascript.0 (3836) script.js.Wetterstation_Statistik: Temperatur lag heute über 25 °C 19:37:11.471 info javascript.0 (3836) script.js.Wetterstation_Statistik: Tiefstwert: 8.61 °C 19:37:11.472 info javascript.0 (3836) script.js.Wetterstation_Statistik: Höchstwert: 39.11 °C 19:37:11.472 info javascript.0 (3836) script.js.Wetterstation_Statistik: Durchschnitt: 23.30 °C 19:37:11.475 info javascript.0 (3836) script.js.Wetterstation_Statistik: Maximum Windböe: 47.96 km/h 19:37:11.476 info javascript.0 (3836) script.js.Wetterstation_Statistik: Regenmenge: 11029.90 l/m² 19:37:11.476 info javascript.0 (3836) script.js.Wetterstation_Statistik: Regenmenge/Tag: 47.1 l/m² 19:37:11.476 info javascript.0 (3836) script.js.Wetterstation_Statistik: Erster Messwert: 2020-08-05T22:00:29.754Z ***16.5 19:37:11.477 info javascript.0 (3836) script.js.Wetterstation_Statistik: Letzter Messwert: 2020-09-06T17:36:35.284Z ***17.61 19:37:11.477 info javascript.0 (3836) script.js.Wetterstation_Statistik: Anzahl Datensätze: 30343
Meine Zeitmessung auf nem PI4.
-
@Rushmed sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Meine Zeitmessung auf nem PI4.
Höchstwert: 39.11 °C
WOW, wo wohnst? -
@Negalein Jena City und ich wohne im Dachgeschoss
-
Danke euch beiden.
@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Heute hatten wir aber definitiv keinen Höchstwert von 32,77 °C
Oder von welchem Zeitraum nimmt er diesen Wert?Ist ja auch nicht von heute (siehe meinen letzten Post "... über einen Zeitraum von einem Monat gefahren...". Schau mal genau auf ab wann die Daten ausgewertet werden ("Aug." ), und da war halt wohl so ein heißer Tag dabei. Es ging hier um den Test wie schnell eine kpl. Monatsauswertung durchgeführt werden kann. Hintergrund: s.u.
@Negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Ah, sehe gerade, beim Regen 97581 l/m²
Das dürfte utopisch sein.
wären 251 l/m² seit Betreb der Station.Steht auch im vorherigen Post
Kleiner Denkfehler meinerseits. Ich addiere jeden Messwert auf. Das ist aber falsch, da sich der Messwert nur erhöht wenn es regnet. Beispiel Messwertereihe: 0-0-0-1(es regnet einen Liter und hört dann auf)-1-1-3(regnet wieder zwei Liter)-3-3...
Korrekt ist jetzt natürlich nur drei Liter, da ich aber munter addiere: 1+1+1+3+3+3... = 12 und mehr Liter.Hintergrund für den Test der Monatsauswertung ist auch "einfach" erklärt:
Die Auswertung für den heutigen Monat ist recht einfach/schnell. Dazu wird nach Mitternacht das JS gestartet. Es wertet dann den Vortag aus und schreibt die Daten zum aktuellen Monat hinzu. Soweit so gut (und auch einfach).
Was ist aber mit den Daten aus dem Vorjahr (also aktuell Sep. 2019)?
Ich kann natürlich den aktuellen Monat immer in einem zusätzlichen Datenpunkt ablegen, dann hätte man die Vorjahreswerte aber erst in einem Jahr (also Sep. 2020 im Sep. 2021) zur Verfügung. Die DPs müssten dann auch dynamisch angelegt werden. Sind zum einen dann sehr viele, ich lege im Grunde schon wieder eine Datenbank an (obwohl ja alles schon in der Influx steht) und in der VIS kommt man wg. der dynamischen DPs nicht um Bindings herum. In Summe nicht gerade sehr prickelnd und innerhalb der VIS performant...
Deswegen möchte ich zum 1. des Monats immer eine kpl. Monatsauswertung des entsprechenden Monats aus dem Vorjahr fahren. Das dauert bei euch zwar 8-10 Sekunden, ist aber einmalig im Monat Nachts um x:xx Uhr IMHO vertretbar. Bei Multihost kann man es ggf. sogar auslagern, bei Single Host kommt es im ioB halt schlimmstenfalls mal zu einem kurzen lagg.
Dann hätte man aber keine unnütze 2. Datenbank. Der Hauptvorteil wäre aber für die VIS, man kann mit festen DPs arbeiten, also bspw. Order "aktueller Monat" und den x-DPs mit aktuellen Werten darin, und Ordner "Vorjahr" mit den entsprechenden selben fixen DPs und Vorjahreswerten. Macht den Umgang/Gestaltung in der VIS flexibler und einfacher.