gehört das Thema nicht eher in den Admin-Thread?
NEWS
Best posts made by SabineT
-
RE: js-controller 3.3 jetzt im Beta
-
Mittelwertbildung für die Windrichtung mit JavaScript
Ich hatte vor 4 Jahren mal für FHEM ein Script geschrieben, um die von meiner Wetterstation (WH3080) gelieferte Windrichtung für die grafische Darstellung aufzubereiten. Das Problem ist ja, dass speziell bei schwachem Wind oder Windstille die Windfahne irgendwo hin zeigt (z.B. durch eine Thermikablösung oder Verwirbelung an umgebenden Hindernissen). Damals hatte ich folgende Grafik zur Verdeutlichung verwendet:
Man sieht bei der Windrichtung, dass die Originaldaten eher unbrauchbar sind.
Hier ein Beispiel, wie es jetzt bei mir ausschaut:
Die Grafiken werden bei mir ausserhalb von ioBroker aus den mit dem SQL-Adapter in MariaDB gespeicherten Daten erstellt.
Wenn der Wind zu schwach ist, wird die Windrichtung überhaupt unterdrückt.Allerdings ist die Mittelwertbildung bei der Windrichtung etwas komplizierter, da man es hier mit Polarkoordinaten hat. D.h. man kann nicht einfach den Winkelwert mitteln. Z.b. wäre der arithmetische Mittelwert zw. NO (45°) und NW (315°) dann 180°, also S, tatsächlich ist er aber 0° (N). Daher muss man den Winkel in West-Ost Komponente und Nord-Süd Komponente zerlegen und getrennt den Mittelwert berechnen.
Die Grundidee für die Berechnung hab ich dabei PYWWS abgeschaut.Jetzt hab ich mich endlich dazu aufgerafft, das Script in Javascript zu erstellen um es direkt in IoBroker verwenden zu können:
const logit = false; // hier kann bei Bedarf die Logausgabe aktiviert werden /* minage: Erst nach Ablauf dieser Zeit wird ein neuer Wert berücksichtigt. Ist quasi eine Art Entprellung. */ const minage = 0; /* avtime: Maxmimaler Zeitraum, der gemittelt werden soll */ const avtime = 900; /* decay: 1 -> alle Werte werden gleich gewichtet 0 -> nur der aktuelle Wert wird verwendet. in der Praxis wird man Werte so um 0.75 nehmen */ const decay = 0.75; /* minspeed: da bei sehr geringer Windgeschwindigkeit die Windrichtung üblicherweise nicht eindeutig ist, kann mit minspeed ein Schwellwert angegeben werden Ist die (gewichtetete) mittlere Geschwindigkeit < minspeed wird undef zurück geliefert */ const minspeed = 0.5; /* Maximalgröße des Arrays Der Wert hängt davon ab, in welchem Intervall die Wetterstation die Daten liefert. Richtwert: avtime / Intervall + 1; */ const maxentries = 40; /* ID's der Quellobjekte für Windgeschwindigkeit und Richtung */ const wsid = "alias.0.Wetterstation.windspeed"; // Windgeschwindigkeit in m/s const wdid = "alias.0.Wetterstation.winddir"; // Windrichtung (0 - 15) /* Die folgenden 3 Objekte müssen manuell angelegt werden! hier wird dann jeweis die ID eingetragen: */ const historyid = "0_userdata.0.WindDirAverage.history"; // Speicher der History vom Typ Array const wdavgid = "0_userdata.0.WindDirAverage.WindDirAvgDegree"; // Mittelwert der Windrichtung in Grad vom Typ Number const wdavgtid = "0_userdata.0.WindDirAverage.WindDirAvgText"; // Mittelwert der Windrichtung als Text vom Typ String var i = 0; var age = 0; var ltime = 0; let oldhistory = getState(historyid).val; // gespeicherten Buffer holen var history = new Array(); // Datenbuffer initialisieren if (decay > 1){ // darf nicht >1 sein decay= 1; } if (decay < 0){ // darf nicht <0 sein decay= 0; } if (oldhistory.length > 0) { // wenn im gespeicherten Buffer Daten vorhaden sind history = oldhistory; // diese in den Datenbuffer übernehmen ltime = history[history.length - 1].time; // Zeitstempel des letzten Eintrages } var num = history.length; on({id: wsid, change: 'any'}, function(wsobj) { let ws = wsobj.state.val; // WindSpeed(m/s) let ctime = (wsobj.state.ts / 1000).toFixed(0); // Timestamp (s) let wd = getState(wdid).val * 22.5; // WindDirection (Grad) let stime = history[0].time; // Zeitpunkt des ältesten Wertes age = ctime - ltime; // Zeitspanne seit dem vorhergehenden Wert if (age > minage) { // erst nach Ablauf von minage einen neuen Wert verarbeiten (Entprellung) if (history.length >= maxentries) { // falls der Datenbuffer voll ist, history.shift(); // den ältesten Eintrag entfernen } let wdr = (degToRad(wd)).toFixed(3); let newentry = { windspeed: ws, winddir: wdr, time: ctime }; history.push(newentry); // neue Daten dem Datenbuffer hinzufügen num = history.length; if (logit) { log(sprintf("num: %u ts: %u age: %u ws: %0.1f, wd: %u, wdr: %u", num, newentry.time, age, newentry.windspeed, wd, newentry.winddir)); } ltime = ctime; var anz = 0; var sanz = 0; var sumsin = 0.0; var sumcos = 0.0; var sumspeed = 0.0; var wdavg = 0; var weight = 0; age = 0; maxage = 0; for (let i = 0; i < num; i++) { // nun die Daten im Buffer verarbeiten ws = history[i].windspeed; wdr = history[i].winddir; ts = history[i].time; age = ctime - ts; if (age > avtime) { // zu alte Einträge entfernen history.shift(); i--; num--; } else { // Werte aufsummieren, Windrichtung gewichtet über Geschwindigkeit, decay und age weight = ws * decay ** (age / avtime); if (age < (avtime / 4)) { // für die Mittelwertsbildung der Geschwindigkeit wird nur ein 4tel von avtime genommen sumspeed += weight; sanz++; } sumsin += ((Math.sin(wdr)).toFixed(3) * weight); sumcos += ((Math.cos(wdr)).toFixed(3) * weight); anz++; } } setState(historyid, { // Datenbuffer im Datenpunkt speichern val: history, ack: true }); let avg = radToDeg(Math.atan2(sumsin, sumcos)); wdavg = ((avg + 360) % 360).toFixed(0); // Mittlere Windrichtung in Grad wdt = wd_to_text(wdavg); // und als Text let wdstr = '-'; // neuen Wert nur ausgeben, wenn die durchschnittliche Geschwindigkeit groß genug ist // und überhaupt ein Wert berechnet wurde if ((anz > 0) && (sanz > 0) && ((sumspeed / sanz) >= minspeed)) { setState(wdavgid, { val: Number(wdavg), ack: true }); wdstr = wdt; } setState(wdavgtid, { val: wdstr, ack: true }); if (logit) { log(sprintf("sanz: %u ws: %0.1f avgws: %0.1f anz: %u avg: %0.1f wdavg: %u wdt: '%s'", sanz, ws, sumspeed / sanz, anz, avg, wdavg, wdstr)); } } }); function degToRad(degrees) { return degrees * (Math.PI / 180); }; function radToDeg(rad) { return rad / (Math.PI / 180); }; function wd_to_text(wd) { let wdt = ['N', 'NNO', 'NO', 'ONO', 'O', 'OSO', 'SO', 'SSO', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW', 'N']; let w = (wd / 22.5).toFixed(0); return wdt[w]; }
Ich hab versucht, möglichst viel in den Kommentaren zu erklären! Anpassen muss man auf jedenfall die beiden Variablen wsid und wdid (Zeilen 41 und 42), das sind die Objekte, die für die Berechnung herangezogen werden. Bei mir ist wdid ein Objekt, in das von der Wetterstation nur eine Zahl (0-15) geschrieben wird. In der Zeile 76 wird daraus dann die Windrichtung in ° berechnet. Je nach eigener Wetterstation ist hier also eventuell auch eine Anpassung nötig!
Die Ausgabe erfolgt dann in die in den Zeilen 48-50 definierten Objekte. Die Objekte müssen zuvor manuell angelegt werden! Ich hab aber mal meinen Objektbaum in eine JSON-Datei exportiert, die man in der Objektansicht oben mit dem Aufwärtspfeil importieren kann:
0_userdata.0.WindDirAverage.jsonIch muss noch erwähnen, dass ich keine professionelle Javascript Programmiererin bin, es kann also durchaus sein, dass man das eine oder andere noch eleganter lösen könnte. Aber das Script tut, was ich damit erreichen will.
Sabine
-
RE: Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)
@dslraser ich hab mir jetzt mal für einen Thermostat einen eigenen Alias angelegt mit "Getrennte Alias IDs für lesen und schreiben". Lesen vom SET_POINT_MODE und schreiben in CONTROL_MODE.
Im iQontrol dann diesen Alias für CONTROL_MODE ausgewählt, noch die Werteliste beim Alias-Object eingetragen und schon wird im iQontrol Manu angezeigt, wenn man das im RaspberryMatic umstellt (und umgekehrt). -
RE: Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)
@kilolima ich denke, Sebastian hat so schon genug mit den diversen Wünschen zu kämpfen, jetzt noch eine Zugriffskontrolle mit einzubauen würde es nicht einfacher machen. Ausserdem bitte daran denken, Sebastian (@s-bormann ) macht das in seiner Freizeit!
-
RE: Admin5: Ich kann keine Objekte mehr manuell anlegen
@fabian1 sagte in js-controller 3.3 jetzt im STABLE!:
@jan1 said in js-controller 3.3 jetzt im STABLE!:
@fabian1
Wo legt er dann die DPs der eigenen Geräte an? Ich dachte das macht der Adapter eh automatisch richtig.Ich versteh Dein Problem, wenn das nicht dort gemacht wird, wird dann aber etwas OT hier
Wenn ich in meiner ESP8266 Firmware Daten per MQTT sende dann erstellt er die Datenpunkte in MQTT.0.GerätXYZ das stimmt! ABER MQTT geht ja in beide Richtungen, ich muss ja die Möglichkeit haben selbst Topics anlegen zu können.
Ich hab als MQTT-Broker bei mir Mosquito im Einsatz, weil ich finde, sowas sollte unabhängig vom ioBroker laufen.
Als Adapter verwende ich dann den MQTT-Client Adapter. Bei dem kann man bei jedem Objekt einen Topic einstellen, ob man damit den Wert publishen will bzw. ob dieser Topic für das Objekt abonniert werden soll:
-
RE: Shelly Plus Addon - Temperaturen als Datenpunkte in ioBroker
@spooky82
Die Shellies senden alle Daten über MQTT, allerdings in einer Form die man erst weiter verarbeiten muss. Für einen Temperatursensor am Addon schaut das z.B. dann so aus:{"id": 100,"tC":34.1, "tF":93.3}
Der Shelly-Adapter fangt generell nichts mit den Daten vom Addon an.
Deshalb hab ich bei mir auch den Adapter wieder rausgeschmissen und verwende meinen normale MQTT-Broker. Die Daten verarbeite ich dann mittels Node-Red und schreibe sie in eigene Datenpunkte unter 0_userdata.0Der Flow dazu:
shellies.jsonDa verwende ich den Subflow von @mickym im Beitrag JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen
In den Shellies selber bei den MQTT-Settings bei "MQTT prefix" shellies/ davor setzen, bzw. am Besten gleich einen "sprechenden" Prefix verwenden, bei mir hab ich da z.B. shellies/therme-temperature eingestellt statt dem vorgegebenen, oder beim Shelly für das Licht in der Küche shellies/licht_kueche.
Um dann z.B. das Licht in der Küche zu schalten sendet man das passende Kommando über MQTT an shellies/licht_kueche/command/switch:0
Dazu hilft es die offizielle API-Doku zu studieren, was da alles möglich ist. -
RE: Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)
@vepman Falls nicht eh schon geschehen, in der Adapter Ansicht den Experten Modus aktivieren (über das Symbol oben rechts) und dann beim Adapter in der Spalte "Installieren" auf den "Pfeil nach oben" (Upload) clicken.
-
RE: Node-RED Nodes für externe ioBroker Integration
@marc-berg sagte in Node-RED Nodes für externe ioBroker Integration:
Super! Ab besten jetzt noch fleißig testen, in zwei Wochen befinde ich mich eine Weile in einer praktisch internetfreien Zone.
Bis jetzt laufen alle Flows, so wie sie sollen. Hab inzwischen die Node-Red Instanz von IOB gestoppt...
-
RE: Admin v5 jetzt im STABLE!
@feuersturm naja, das ist dann alles andere als Benutzerfreundlich. Vorallem, weil ja nicht klar ist, welche Einheit die Zahl dann hat (Pixel? Inch? cm? %?).
Der Default ist aber jedenfalls so unbrauchbar, wenn man sich statt Namen dann irgendwelche Object-ID's (14 Hexziffern) merken muss -
RE: Test Adapter iQontrol 2.0.x Vis (Entwicklungs-Thread)
Eigentlich müsster der Thread-Titel inzwischen angepasst werden (1.3.x ist ja nicht mehr aktuell)
Latest posts made by SabineT
-
RE: Node-RED Nodes für externe ioBroker Integration
@marc-berg sagte in Node-RED Nodes für externe ioBroker Integration:
Super! Ab besten jetzt noch fleißig testen, in zwei Wochen befinde ich mich eine Weile in einer praktisch internetfreien Zone.
Bis jetzt laufen alle Flows, so wie sie sollen. Hab inzwischen die Node-Red Instanz von IOB gestoppt...
-
RE: Node-RED Nodes für externe ioBroker Integration
@Marc-Berg Ich möchte jetzt mal Danke sagen für die Arbeit!
Ich bin gerade dabei, die diversen Funktionen (ioBroker, node-red, mariadb, etc.) auf einzelne ProxMox Nodes zu migrieren. Angefangen hab ich jetzt mit node-red und die Flows übersiedelt. In diversen Scripten musste ich natürlich Anpassungen vornehmen, aber jetzt laufen alle Flows am externen node-red. -
RE: Fehler Backitup Grafana
@simatec es wäre praktisch, wenn es für das "Grafana Backup" auch so einen Knopf "JETZT SICHERN" geben würde, wie bei ioBroker oder Homematic. Gerade wenn man testen will, ob das Backup funktioniert.
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
@bananajoe beim Elroq gibt es dafür nicht die unteren beiden Objekte!
Ich hab jetzt mal den Loglevel vom Adaper auf Warn umgestellt. -
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
@robbsy was steht denn bei einem Hybrid in "vw-connect.0.FIN.status.vehicle-status.driving-range.carType"?
Beim Elroq (BEV) steht da "electric". -
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
@mading sagte in Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda:
@sabinet sagte in Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda:
Ich bekomme für meinen Skoda Elroq regelmäßig folgende Meldung im Log:
info: vw-connect.0 (2800) Server not available. For endpoint fueling/locations Please try again later:"Internal server error"
Issue auf Github hab ich dazu bereits vor 2 Wochen angelegt.
ich denke da kann der Entwickler nicht viel machen. Der Fehler wird ja aus gutem Grund geloggt, da es ein interner Server-Fehler ist (am Backend in der Cloud).
Warum wird das bei einem E-Auto überhaupt abgefragt? "fueling" klingt für mich nach Verbrennerfahrzeug.
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
Ich bekomme für meinen Skoda Elroq regelmäßig folgende Meldung im Log:
info: vw-connect.0 (2800) Server not available. For endpoint fueling/locations Please try again later:"Internal server error"
Issue auf Github hab ich dazu bereits vor 2 Wochen angelegt.
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
@merlin123 sagte in Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda:
@arteck Mir geht es weniger darum, wann die letzte Aktualisierung kam. Die Frage ist ganz konkret: Kann es durch Anfragen vom Adapter dazu kommen, dass das Auto "extra" geweckt wird? (ich denke/hoffe mal nicht
)
Mein Elroq85 wird nicht durch die Abfragen des Adapters aufgeweckt. Und in der App wird auch links oben angezeigt, wann die letzte Aktualisierung durch das Fahrzeug erfolgt ist.
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
@kusi sagte in Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda:
@astrakid ich nutze bei meinem Enyaq folgenden Datenpunkt:
.mqtt.events.vehicle-awake.timestamp
Wichtig: Die Zeitzone stimmt nicht
Ich habe mir dafür ein kleines Blockly gemacht, damit stimmt dann auch die Zeitzone.
Wer lieber Javascript verwenden will hier mein Script:
// ObjectID von carCapturedTimestamp const captsid = 'vw-connect.0.FIN.status.vehicle-status.carCapturedTimestamp'; // ObjectID für den konvertierten Wert const captsdst = '0_userdata.0.Auto.carCapturedTimestamp'; // Zielobject anlegen, falls es noch nicht existiert createState(captsdst); on({id: captsid, change: 'any'}, function(srcobj) { let dt = srcobj.state.val; let tsstr = formatDate(dt, "JJJJ.MM.TT SS:mm:ss"); setState(captsdst, { val: tsstr, ack: true }); });
"FIN" gehört dann natürlich durch die eigene ersetzt und das Object im 0_userdata tree kann den eigenen Wünschen angepasst werden.
-
RE: Test Adapter VW Connect für VW, ID, Audi, Seat, Skoda
Ich lass derzeit jede Stunde die Instanz neu starten.