Timer im Dashboard anzeigen
Moderator: Co-Administratoren
Timer im Dashboard anzeigen
Hallo,
es ist bestimmt mit Bordmitteln einfach umzusetzen, aber ich habe noch nichts passendes gefunden. Vielleicht könnt ihr mir helfen.
Ich habe einen Heizlüfter im Bad, den ich über eine Gosund Steckdose schalten kann. Nun habe ich neben einem ON/OFF Schalter im Dashboard ein Taster "15min" eingebunden. Also ein Tastendruck im Dashbord schaltet den Heizlüfter für 15min ein (Trigger Node) . Das klappt soweit einwandfrei.
Nun würde ich mir im Dashbord gerne die Restlaufzeit anzeigen lassen. Also ein Feld, das mir die Restzeit anzeigt.
Aber ich habe keine Idee, mit welchen Mitteln ich das umsetzen kann.
Über einen Vorschlag / Beispiel würde ich mich sehr freuen.
es ist bestimmt mit Bordmitteln einfach umzusetzen, aber ich habe noch nichts passendes gefunden. Vielleicht könnt ihr mir helfen.
Ich habe einen Heizlüfter im Bad, den ich über eine Gosund Steckdose schalten kann. Nun habe ich neben einem ON/OFF Schalter im Dashboard ein Taster "15min" eingebunden. Also ein Tastendruck im Dashbord schaltet den Heizlüfter für 15min ein (Trigger Node) . Das klappt soweit einwandfrei.
Nun würde ich mir im Dashbord gerne die Restlaufzeit anzeigen lassen. Also ein Feld, das mir die Restzeit anzeigt.
Aber ich habe keine Idee, mit welchen Mitteln ich das umsetzen kann.
Über einen Vorschlag / Beispiel würde ich mich sehr freuen.
-
- Beiträge: 33
- Registriert: 15.04.2019, 14:52
- Hat sich bedankt: 4 Mal
- Danksagung erhalten: 4 Mal
Re: Timer im Dashboard anzeigen
Hier ein kleines Beispielflow:
Es nimmt einen Input in Sekunden (Im Beispiel mit Inject) und Wandelt diesen in einer Funktion in einen GUI-Text hh:mm:ss um.
Es gibt bei der Funktion zwei Ausgänge, der Obere Liefert den GUI-Text, und der untere die Restsekunden.
Dieser geht in eine 1 Sekunden Schlaf-funktion und kommt dann wieder in den Input.
MfG
Fabian
Es nimmt einen Input in Sekunden (Im Beispiel mit Inject) und Wandelt diesen in einer Funktion in einen GUI-Text hh:mm:ss um.
Es gibt bei der Funktion zwei Ausgänge, der Obere Liefert den GUI-Text, und der untere die Restsekunden.
Dieser geht in eine 1 Sekunden Schlaf-funktion und kommt dann wieder in den Input.
Code: Alles auswählen
[{"id":"8d69d0a6.77071","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"5cb5e7de.a5b958","type":"inject","z":"8d69d0a6.77071","name":"","topic":"","payload":"900","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":310,"y":200,"wires":[["f5103394.3bcc3"]]},{"id":"f5103394.3bcc3","type":"function","z":"8d69d0a6.77071","name":"Timer","func":"var Seconds = msg.payload;\n\nif(Seconds <= 0) //Wenn Sekunden <= 0, Abbrechen\n{\n return [null, null];\n}\n\nvar date = new Date(null); //Leeres Datumsobjekt\ndate.setSeconds(Seconds); //Aktuelle Anzahl Sekunden setzen\nvar result = date.toISOString().substr(11, 8); //Aktuelles Datum in einen String verwandeln und schneiden\n\nvar msgtime = {payload:result};\n\nmsg.payload = Seconds-1; //1 Sekunde abziehen.\n\n//Gibt auf dem 1. Ausgang die Formatierte Zeit zurück\n//Und auf dem 2. Ausgang die Zeit in Sekunden\n\nreturn [msgtime,msg]; ","outputs":2,"noerr":0,"x":470,"y":200,"wires":[["734e4ba9.a63ec4"],["5b951a3c.29b49c"]]},{"id":"734e4ba9.a63ec4","type":"ui_text","z":"8d69d0a6.77071","group":"b42cee22.33592","order":1,"width":0,"height":0,"name":"","label":"Timer","format":"{{msg.payload}}","layout":"row-spread","x":640,"y":200,"wires":[]},{"id":"5b951a3c.29b49c","type":"delay","z":"8d69d0a6.77071","name":"_1S_Schlafen","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":480,"y":260,"wires":[["f5103394.3bcc3"]]},{"id":"b42cee22.33592","type":"ui_group","z":"","name":"_UI","tab":"6963b45d.da2f3c","disp":true,"width":"6","collapse":false},{"id":"6963b45d.da2f3c","type":"ui_tab","z":"","name":"Hauptmenü","icon":"dashboard","disabled":false,"hidden":false}]
Fabian
-
- Beiträge: 447
- Registriert: 13.09.2017, 05:11
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 12 Mal
Re: Timer im Dashboard anzeigen
Hallo Azubi,
anbei ein Beispiel.
Aufgaben:
Timer wird in Sekunden gesetzt (vorgesetzt mit 30 Sek). Mit dem Start/Stop Button gestartet oder beendet. Der Status und der Timer (formatiert in hh:mm:ss) werden angezeigt. Es wird der Timer auf dem Dashboard auf der Seite: Testseite angezeigt.
Voraussetzung:
Die Node:
- node-red-contrib-mytimeout
- node-red-contrib-moment (bei Redmatic schon da, denke ich)
muss installiert sein.
Die fertige Anzeige auf dem Dashboad:
Der Flow mit Zeitformatierung: Der Flow ohne Zeitformatierung:
Hier der Code:
Ich hoffe es hilft Dir.
Lieben Gruß Thomas
anbei ein Beispiel.
Aufgaben:
Timer wird in Sekunden gesetzt (vorgesetzt mit 30 Sek). Mit dem Start/Stop Button gestartet oder beendet. Der Status und der Timer (formatiert in hh:mm:ss) werden angezeigt. Es wird der Timer auf dem Dashboard auf der Seite: Testseite angezeigt.
Voraussetzung:
Die Node:
- node-red-contrib-mytimeout
- node-red-contrib-moment (bei Redmatic schon da, denke ich)
muss installiert sein.
Die fertige Anzeige auf dem Dashboad:
Der Flow mit Zeitformatierung: Der Flow ohne Zeitformatierung:
Hier der Code:
Code: Alles auswählen
[{"id":"d68f28f5.525ee","type":"ui_button","z":"a9716f83.ed51","name":"","group":"5b2bb334.380c0c","order":2,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"","icon":"","payload":"on","payloadType":"str","topic":"","x":150,"y":160,"wires":[["791ef8cf.bb87e","53c8d009.6164"]]},{"id":"661de4c1.d77394","type":"ui_button","z":"a9716f83.ed51","name":"","group":"5b2bb334.380c0c","order":3,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"off","x":150,"y":200,"wires":[["791ef8cf.bb87e"]]},{"id":"e2e10cea.7e3198","type":"mytimeout","z":"a9716f83.ed51","name":"","outtopic":"","outsafe":"","outwarning":"Warning","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":470,"y":180,"wires":[["53c8d009.6164"],["f243dc03.51a3b"]]},{"id":"db52c837.97f338","type":"moment","z":"a9716f83.ed51","name":"Format >=1h","topic":"","input":"","inputType":"msg","inTz":"Africa/Abidjan","adjAmount":0,"adjType":"days","adjDir":"add","format":"hh:mm:ss","locale":"de_DE","output":"payload","outputType":"msg","outTz":"Africa/Abidjan","x":990,"y":160,"wires":[["15da1918.6d6e2f"]]},{"id":"791ef8cf.bb87e","type":"function","z":"a9716f83.ed51","name":"Timersetup","func":"// Need to change the on to\n// { \"payload\": \"on\", \"timeout\": 69, \"warning\": 10 }\n\nif(msg.payload == \"on\") {\n msg.payload = { \n \"payload\": \"on\", \n \"timeout\": flow.get('timerset'),\n \"warning\": 10\n // \"timeout\": global.get('timerMin'),\n// \"warning\": global.get('warningMin')\n };\n} else {\n msg.payload = { \"payload\": \"off\" };\n}\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":180,"wires":[["e2e10cea.7e3198"]]},{"id":"7ae4a80a.091728","type":"change","z":"a9716f83.ed51","name":"Speichern in Context","rules":[{"t":"move","p":"payload","pt":"msg","to":"timerset","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":260,"wires":[[]]},{"id":"97e05693.6417a8","type":"ui_text_input","z":"a9716f83.ed51","name":"","label":"Timerset","tooltip":"Eingabe in Sek","group":"5b2bb334.380c0c","order":2,"width":0,"height":0,"passthru":true,"mode":"number","delay":300,"topic":"","x":340,"y":260,"wires":[["7ae4a80a.091728"]]},{"id":"e849bc74.8f5f5","type":"switch","z":"a9716f83.ed51","name":">1h oder <1h","property":"payload","propertyType":"msg","rules":[{"t":"gte","v":"3600000","vt":"num"},{"t":"lt","v":"3600000","vt":"num"}],"checkall":"false","repair":false,"outputs":2,"x":800,"y":180,"wires":[["db52c837.97f338"],["b19e9e2c.35b75"]]},{"id":"b19e9e2c.35b75","type":"moment","z":"a9716f83.ed51","name":"Format <1h","topic":"","input":"","inputType":"msg","inTz":"Africa/Abidjan","adjAmount":0,"adjType":"days","adjDir":"add","format":"mm:ss","locale":"de_DE","output":"payload","outputType":"msg","outTz":"Africa/Abidjan","x":990,"y":200,"wires":[["15da1918.6d6e2f"]]},{"id":"f243dc03.51a3b","type":"function","z":"a9716f83.ed51","name":"Anpa. mSek","func":"var temp = msg.payload;\ntemp = temp*1000;\n\nmsg.payload = temp;\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":180,"wires":[["e849bc74.8f5f5"]]},{"id":"4bc4744d.6e474c","type":"comment","z":"a9716f83.ed51","name":"Timerbeispiel mit Daskboard","info":"","x":220,"y":80,"wires":[]},{"id":"5a0533b2.23245c","type":"inject","z":"a9716f83.ed51","name":"Temp set","topic":"","payload":"30","payloadType":"num","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":180,"y":260,"wires":[["97e05693.6417a8"]]},{"id":"53c8d009.6164","type":"ui_text","z":"a9716f83.ed51","group":"5b2bb334.380c0c","order":6,"width":0,"height":0,"name":"","label":"Timerstatus","format":"{{msg.payload}}","layout":"row-spread","x":630,"y":140,"wires":[]},{"id":"15da1918.6d6e2f","type":"ui_text","z":"a9716f83.ed51","group":"5b2bb334.380c0c","order":6,"width":0,"height":0,"name":"","label":"Timerausgabe","format":"{{msg.payload}}","layout":"row-spread","x":1180,"y":180,"wires":[]},{"id":"5b2bb334.380c0c","type":"ui_group","z":"","name":"Timer","tab":"aacad60d.905538","order":2,"disp":true,"width":"6","collapse":false},{"id":"aacad60d.905538","type":"ui_tab","z":"","name":"Testseite","icon":"dashboard","disabled":false,"hidden":false}]
Ich hoffe es hilft Dir.
Lieben Gruß Thomas
972 Kanäle in 165 Geräten: Davon 16 HM, 145 HMIP, 2 Gruppen und 2 CUXD Geräte
-
- Beiträge: 460
- Registriert: 06.01.2018, 12:48
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 57 Mal
- Danksagung erhalten: 39 Mal
Re: Timer im Dashboard anzeigen
Nein ist diese nicht. Das geht auch mit der "Time change and compare" node die mit bei RedMatic dabei ist.
-
- Beiträge: 460
- Registriert: 06.01.2018, 12:48
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 57 Mal
- Danksagung erhalten: 39 Mal
Re: Timer im Dashboard anzeigen
Hier die funktionierende Variante mit der timer-comp node, ohne weitere Nodes:
In der timer-comp node gab es noch einen Bug, der den Wert-0 als Fehler betrachtet. Das ist nicht schlimm, lediglich wenn der Wert 0 ankommt, wird halt ein Fehler ausgegeben anstelle einer Zeit. - Das ist mit der Version 1.0.12 gefixed (sollte in der nächsten RedMatic Version dann mit drin sein).
Wer nicht so lange warten will kann das in Node-Red updaten.
Die timer-comp node ist hier nur für das formatieren der Zeit, das kann man natürlich auch in der function node direkt machen.
Ich wollte nur mal ein Beispiel was mit dieser node möglich ist.
Hier die Variante nur mit der function node:
Weil ich jetzt nicht die node-red-contrib-mytimeout installieren wollte, hab ich das was die Node macht in eine function node gepackt (In der function node lässt sich noch einiges konfigurieren.). Das kann man natürlich auch durch die mytimeout node ersetzen.Code: Alles auswählen
[{"id":"1cc56acb.d8b615","type":"ui_button","z":"de4e9c38.0d942","name":"","group":"e29ba44.4b8fb58","order":2,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"","icon":"","payload":"30","payloadType":"num","topic":"start","x":230,"y":4200,"wires":[["c81070cb.1e875"]]},{"id":"57a40c7a.966114","type":"ui_button","z":"de4e9c38.0d942","name":"","group":"e29ba44.4b8fb58","order":3,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"stop","x":230,"y":4240,"wires":[["c81070cb.1e875"]]},{"id":"c81070cb.1e875","type":"function","z":"de4e9c38.0d942","name":"Timersetup","func":"// set value with topic setValue\n// start with topic start\n// stop with topic stop\n\nconst addEachLoop = -1; // number to add each loop\nconst loopCycle = 1; // seconds delay\nconst stopAt = 0 // set to value where shoudl auto stop or null if not\nconst topicToUse = \"\"; // if not set topic of start will used\nconst multiply = 60000; // set an multiplyer to the number, 1 if not ued - milliseconds, 1000 for seconds, 60000 for minutes\nconst stateStarted = \"gestartet\";\nconst stateStopped = \"gestopped\";\n\n// ------------------------------------------------------\n// do not chnage any thing above here\nlet timeObj = context.get(\"timeObj\");\nlet val = context.get(\"value\") || 0;\n\nif (msg.topic.includes('setValue')) {\n val = parseFloat(msg.payload);\n context.set(\"valueStart\", val);\n context.set(\"value\", val);\n msg.payload = val * multiply;\n msg.number = val;\n msg.state = stateStopped;\n msg.topic = topicToUse || msg.topic;\n if (timeObj) {\n msg.state = stateStarted;\n node.status({fill:\"green\",shape:\"dot\",text:\"value changed - \" + val + ' ' + msg.state});\n } else {\n msg.state = stateStopped;\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n }\n return msg;\n} else if (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n let val = context.get(\"value\");\n msg.payload = val * multiply;\n msg.number = val;\n msg.state = stateStopped;\n msg.topic = topicToUse || msg.topic;\n context.set(\"timeObj\", null);\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n return msg;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n val = context.get(\"valueStart\") || parseFloat(msg.payload) || 0;\n msg.payload = val * multiply;\n msg.number = val;\n msg.state = stateStarted;\n msg.topic = topicToUse || msg.topic;\n context.set(\"value\", val);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let val = context.get(\"value\");\n val += addEachLoop;\n context.set(\"value\", val);\n msg.payload = val * multiply;\n msg.number = val;\n msg.topic = topicToUse || msg.topic;\n\n if (typeof stopAt !== undefined && stopAt !== null && stopAt===val) {\n msg.state = stateStopped;\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n } else {\n msg.state = stateStarted;\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + val + ' ' + msg.state});\n }\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + val + ' ' + msg.state});\n return msg;\n}\n\nmsg.payload = val * multiply;\nmsg.number = val;\nif (timeObj) {\n msg.state = stateStarted;\n} else {\n msg.state = stateStopped;\n}\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + val + ' ' + msg.state});\nreturn msg;","outputs":1,"noerr":0,"x":450,"y":4220,"wires":[["3c3a2b46.aa9ea4","cae2aa92.e5e988"]]},{"id":"c7ced69a.3637d8","type":"ui_text_input","z":"de4e9c38.0d942","name":"","label":"Timerset","tooltip":"Eingabe in Sek","group":"e29ba44.4b8fb58","order":2,"width":0,"height":0,"passthru":true,"mode":"number","delay":300,"topic":"setValue","x":340,"y":4300,"wires":[["c81070cb.1e875"]]},{"id":"84db98c1.e63c58","type":"comment","z":"de4e9c38.0d942","name":"Timerbeispiel mit Daskboard","info":"","x":300,"y":4120,"wires":[]},{"id":"7611594.9c787a8","type":"inject","z":"de4e9c38.0d942","name":"Temp set","topic":"","payload":"30","payloadType":"num","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":180,"y":4300,"wires":[["c7ced69a.3637d8"]]},{"id":"cae2aa92.e5e988","type":"ui_text","z":"de4e9c38.0d942","group":"e29ba44.4b8fb58","order":6,"width":0,"height":0,"name":"","label":"Timerstatus","format":"{{msg.state}}","layout":"row-spread","x":630,"y":4160,"wires":[]},{"id":"bd59fae1.f6ec28","type":"ui_text","z":"de4e9c38.0d942","group":"e29ba44.4b8fb58","order":6,"width":0,"height":0,"name":"","label":"Timerausgabe","format":"{{msg.payload}}","layout":"row-spread","x":820,"y":4220,"wires":[]},{"id":"3c3a2b46.aa9ea4","type":"time-comp","z":"de4e9c38.0d942","outputs":1,"name":"","positionConfig":"19a77cb8.527af3","input":"","inputType":"msgPayload","inputFormat":"0","inputOffset":0,"inputOffsetType":"none","inputOffsetMultiplier":60000,"rules":[],"checkall":"true","result1":"","result1Type":"msgPayload","result1Value":"","result1ValueType":"input","result1Format":"UTC:HH:mm:ss","result1Offset":0,"result1OffsetType":"none","result1OffsetMultiplier":60000,"x":630,"y":4220,"wires":[["bd59fae1.f6ec28"]]},{"id":"e29ba44.4b8fb58","type":"ui_group","z":"","name":"Timer","tab":"7796518b.953d6","order":2,"disp":true,"width":"6","collapse":false},{"id":"19a77cb8.527af3","type":"position-config","z":"","name":"Entenhausen","isValide":"true","longitude":"0","latitude":"0","angleType":"deg","timeZoneOffset":"99","timeZoneDST":"0","stateTimeFormat":"3","stateDateFormat":"12"},{"id":"7796518b.953d6","type":"ui_tab","z":"","name":"Testseite","icon":"dashboard","disabled":false,"hidden":false}]
Wer nicht so lange warten will kann das in Node-Red updaten.
Die timer-comp node ist hier nur für das formatieren der Zeit, das kann man natürlich auch in der function node direkt machen.
Ich wollte nur mal ein Beispiel was mit dieser node möglich ist.
Hier die Variante nur mit der function node:
Code: Alles auswählen
[{"id":"1cc56acb.d8b615","type":"ui_button","z":"de4e9c38.0d942","name":"","group":"e29ba44.4b8fb58","order":2,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"","icon":"","payload":"30","payloadType":"num","topic":"start","x":230,"y":4200,"wires":[["c81070cb.1e875"]]},{"id":"57a40c7a.966114","type":"ui_button","z":"de4e9c38.0d942","name":"","group":"e29ba44.4b8fb58","order":3,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"stop","x":230,"y":4240,"wires":[["c81070cb.1e875"]]},{"id":"c81070cb.1e875","type":"function","z":"de4e9c38.0d942","name":"Timersetup","func":"// set value with topic setValue\n// start with topic start\n// stop with topic stop\n\nconst addEachLoop = -1; // number to add each loop\nconst loopCycle = 1; // seconds delay\nconst stopAt = 0 // set to value where shoudl auto stop or null if not\nconst topicToUse = \"\"; // if not set topic of start will used\nconst stateStarted = \"gestartet\";\nconst stateStopped = \"gestopped\";\n\n// ------------------------------------------------------\n// do not chnage any thing above here\nlet timeObj = context.get(\"timeObj\");\nlet val = context.get(\"value\") || 0;\n\nif (msg.topic.includes('setValue')) {\n val = parseFloat(msg.payload);\n context.set(\"valueStart\", val);\n context.set(\"value\", val);\n msg.payload = formateSeconds(val);\n msg.number = val;\n msg.state = stateStopped;\n msg.topic = topicToUse || msg.topic;\n if (timeObj) {\n msg.state = stateStarted;\n node.status({fill:\"green\",shape:\"dot\",text:\"value changed - \" + val + ' ' + msg.state});\n } else {\n msg.state = stateStopped;\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n }\n return msg;\n} else if (timeObj && msg.topic.includes('stop')) {\n clearInterval(timeObj);\n let val = context.get(\"value\");\n msg.payload = formateSeconds(val);\n msg.number = val;\n msg.state = stateStopped;\n msg.topic = topicToUse || msg.topic;\n context.set(\"timeObj\", null);\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n return msg;\n} else if (!timeObj && msg.topic.includes('start')) {\n context.set(\"message\", msg);\n val = context.get(\"valueStart\") || parseFloat(msg.payload) || 0;\n msg.payload = formateSeconds(val);\n msg.number = val;\n msg.state = stateStarted;\n msg.topic = topicToUse || msg.topic;\n context.set(\"value\", val);\n\n let timeObj = setInterval(function(){\n let msg = context.get(\"message\");\n let val = context.get(\"value\");\n val += addEachLoop;\n context.set(\"value\", val);\n msg.payload = formateSeconds(val);\n msg.number = val;\n msg.topic = topicToUse || msg.topic;\n\n if (typeof stopAt !== undefined && stopAt !== null && stopAt===val) {\n msg.state = stateStopped;\n clearInterval(timeObj);\n context.set(\"timeObj\", null);\n node.status({fill:\"red\",shape:\"ring\",text:\"stopped - \" + val + ' ' + msg.state});\n } else {\n msg.state = stateStarted;\n node.status({fill:\"green\",shape:\"dot\",text:\"run - \" + val + ' ' + msg.state});\n }\n node.send(msg);\n\t}, (1000 * loopCycle));\n context.set(\"timeObj\", timeObj);\n node.status({fill:\"green\",shape:\"ring\",text:\"start - \" + val + ' ' + msg.state});\n return msg;\n}\n\nmsg.payload = formateSeconds(val);\nmsg.number = val;\nif (timeObj) {\n msg.state = stateStarted;\n} else {\n msg.state = stateStopped;\n}\nnode.status({fill:\"yellow\",shape:\"dot\",text:\"interposed - \" + val + ' ' + msg.state});\nreturn msg;\n\n\nfunction formateSeconds(totalSeconds) {\n hours = Math.floor(totalSeconds / 3600);\n totalSeconds %= 3600;\n minutes = Math.floor(totalSeconds / 60);\n seconds = totalSeconds % 60;\n return `${hours}:${minutes}:${seconds}`;\n}\n\nfunction formateMinutes(totalMinutes) {\n hours = Math.floor(totalMinutes / 60);\n minutes = totalMinutes % 60;\n return `${hours}:${minutes}`;\n}","outputs":1,"noerr":0,"x":450,"y":4220,"wires":[["cae2aa92.e5e988","bd59fae1.f6ec28"]]},{"id":"c7ced69a.3637d8","type":"ui_text_input","z":"de4e9c38.0d942","name":"","label":"Timerset","tooltip":"Eingabe in Sek","group":"e29ba44.4b8fb58","order":2,"width":0,"height":0,"passthru":true,"mode":"number","delay":300,"topic":"setValue","x":340,"y":4300,"wires":[["c81070cb.1e875"]]},{"id":"84db98c1.e63c58","type":"comment","z":"de4e9c38.0d942","name":"Timerbeispiel mit Daskboard","info":"","x":300,"y":4120,"wires":[]},{"id":"7611594.9c787a8","type":"inject","z":"de4e9c38.0d942","name":"Temp set","topic":"","payload":"30","payloadType":"num","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":180,"y":4300,"wires":[["c7ced69a.3637d8"]]},{"id":"cae2aa92.e5e988","type":"ui_text","z":"de4e9c38.0d942","group":"e29ba44.4b8fb58","order":6,"width":0,"height":0,"name":"","label":"Timerstatus","format":"{{msg.state}}","layout":"row-spread","x":630,"y":4160,"wires":[]},{"id":"bd59fae1.f6ec28","type":"ui_text","z":"de4e9c38.0d942","group":"e29ba44.4b8fb58","order":6,"width":0,"height":0,"name":"","label":"Timerausgabe","format":"{{msg.payload}}","layout":"row-spread","x":640,"y":4220,"wires":[]},{"id":"e29ba44.4b8fb58","type":"ui_group","z":"","name":"Timer","tab":"7796518b.953d6","order":2,"disp":true,"width":"6","collapse":false},{"id":"7796518b.953d6","type":"ui_tab","z":"","name":"Testseite","icon":"dashboard","disabled":false,"hidden":false}]
-
- Beiträge: 447
- Registriert: 13.09.2017, 05:11
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 12 Mal
Re: Timer im Dashboard anzeigen
Hallo Hypnos,
habe das Update gemacht und es funktioniert super.
Danke für Dein super Beispiel! Wie was gelernt .
Anbei nur zur Vollständigkeit der neue Flow mit der "mytimeout" Node.
Zusatz:
@hypnos, mir ist aufgefallen das in der Funktion Deines Beispiels ggf. noch ein kleiner Bug bei Eingaben >1439 liegt. Siehe: viewtopic.php?f=77&t=57282&p=568344#p568344
Zusatz 2:
Bedienerfehler, habe den richtigen Parameter in der Funktion hinterlegt (in meinem Beispiel "1000" und nicht "60000"). Nun geht es natürlich .
Gruß Thomas
habe das Update gemacht und es funktioniert super.
Danke für Dein super Beispiel! Wie was gelernt .
Anbei nur zur Vollständigkeit der neue Flow mit der "mytimeout" Node.
Code: Alles auswählen
[{"id":"828dbb3.059bfc8","type":"ui_button","z":"8497f6fa.919d4","name":"","group":"f5d092d.58886f","order":2,"width":"2","height":"1","passthru":false,"label":"Start","tooltip":"","color":"","bgcolor":"","icon":"","payload":"on","payloadType":"str","topic":"","x":90,"y":180,"wires":[["e3090f2d.920bc","c127f7e3.94f598"]]},{"id":"6bad355c.1f70a4","type":"ui_button","z":"8497f6fa.919d4","name":"","group":"f5d092d.58886f","order":3,"width":"2","height":"1","passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"off","x":90,"y":220,"wires":[["e3090f2d.920bc"]]},{"id":"1870cd3f.6c1c8b","type":"mytimeout","z":"8497f6fa.919d4","name":"","outtopic":"","outsafe":"","outwarning":"Warning","outunsafe":"off","warning":"5","timer":"30","debug":false,"ndebug":false,"ignoreCase":false,"repeat":false,"again":false,"x":410,"y":200,"wires":[["c127f7e3.94f598"],["bbfbc14a.cb185"]]},{"id":"e3090f2d.920bc","type":"function","z":"8497f6fa.919d4","name":"Timersetup","func":"// Need to change the on to\n// { \"payload\": \"on\", \"timeout\": 69, \"warning\": 10 }\n\nif(msg.payload == \"on\") {\n msg.payload = { \n \"payload\": \"on\", \n \"timeout\": flow.get('timerset'),\n \"warning\": 10\n // \"timeout\": global.get('timerMin'),\n// \"warning\": global.get('warningMin')\n };\n} else {\n msg.payload = { \"payload\": \"off\" };\n}\nreturn msg;","outputs":1,"noerr":0,"x":250,"y":200,"wires":[["1870cd3f.6c1c8b"]]},{"id":"16c30b6f.a4d9c5","type":"change","z":"8497f6fa.919d4","name":"Speichern in Context","rules":[{"t":"move","p":"payload","pt":"msg","to":"timerset","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":280,"wires":[[]]},{"id":"aafa31e2.1b9328","type":"ui_text_input","z":"8497f6fa.919d4","name":"","label":"Timerset","tooltip":"Eingabe in Sek","group":"f5d092d.58886f","order":2,"width":0,"height":0,"passthru":true,"mode":"number","delay":300,"topic":"","x":280,"y":280,"wires":[["16c30b6f.a4d9c5"]]},{"id":"bbfbc14a.cb185","type":"function","z":"8497f6fa.919d4","name":"in Millisek.","func":"var temp = msg.payload;\ntemp = temp*1000;\n\nvar newmsg = { payload: temp};\nreturn newmsg;","outputs":1,"noerr":0,"x":590,"y":200,"wires":[["49a1a1a8.1aec8"]]},{"id":"9697453d.0ec34","type":"comment","z":"8497f6fa.919d4","name":"Timerbeispiel mit Daskboard","info":"","x":160,"y":100,"wires":[]},{"id":"f8c560b8.27c51","type":"inject","z":"8497f6fa.919d4","name":"Temp set","topic":"","payload":"30","payloadType":"num","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":120,"y":280,"wires":[["aafa31e2.1b9328"]]},{"id":"c127f7e3.94f598","type":"ui_text","z":"8497f6fa.919d4","group":"f5d092d.58886f","order":6,"width":0,"height":0,"name":"","label":"Timerstatus","format":"{{msg.payload}}","layout":"row-spread","x":570,"y":160,"wires":[]},{"id":"6ad3ca78.ddc08c","type":"ui_text","z":"8497f6fa.919d4","group":"f5d092d.58886f","order":6,"width":0,"height":0,"name":"","label":"Timerausgabe","format":"{{msg.payload}}","layout":"row-spread","x":980,"y":200,"wires":[]},{"id":"49a1a1a8.1aec8","type":"time-comp","z":"8497f6fa.919d4","outputs":1,"name":"Format Timer","positionConfig":"e28c4276.669068","input":"","inputType":"msgPayload","inputFormat":"0","inputOffset":0,"inputOffsetType":"none","inputOffsetMultiplier":60000,"rules":[],"checkall":"true","result1":"","result1Type":"msgPayload","result1Value":"","result1ValueType":"input","result1Format":"UTC:HH:mm:ss","result1Offset":0,"result1OffsetType":"none","result1OffsetMultiplier":60000,"x":780,"y":200,"wires":[["6ad3ca78.ddc08c"]]},{"id":"f5d092d.58886f","type":"ui_group","z":"","name":"Timer","tab":"6303ba8f.cda9a4","order":2,"disp":true,"width":"6","collapse":false},{"id":"e28c4276.669068","type":"position-config","z":"","name":"Bremen","isValide":"true","longitude":"0","latitude":"0","angleType":"deg","timeZoneOffset":"99","timeZoneDST":"0","stateTimeFormat":"3","stateDateFormat":"12"},{"id":"6303ba8f.cda9a4","type":"ui_tab","z":"","name":"Testseite","icon":"dashboard","disabled":false,"hidden":false}]
@hypnos, mir ist aufgefallen das in der Funktion Deines Beispiels ggf. noch ein kleiner Bug bei Eingaben >1439 liegt. Siehe: viewtopic.php?f=77&t=57282&p=568344#p568344
Zusatz 2:
Bedienerfehler, habe den richtigen Parameter in der Funktion hinterlegt (in meinem Beispiel "1000" und nicht "60000"). Nun geht es natürlich .
Gruß Thomas
972 Kanäle in 165 Geräten: Davon 16 HM, 145 HMIP, 2 Gruppen und 2 CUXD Geräte