NEWS
Min / Max Wert der letzten 24h
-
@martin sagte:
Skript erstellen, das ermittelt was der Min und Max-Wert der letzten 24 Stunden war.
-
@martin Dafür gibt es doch aggregator node. Da ist alles drin, was Du brauchst und ist meines Erachtens auch schon im Standard installiert.
Oh sorry - dachte Du nutzt NodeRed weil der Thread sich wohl fälschlicherweise in diese Kategorie verirrt hat. Sollte man dann wohl besser verschieben.
-
@mickym Ja, Node-Red habe ich auch im Einsatz.
Wie wäre hierfür denn der Ansatz? Hast du da was für mich? -
@martin sagte in Min / Max Wert der letzten 24h:
@mickym Ja, Node-Red habe ich auch im Einsatz.
Wie wäre hierfür denn der Ansatz? Hast du da was für mich?Wie gesagt in der aggregator node ist alles drin was Du brauchst. Du nimmst eine node für den Min wert und eine node für den Max wert.
Du bekommst halt den Wert immer erst nach 24 Stunden und der Zeitpunkt verschiebt sich halt nicht. Wenn Du den Haken bei set incomplete interval setzt - dann geht es genau von 24-24 Uhr. Ansonsten ermittelt er den 24 Stundenwert seit dem die Node gestartet ist. Wenn Du Zwischenergebnisse brauchst kannst Du solche Nodes ja in Serie schalten. Zum Beispiel Min Wert der letzten Stunde und aggregierst die dann im nächsten Node zu einem Tag usw.
Ansonsten habe ich auch mal eine Function Node gebastelt.,
Die Lösung mit der Function Node hat den Vorteil, dass Du bei jedem Temperatureingang den bis dahin ermittelten Max- und Min-Wert hast, während Du mit der aggregator node den Max-Wert ist nach Ablauf der Periode (24 Stunden) bekommst.
Für Steuerung, wo Du anhand der Max/Min Temperatur ist der Aggregator Node ausreichend. Wenn Du die aktuellen Werte immer parat und sichtbar haben willst dann selbst machen.
Zum Schluß habe ich nochmal die Funktion-Node für Dich gebastelt, die sowohl min und max ausgibt:
[ { "id": "e93aaaf0.9de138", "type": "function", "z": "dce8fa20.2e93c8", "name": "Maximum und Minimum", "func": "var cMax = context.get('cMaxTemperature');\nvar cMin = context.get('cMinTemperature');\n\ncurrentTemp=Number(msg.payload);\n\nif (cMax === undefined || cMin === undefined){\n cMax=currentTemp;\n cMin=currentTemp;\n context.set('cMaxTemperature',cMax);\n context.set('cMinTemperature',cMin);\n}\n\nif (msg.reset){\n context.set('cMaxTemperature',undefined);\n context.set('cMinTemperature',undefined);\n return null;\n}\n\nif (currentTemp > cMax){\n cMax=currentTemp;\n context.set('cMaxTemperature',cMax);\n}\n\nif (currentTemp < cMin){\n cMin=currentTemp;\n context.set('cMinTemperature',cMin);\n}\n\nmsg.max=cMax;\nmsg.min=cMin;\nmsg.currentTemp=currentTemp;\nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "x": 970, "y": 1360, "wires": [ [ "8a022075.8ec6a" ] ] }, { "id": "8a022075.8ec6a", "type": "debug", "z": "dce8fa20.2e93c8", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "true", "targetType": "full", "statusVal": "", "statusType": "auto", "x": 1170, "y": 1300, "wires": [] }, { "id": "5dec1af2.3695b4", "type": "inject", "z": "dce8fa20.2e93c8", "name": "Reset ", "props": [ { "p": "reset", "v": "true", "vt": "bool" } ], "repeat": "3600", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 760, "y": 1300, "wires": [ [ "e93aaaf0.9de138" ] ] } ]
var cMax = context.get('cMaxTemperature'); var cMin = context.get('cMinTemperature'); currentTemp=Number(msg.payload); if (cMax === undefined || cMin === undefined){ cMax=currentTemp; cMin=currentTemp; context.set('cMaxTemperature',cMax); context.set('cMinTemperature',cMin); } if (msg.reset){ context.set('cMaxTemperature',undefined); context.set('cMinTemperature',undefined); return null; } if (currentTemp > cMax){ cMax=currentTemp; context.set('cMaxTemperature',cMax); } if (currentTemp < cMin){ cMin=currentTemp; context.set('cMinTemperature',cMin); } msg.max=cMax; msg.min=cMin; msg.currentTemp=currentTemp; return msg;
Mit der Inject-Node bist Du ja flexibel, was die Intervalle oder bestimmte Uhrzeiten betrifft.
Statt der Inject Node mit der 30 hängst Du natürlich Deine Xiaomi Sensoren dran.
Ansonsten wenn das dynamisch immer die letzten 24 Std. werden sollen, dann wird das viel komplexer, da Du trotzdem bestimmte Intervalle brauchst - macht aber auch meines Erachtens nicht soviel Sinn. Ob der Zeitraum von 3 Uhr morgens bis 3 morgens am nächsten Tag oder von 12 Uhr morgens ... an 24 Std die Höchst oder Tiefstwerte ausgibt ist doch bei einem Tageszyklus egal, da die Höchst- und Tiefsttemperatur ja nur einmal am Tag erreicht werden.
-
@mickym Danke. Werde ich mal ausprobieren.
-
@mickym Hi, würdest du mir bitte erklären, wie ich die beiden Schnippsel verwende? Also wie und wo sie verwendet werden?
-
@ralf-lange Falls Du die function Node meinst, nun sie gibt Dir den maximalen und minimalen Wert (ich hab Temperatur genommen, aber im Prinzip geht es für alle Zahlenwerte) aus, wenn man mit der aggregator Node und den festen Zeitintervallen nicht zufrieden ist.
Zurücksetzen kann man das mit der msg.reset Nachricht die unter über die Inject Node getriggert wird. Dort kannst Du ja auch ein beliebiges Zeitintervall einstellen.Um jedoch immer die letzten x Intervalle zu haben - musst Du etwas Neues machen und ein Array mit festen Zeitabständen - zum Beispiel einer Trigger Node füttern.
Wenn Dich das interessiert kann man auch so was machen.
-
@mickym Danke. Aber verstanden hab ich es nicht. Vermutlich bin ich nur zu doof. Ich verstehe nicht, wo die beiden Codeschnipsel verwendet werden. Der obere nummerierte vermutlich im Funktion Node. Der hat aber keinen Rückgabewert.
-
@ralf-lange sagte in Min / Max Wert der letzten 24h:
Du hast doch das importiert ? oder ?
So - nun musst du vorne irgendwas an die function Node anschließen, was Zahlenwerte liefert. Der Reset Inject Node - dient dazu die Max und Min Werte zurückzusetzen.
Sobald Du irgendwas, das Zahlenwerte liefert vorne anschließt, dann gibt Dir die debug Node folgendes aus:
-
@mickym Okay, ich bin offiziell ein Idiot...