Timer im Dashboard anzeigen

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
Azubi2019
Beiträge: 10
Registriert: 05.08.2019, 19:04

Timer im Dashboard anzeigen

Beitrag von Azubi2019 » 05.03.2020, 18:43

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.

Nucom AG
Beiträge: 33
Registriert: 15.04.2019, 14:52
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: Timer im Dashboard anzeigen

Beitrag von Nucom AG » 06.03.2020, 08:28

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.

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}]
MfG

Fabian

Azubi2019
Beiträge: 10
Registriert: 05.08.2019, 19:04

Re: Timer im Dashboard anzeigen

Beitrag von Azubi2019 » 06.03.2020, 08:39

Vielen Dank, das probiere ich direkt heute Abend aus.

tloeffel
Beiträge: 447
Registriert: 13.09.2017, 05:11
Hat sich bedankt: 1 Mal
Danksagung erhalten: 12 Mal

Re: Timer im Dashboard anzeigen

Beitrag von tloeffel » 06.03.2020, 11:50

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:
200306_Timer1.JPG
200306_Timer1.JPG (14.93 KiB) 2503 mal betrachtet

Der Flow mit Zeitformatierung:
200306_Timer2.JPG
Der Flow ohne Zeitformatierung:
200306_Timer3.JPG

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

Hypnos
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

Beitrag von Hypnos » 06.03.2020, 20:57

tloeffel hat geschrieben:
06.03.2020, 11:50
- node-red-contrib-moment (bei Redmatic schon da, denke ich)
Nein ist diese nicht. Das geht auch mit der "Time change and compare" node die mit bei RedMatic dabei ist.

Hypnos
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

Beitrag von Hypnos » 07.03.2020, 15:16

Hier die funktionierende Variante mit der timer-comp node, ohne weitere Nodes:
2020-03-07_15h05 001.png
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}]
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. :D
Ich wollte nur mal ein Beispiel was mit dieser node möglich ist.

Hier die Variante nur mit der function node:
2020-03-07_15h26 001.png

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}]

tloeffel
Beiträge: 447
Registriert: 13.09.2017, 05:11
Hat sich bedankt: 1 Mal
Danksagung erhalten: 12 Mal

Re: Timer im Dashboard anzeigen

Beitrag von tloeffel » 07.03.2020, 19:04

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.
200307_Timer1.JPG

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}]
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 :-).
200307_Timer5.JPG

Gruß Thomas
972 Kanäle in 165 Geräten: Davon 16 HM, 145 HMIP, 2 Gruppen und 2 CUXD Geräte

Antworten

Zurück zu „RedMatic“