Dimmy über TP1-TP6 steuern?

Hallo zusammen,

ich bin über folgenden Beitrag gestolpert. Würde sich das nicht auf die Steuerung über Tasterdruck um Bügeln lassen?
https://flows.nodered.org/flow/b0a8df9a33b4c53427a5304f31c8705a
Wenn ich die Eingänge des Relay Bausteins auswerte?

Hey,

versuch mal das hier:

[{"id":"ac99b5b05abe5bfe","type":"inject","z":"d7541481519af74d","name":"true","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":870,"y":660,"wires":[["8b5c7a3c16c40fc2"]]},{"id":"23d87658fb48e428","type":"inject","z":"d7541481519af74d","name":"false","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":870,"y":700,"wires":[["8b5c7a3c16c40fc2"]]},{"id":"6cec84b33532a098","type":"ui_slider","z":"d7541481519af74d","name":"","label":"slider","tooltip":"","group":"4229bceb.57ece4","order":2,"width":0,"height":0,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","min":0,"max":"100","step":1,"x":1970,"y":700,"wires":[["6799ee9ec22ff987"]]},{"id":"4dbe60385a046c44","type":"trigger","z":"d7541481519af74d","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-250","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":1630,"y":700,"wires":[["e6435cfb7e32baf5"]]},{"id":"e6435cfb7e32baf5","type":"function","z":"d7541481519af74d","name":"long push","func":"if (flow.get(\"timer\") == \"stop\") {\n    return null\n}\n\n//if dimmer > 50 then dim down\nif (flow.get(\"dimmer0_state\") >= 50) {\n    if (global.get(\"dimmer0\") <= 0) {\n        global.set(\"dimmer0\", 0)\n    }\n    else { global.set(\"dimmer0\", global.get(\"dimmer0\")-7.5)}\n}\n//if dimmer < 50 then dim up\nelse if (flow.get(\"dimmer0_state\") < 50) {\n    if (global.get(\"dimmer0\") >= 100) {\n        global.set(\"dimmer0\", 100)\n    }\n    else { global.set(\"dimmer0\", global.get(\"dimmer0\")+7.5)}\n}\nmsg.payload = global.get(\"dimmer0\")\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1820,"y":700,"wires":[["6cec84b33532a098"]]},{"id":"8b5c7a3c16c40fc2","type":"function","z":"d7541481519af74d","name":"get true/false","func":"flow.set(\"dimmer0_state\", Number(global.get(\"dimmer0\")))\n\nif (msg.payload == true) {\n    msg.time = Date.now()\n    msg.topic = \"start\"\n    flow.set(\"timer\", \"start\")\n}\nif (msg.payload == false) {\n    msg.time = Date.now()\n    msg.topic = \"stop\"\n    flow.set(\"timer\", \"stop\")\n}\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1030,"y":680,"wires":[["8c23a4213e9f3f0c"]]},{"id":"6799ee9ec22ff987","type":"debug","z":"d7541481519af74d","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2120,"y":700,"wires":[]},{"id":"8c23a4213e9f3f0c","type":"join","z":"d7541481519af74d","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"1","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1210,"y":680,"wires":[["b5d31f390e917e80"]]},{"id":"b5d31f390e917e80","type":"function","z":"d7541481519af74d","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1400,"y":680,"wires":[["33ade699c1b8d5f1"],["4dbe60385a046c44"]]},{"id":"33ade699c1b8d5f1","type":"function","z":"d7541481519af74d","name":"short push","func":"msg.payload = (global.get(\"dimmer0\") > 0 ? 0 : 50)\nglobal.set(\"dimmer0\", msg.payload)\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1810,"y":660,"wires":[["6cec84b33532a098"]]},{"id":"4229bceb.57ece4","type":"ui_group","name":"Zigbee","tab":"b128bba3.f99e38","order":5,"disp":true,"width":"6","collapse":false},{"id":"b128bba3.f99e38","type":"ui_tab","name":"Einstellungen","icon":"dashboard","order":6,"disabled":false,"hidden":false}]

Mit den Injects am Anfang hab ich true oder false, das von den MCPs kommt emuliert. Dann wird über die join Node geprüft, ob true und false innerhalb von einer Sekunde gekommen sind, dann gehe ich von einem Short push aus und setze den Slider (Dimmer) entweder auf 0 wenn er an ist, oder auf 50 wenn er aus ist.
Bei einem Long Push, also länger als eine Sekunde, werden dem Dimmerwert alle 250ms 7,5 hinzu addiert oder abgezogen, bis er entweder auf 100 oder auf 0 steht. Oder ein false kommt.
Gut möglich, dass true und false noch getauscht werden müssen. Aber ich denke das könnte ein guter Ansatz sein

Mega das Probiere ich mal aus!

1 Like

@thesmartvanproject
Hallo Matze.
ich bab das bei mir schon länger, allerdinst mit externen Eingängen über MQTT.
funktioniert einwandfrei :wink:

Gruß
Arno

1 Like

Ich wollte das über Zigbee2MQTT realisieren, allerdings bekomme ich das leider nicht richtig hin.
Als Aktor habe ich den Hue Button ( Philips 8718699693985 control via MQTT | Zigbee2MQTT) verwendet. Das Gerät sendet bei Tastendruck nur:

{“action”: “brightness_step_down”, “action_step_size”:56, “action_transition_time”:0.09, “battery”:100, “linkquality”:184, “update”:{“state”: “idle”}}

oder

{“action”: “brightness_step_up”, “action_step_size”:56, “action_transition_time”:0.09, “battery”:100, “linkquality”:176, “update”:{“state”: “idle”}}

Vielleicht wäre es doch einfach über die GPIO zu gehen?
Welchen Schalter / Aktor habt ihr verwenet?

Hey Chris,

Dafür schaust du einfach ob brighntess_up oder brighness_down reinkommt und setzt dann dementsprechend den neuen Dimmerwert. Hab dabei wirklich nur die action value berücksichtigt.

Danach kannst du direkt über die MQTT Api den Dimmer schalten, hier am Beispiel vom ersten Dimmer:

[{"id":"a3e1e0bb3f703883","type":"function","z":"71d2baa986138c38","name":"set dimmer ","func":"if (msg.payload.action == \"brightness_step_up\") {\n    if (global.get(\"dimmer0\") <= 100) {\n        msg.payload = global.get(\"dimmer0\") + 7.5\n    }\n    else if (global.get(\"dimmer0\") > 100) {\n        msg.payload = 100  \n    }\n}\nelse if (msg.payload.action == \"brightness_step_down\") {\n    if (global.get(\"dimmer0\") >= 0) {\n        msg.payload = global.get(\"dimmer0\") - 7.5\n    }\n    else if (global.get(\"dimmer0\") < 0) {\n        msg.payload = 0\n    }\n}\n\nmsg.topic =\"pkw/cmnd/dimmer/1/POWER\"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1810,"y":2120,"wires":[["719eb6dea11c0730"]]},{"id":"b018a0d618827a04","type":"mqtt in","z":"71d2baa986138c38","name":"","topic":"zigbee2mqtt/test","qos":"2","datatype":"auto-detect","broker":"0ddb07c65cbb68bc","nl":false,"rap":true,"rh":0,"inputs":0,"x":1620,"y":2120,"wires":[["a3e1e0bb3f703883"]]},{"id":"719eb6dea11c0730","type":"mqtt out","z":"71d2baa986138c38","name":"","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"0ddb07c65cbb68bc","x":1970,"y":2120,"wires":[]},{"id":"0ddb07c65cbb68bc","type":"mqtt-broker","name":"","broker":"http://localhost","port":"1883","clientid":"","usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]

Denk dran die MQTT Nodes entsprechend anzupassen.

1 Like

Also das Funktioniert top. habe es jetzt auch auf den MCP um gebaut. Das Dimmen funktioniert jetzt auch Mit Taster Druck.

[{"id":"48ac167d7d63684d","type":"trigger","z":"0e4ef1e0739bd351","name":"","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"-250","extend":false,"overrideDelay":false,"units":"ms","reset":"false","bytopic":"all","topic":"topic","outputs":1,"x":780,"y":400,"wires":[["481e8c0f05c3bbe1"]]},{"id":"481e8c0f05c3bbe1","type":"function","z":"0e4ef1e0739bd351","name":"long push","func":"if (flow.get(\"timer\") == \"stop\") {\n    return null\n}\n\n//if dimmer > 50 then dim down\nif (flow.get(\"dimmer0_state\") >= 50) {\n    if (global.get(\"dimmer0\") <= 0) {\n        global.set(\"dimmer0\", 0)\n    }\n    else { global.set(\"dimmer0\", global.get(\"dimmer0\")-7.5)}\n}\n//if dimmer < 50 then dim up\nelse if (flow.get(\"dimmer0_state\") < 50) {\n    if (global.get(\"dimmer0\") >= 100) {\n        global.set(\"dimmer0\", 100)\n    }\n    else { global.set(\"dimmer0\", global.get(\"dimmer0\")+7.5)}\n}\nmsg.payload = global.get(\"dimmer0\")\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":980,"y":380,"wires":[["9c260c0c01dcecee"]]},{"id":"d0dd5900fa9af270","type":"function","z":"0e4ef1e0739bd351","name":"get true/false","func":"flow.set(\"dimmer0_state\", Number(global.get(\"dimmer0\")))\n\nif (msg.payload == true) {\n    msg.time = Date.now()\n    msg.topic = \"start\"\n    flow.set(\"timer\", \"start\")\n}\nif (msg.payload == false) {\n    msg.time = Date.now()\n    msg.topic = \"stop\"\n    flow.set(\"timer\", \"stop\")\n}\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":320,"wires":[["de4894f66561fbc5"]]},{"id":"de4894f66561fbc5","type":"join","z":"0e4ef1e0739bd351","name":"long/short push?","mode":"custom","build":"object","property":"time","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"1","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":500,"y":320,"wires":[["ba9b11e91ca85947"]]},{"id":"ba9b11e91ca85947","type":"function","z":"0e4ef1e0739bd351","name":"short/long push","func":"if (msg.time.hasOwnProperty(\"start\") && msg.time.hasOwnProperty(\"stop\") && msg.topic == \"stop\") {\n    return [msg, null]\n}\nelse if (msg.topic == \"start\") { \n    return [null, msg]\n}\nelse if (msg.topic == \"stop\") { \n    msg.payload = false\n    return [null, msg]\n}","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":380,"wires":[["86814d1319edae5b"],["48ac167d7d63684d"]]},{"id":"86814d1319edae5b","type":"function","z":"0e4ef1e0739bd351","name":"short push","func":"msg.payload = (global.get(\"dimmer0\") > 0 ? 0 : 50)\nglobal.set(\"dimmer0\", msg.payload)\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":340,"wires":[["9c260c0c01dcecee"]]},{"id":"e73a6c69d1030105","type":"mcp23017input","z":"0e4ef1e0739bd351","name":"","chip":"4e9949f3b6e19991","bitNum":"2","pullUp":true,"invert":true,"debounce":200,"onMsg":true,"offMsg":true,"x":120,"y":320,"wires":[["d0dd5900fa9af270"]]},{"id":"4e9949f3b6e19991","type":"mcp23017chip","addr":"0x20","interval":"100"}]

Das MCP element und den Get true/false habe ich aus dem Relay Control Node genommen.

Richtig Nice habe noch gar nicht mit Node gearbeitet aber das ist echt Easy.

2 Likes

Welche Taster oder Schalter verwendest du?

Ich habe normale Runde Drucktaster von Amazon im Bus verbaut. Allerdings ist der Aufbau bei mir noch auf dem Schreibtisch und ich habe das jetzt mit offenen Kabelende in verbindung zu Masse getestet.

1 Like

Hey,
ich bekomme das einfach nicht hin. das ist zu kompliziert für mein skilllevel :smiley:
bei langem Tastendruck “hold” bleibt der Wert 7x bei 92,5 und dann 7x bei 107,5
Wahrscheinlich ist das ziemlich einfach, aber für mich zu schwierig :slight_smile: