NEWS
[Linux Shell-Skript] WLAN-Wetterstation
-
@sborg said in [Linux Shell-Skript] WLAN-Wetterstation:
Die Formel gilt aber nur von 5°C bis ~10°C und wird jetzt korrekt berücksichtigt
Falsch!
Gilt bis max. 10°C und ab 5 km/h Windgeschwindigkeit
-
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Neues Release des Wetterstation WLAN-Skriptes auf GitHub V2.7.0
wiedermal will es nicht so wie ich möchte
wetterstation.sh & .sub ausgetauscht
./ws_updater.sh gestartetEs kommt nur
dietpi@DietPi:~$ cd /home/iobroker dietpi@DietPi:/home/iobroker$ ./ws_updater.sh 'bc' installiert: ✓ 'jq' installiert: ✓ Updater ist nur für Versionen ab V1.4.0 ! dietpi@DietPi:/home/iobroker$
.conf bleibt unverändert (ersichtlich am Dateidatum)
was mach ich wieder falsch?
-
@negalein Sorry, my fault
Habe es jetzt oben mal deutlicher geschrieben. Du musst auch den aktuellen ws_upsater.sh nutzen (also ebenfalls ersetzen).
Also Version 1.2.3 des Updaters zu Version 1.2.3 des Skriptes. Muss nämlich jetzt so aussehen (bei dir fehlt die Versionsausgabe = Updater auf 2.6.0 und der kann mit 2.7.0 noch nix anfangen):
-
@boronsbruder lt. Wiki nicht bis 10° sondern ca. 10°C. Da es eine Berechnung ist, auch wenn man bei 10.99 eher von 11 sprechen würde, sind es dann trotzdem noch immer 10. Runden darf man hier eigentlich auch nicht, denn sonst bewirkt eine Eingangsänderung von einem hundertstel (!) Grad eine Ausgangsänderung von einem Grad.
Irgendwo muss man halt die Grenze setzen. Das kann man nun sehen wie man will, aber mache ich es nun nach Schema A, sind wieder welche die es aber lieber nach Schema B wollen...
Aber im Grunde ist es eh nonsens, denn der Temperatursensor ist ungenau, der Windmesser ebenso, und wenn wir schon dabei sind, die Berechnung ist eigentlich auch nur gültig wenn der Wind 10 Meter über Grund (nicht in 10 Meter Höhe) gemessen wird. Wer hat schon einen 10m-Mast im Garten stehen und wie ich deswegen auch oben schon schrieb, wer wird auf der Haut fühlen ob das nun tatsächlich 10.4° oder 10.7° C sind... -
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Sorry, my fault
Danke, läuft!
Nächste Frage/Problem!
Ich hab gerade das neue V8 Dashboard importiert.
2 DP kann ich nicht zuordnen. Magst du das Script hier zur Verfügung stellen?
Windrose:
Plugin ist installiert, bekomme aber im Dashboard einen Fehler.
Funktioniert plötzlich!
Aussentemperatur steht nur N/A, obwohl der DP passt.
Im alten Dashboard wird er angezeigt.
hier verwendest du ein paar Alias.
Auf was beziehen sich die? Dann könnte ich die orig. DP verwenden. Bin mit Alias auf Kriegsfuss. -
@negalein hehe, genau so hats mich beim letzten update auf die schnauze gehaun. die ws_updater.sh gehört auch raufgejubelt...
-
Man kann auch direkt den aktuellen Updater von GitHub nutzen (per Terminal):
bash <(curl -sLf https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh)
Es sei aber erwähnt, dass man hier die Kontrolle abgibt. Mit obiger Zeile führt ihr das entsprechende Skript einfach aus.
Das macht zwar auch jeder bei der ioB-Installation, ich möchte es dennoch erwähnen. Mir ist aber auch bewusst, dass wohl 99% der User eh die *.sh's und *.sub ausführen ohne dort jemals hineinzuschauen. Da macht es dann auch keinen Unterschied mehr ob man es direkt ausführt...
@negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Magst du das Script hier zur Verfügung stellen?
Nö
Ich habe mal paar Werte zur Veranschaulichung von mir drinnen gelassen. Es ermittelt Max_24h, Min_24h, Mean_24h, Median_24h, Max_1h, Min_1h und Mean_1h (vom Datenpunkt):/* ######################################################################################################## Berechnung von gleitendem Durchschnitt, Minimum und Maximum über einen Zeitraum von 1h und 24h Version 1.4.1 ######################################################################################################## Berechnet Min/Max, Durschschnitt und Median über die letzten 24h. Berechnet Min/Max, Durschschnitt über die letzte 1h. IDs aller benötigten Datenpunkte Als Array im Array mit folgendem Format: 1. original Datenpunktname 2. neuer Datenpunktname Beispiel: javascript.0.Status.Temperatur.Außen javascript.0.Status.Luftfeuchtigkeit.Außen 3. Beschreibung des Messwertes (zur Erzeugung neuer Datenpunkte) Beispliele: Temperatur Luftfeuchtigkeit 4. Einheit (zur Erzeugung neuer Datenpunkte) Beispiele: °C, %H Ist beliebig erweiterbar und für beliebige Werte nutzbar. */ "use strict"; const idData = [['javascript.0.Wetterstation.Innentemperatur','javascript.0.Statistik.Temperatur.Wohnzimmer','Temperatur','°C'], ['javascript.0.Temperaturen.Zimmer.Buero.Temp_Buero','javascript.0.Statistik.Temperatur.Buero','Temperatur','°C'], ['javascript.0.Wetterstation.Aussentemperatur','javascript.0.Statistik.Temperatur.Außen','Temperatur','°C'], ['javascript.0.Wetterstation.Innenfeuchtigkeit','javascript.0.Statistik.Luftfeuchtigkeit.Wohnzimmer','Luftfeuchtigkeit','%H']]; //Datenpunkt zur Speicherung aller internen Daten const dpData='javascript.0.Statistik.Statistic'; // ######################################################################################################## // Implementierung -- hier nichts mehr ändern // ######################################################################################################## // globale Konstanten const tc = 5; // Abtastrate in Minuten const statDataLength24 = Math.round((24 * 60) / tc); // Anzahl der Werte für 24h const statDataLength1 = Math.round(60 / tc); // Anzahl der Werte für stündlich // globale Variablen var listStatData; //interne Speicherung aller Werte //Funktion zum einmaligem initialisieren aller Datenpunkte function initializeStatData() { // Datenpunkt zur Speicherung der internen Werte erzeugen createState(dpData, 0, false, { name: "StatisticData", read: true, write: true, desc: 'Statistische Daten', type: 'string', def: '', role: 'json' }); //internes Array initialisieren var needInit = false; try { listStatData = JSON.parse(getState(dpData).val); } catch (ex) { needInit = true; } if (needInit || !listStatData || (listStatData.length < idData.length)) { listStatData = new Array(idData.length); } //logDebug('initializeStatData for', dpData, listStatData); for (var i = 0; i < idData.length; i++) { if (!listStatData[i]) { listStatData[i] = {}; } listStatData[i].value = idData[i][1]; listStatData[i].max24h = idData[i][1] + '.Max_24h'; listStatData[i].min24h = idData[i][1] + '.Min_24h'; listStatData[i].mean24h = idData[i][1] + '.Mean_24h'; listStatData[i].median24h = idData[i][1] + '.Median_24h'; listStatData[i].max1h = idData[i][1] + '.Max_1h'; listStatData[i].min1h = idData[i][1] + '.Min_1h'; listStatData[i].mean1h = idData[i][1] + '.Mean_1h'; createState(listStatData[i].value, 0, false, { name: idData[i][2], read: true, write: true, desc: idData[i][2]+ ' Aktueller Wert', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].max24h, 0, false, { name: 'Maximum_24h', read: true, write: true, desc: idData[i][2] + ' Maximum', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].min24h, 0, false, { name: 'Minimum_24h', read: true, write: true, desc: idData[i][2] + ' Minimum', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].mean24h, 0, false, { name: 'Mittelwert_24h', read: true, write: true, desc: idData[i][2] + ' Mittelwert', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].median24h, 0, false, { name: 'Median_24h', read: true, write: true, desc: idData[i][2] + ' Median', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].max1h, 0, false, { name: 'Maximum_1h', read: true, write: true, desc: idData[i][2] + ' Maximum', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].min1h, 0, false, { name: 'Minimum_1h', read: true, write: true, desc: idData[i][2] + ' Minimum', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); createState(listStatData[i].mean1h, 0, false, { name: 'Mittelwert_1h', read: true, write: true, desc: idData[i][2] + ' Mittelwert', type: 'number', def: 0, unit: idData[i][3], role: 'value' }); if (needInit || !listStatData[i].data || (listStatData[i].data.length != statDataLength24)) { listStatData[i].data = new Array(statDataLength24); // 1. Script start: Liste und String-Datenpunkt füllen var x = getState(idData[i][0]).val; for (var j = 0; j < statDataLength24; j++) { listStatData[i].data[j] = x; } //logDebug(listStatData[i], i); setStateDelayed(listStatData[i].value, x, false, 1000); setStateDelayed(listStatData[i].min24h, x, false, 1000); setStateDelayed(listStatData[i].max24h, x, false, 1000); setStateDelayed(listStatData[i].mean24h, x, false, 1000); setStateDelayed(listStatData[i].median24h, x, false, 1000); setStateDelayed(listStatData[i].min1h, x, false, 1000); setStateDelayed(listStatData[i].max1h, x, false, 1000); setStateDelayed(listStatData[i].mean1h, x, false, 1000); } } setState(dpData, JSON.stringify(listStatData)); } //Berechnung der Werte function calcStatData() { if (!listStatData || (idData.length != listStatData.length)) { initializeStatData(); } //logDebug('starting calcStatData'); for (var i = 0; i < idData.length; i++) { listStatData[i].data.pop(); //Remove the last element of an array var x = parseFloat(getState(idData[i][0]).val); listStatData[i].data.unshift(x); //Add new items to the beginning of an array setState(listStatData[i].value, x); var min = x; var max = x; var sum = 0.0; for (var j = 0; j < statDataLength24; j++) { var s = parseFloat(listStatData[i].data[j]); if (s < min) min = s; if (s > max) max = s; sum += s; if (j == (statDataLength1-1)) { setState(listStatData[i].min1h, min); setState(listStatData[i].max1h, max); setState(listStatData[i].mean1h, round(sum / statDataLength1, 2)); } } setState(listStatData[i].min24h, min); setState(listStatData[i].max24h, max); setState(listStatData[i].mean24h, round(sum / statDataLength24, 2)); setState(listStatData[i].median24h, getMedian(listStatData[i].data)); } setState(dpData, JSON.stringify(listStatData)); } function getMedian(args) { if (!args.length) {return 0} var numbers = args.slice(0).sort((a,b) => a - b); var middle = Math.floor(numbers.length / 2); var isEven = numbers.length % 2 === 0; return isEven ? (numbers[middle] + numbers[middle - 1]) / 2 : numbers[middle]; } /** * round a number * @param value to round * @param exp exponent to round * @returns the round number */ function round(value, exp) { if (typeof exp === 'undefined' || +exp === 0) return Math.round(value); value = +value; exp = +exp; if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) return NaN; // Shift var values = value.toString().split('e'); value = Math.round(+(values[0] + 'e' + (values[1] ? (+values[1] + exp) : exp))); // Shift back values = value.toString().split('e'); return +(values[0] + 'e' + (values[1] ? (+values[1] - exp) : -exp)); } initializeStatData(); schedule('*/' + tc + ' * * * *', function () { calcStatData(); });
@negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Aussentemperatur steht nur N/A, obwohl der DP passt.
Im alten Dashboard wird er angezeigt.Stell mal bei "FROM" von "autogen" auf "default" um, dann sollte es funktionieren (lt. des diesbzgl. 2. Screenys).
@negalein sagte in [Linux Shell-Skript] WLAN-Wetterstation:
hier verwendest du ein paar Alias.
Auf was beziehen sich die? Dann könnte ich die orig. DP verwenden. Bin mit Alias auf Kriegsfusshttps://forum.iobroker.net/post/654787
Das sind Übertragung an OSEM/Windy erfolgreich,
Batteriestatus Wettermast, Kommunikation OK (bzw. Fehler),
EasyWeather-Firmware up-to-date und versteckt das Bomm-Theme-PanelAlias' sind (oder waren, hab es mit der neuen Grafana-Version noch nicht probiert) nötig, da die DPs Boolean sind und Grafana damit nicht umgehen kann. Die Alias' setzen dann einfach false/true nach 0/1 um
-
@sborg said in [Linux Shell-Skript] WLAN-Wetterstation:
@rand sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Danke - leider ist die Abweichung nicht konstant
Ist sie auch nicht. Bis ~14:00 Uhr ist der gap recht groß, dann bis ~19:00 Uhr relativ identisch und dann liegt er sogar darüber. Mit einem festen Wert kann man hier also nicht arbeiten. Vermutlich ist da ein Algorithmus dahinter der auch die Temperatur berücksichtigt.Nur der Vollständigkeit halber:
Ich glaube das liegt an den beiden unterschiedlichen Skalen...Ich habe jetzt einen statischen Wert eingetragen (basierend auf der Differenz zwischen meinem Absoluten Messwert und dem nächsten geeichten Messpunkt, [@Boronsbruder 's Vorschlag mit https://en.allmetsat.com/metar-taf/germany.php?icao=ETHL] umgerechnet mit https://rechneronline.de/barometer/hoehe.php auf meine Höhe und aktuelle Temperatur.
(Das ist zwar noch nicht wirklich richtig, da mein absoluter Wert rein rechnerisch ~1,5bar zu niedrig ist (für die Höhe/Temperaratur) aber das wird den Ungenauigkeiten geschuldet sein. Leider kann das GW keine positiven Korrekturwerte für den absoluten Druck - wer unter dem Meereslevel wohnt hat Pech gehabt...)Auch bei mir zeigt der Chart das es tageszeitliche "Unterschiede" gibt, die aber bei genauerem Hinsehen gar nicht vorhanden sind:
Detail - Chart identisch, Differenz von 11 bar (entspricht dem eingestellten Korrekturwert)
Detail - Chart unterschiedlich, Differenz von 11 bar
Zum Thema "erst mal kein weiteres Release" - Es gibt eine neues GW bei Ecowitt (GW1100) welches natürlich auch neue Sensoren unterstützt...
https://www.ecowitt.com/shop/goodsDetail/107
Es ersetzt das alte GW1000 scheinbar ab sofort... -
@rand sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Zum Thema "erst mal kein weiteres Release"
Bezog sich auch mehr von meiner Seite aus, da ich aktuell nicht wüsste was noch hinein soll, zumindest habe ich nix mehr auf der Agenda. Bugs ausmerzen oder neue Sensoren sind da natürlich außen vor
Da die Gateways eh nicht unterschieden werden dürfte das neue auch keine Probleme bereiten und sollte auf Anhieb laufen. So zumindest die Theorie...Hmm, bei mir ist da schon ein Unterschied, wenn auch nur 1 hPa. Allerdings schwankt bei mir aktuell der Luftdruck ~3 hPa pro Tag, dann ist 1 hPa Unterschied doch schon recht viel (19 vs 20):
Sensortoleranz kann es nicht sein, ist ja nur einer. Aber die Temperatur lag da um ~4°C auseinander...? -
@sborg
die "ca. 10°C" kritisiere ich nicht, sondern deine "von 5°C".
Die Formel gilt auch bei -40°C, aber ab Windgeschwindigkeiten von mehr als 5 km/h. Unter 5 km/h können laut Wiki-Temperaturen über der realen Temperatur als Ergebnis entstehen. -
@boronsbruder Danke, jetzt hat es Klick gemacht. Ist/war aber nur ein reiner Typo-Fehler, im Skript ist es korrekt
Im Release-Thread geändert:
...Die Formel gilt aber nur ab Windgeschwindigkeiten von 5 km/h und bis kleiner 11°C und wird jetzt korrekt berücksichtigt...
-
@SBorg
ich hab gerade auf jscontroller 3.3.15 upgedatet.... (was ich besser gelassen hätte, wenn ich in mein log schauen).simple-api.0 2021-08-06 17:51:40.213 info (2654) State value to set for "0_userdata.0.Wetterstation.Info.Station_Batteriestatus" has to be type "string" but received type "number"
schimpft er jetzt
Hab es jetzt manuell geändert.
Im aktuellen Skript hast auch
createState(DP+"Info.Station_Batteriestatus" , 0, {name: "Batteriestatus [0=OK, 1=Alarm]", type: "string", role: "state" });
-
@boronsbruder Anscheinend habe ich noch irgendwo eine falsche Version + hab die wieder drüber kopiert, denn eigentlich hatte ich es schon vor paar Wochen (wg. Beta-Tests des JSC 3.3.x) geändert:
...aber eigentlich hätte er mir das dann anzeigen müssen... -
mir ist soeben im neuem Dashboard aufgefallen, dass bei Regenstatus & letzter Regen auch N/A steht.
Ist hier auch auf was zu achten?
-
@negalein Eigentlich nicht.
Was spuckt den der "Query-Inspector" bei der Influx-Abfrage aus und was macht dann Grafana daraus: -
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Query-Inspector
Object request:Object method:"GET" url:"api/datasources/proxy/1/query" params:Object db:"iobroker" q:"SELECT "value" FROM "javascript.0.Wetterstation.Regenstatus" WHERE time >= now() - 24h and time <= now()" epoch:"ms" data:null precision:"ms" hideFromInspector:false response:Object results:Array[1] 0:Object
-
@negalein Kein Wunder das er nichts anzeigt, er hat keine Daten bzw. bekommt keine vom Influx. Ist auf den beiden DPs noch das Influx-Logging aktiv? InfluxDB muss an sich noch laufen, sonst wären bspw. die Temps etc. ebenfalls Null / N/A....
-
@sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:
Ist auf den beiden DPs noch das Influx-Logging aktiv?
Ja, ist aktiv.
Bis gestern hat er immer aufgezeichnet. Heute erst gerade 1x. -
@negalein Mit nur einem Wert binnen fast 24h könnte das mit der Beschränkung eng werden. Versuche mal:
-