Hosky maximist
j.stam.84 schreef op donderdag 3 december 2020 @ 15:55:
Beginner met Node-Red (en Home Assistant). Ik ben nu al een poosje aan het stoeien geweest met de volgende flow:
code:
1 [{"id":"3775d8ea.3b0ed8","type":"server-state-changed","z":"4928fa9a.ebfbd4","name":"Bathroom downstairs - humidity","server":"9a666d58.4e6c","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.badkamer_beneden_dht_humidity","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"$number(\t $entities(\"sensor.gang_beneden_dht_humidity\").state\t)+10","halt_if_type":"jsonata","halt_if_compare":"gte","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":150,"y":160,"wires":[["be3d6d0.572909"],["659657ca.7053c8"]]},{"id":"be3d6d0.572909","type":"change","z":"4928fa9a.ebfbd4","name":"Bathroom downstairs - 1","rules":[{"t":"set","p":"bathroom_downstairs","pt":"flow","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":60,"wires":[["f616aaa1.d7f7e8","368f5668.c42e0a"]]},{"id":"659657ca.7053c8","type":"change","z":"4928fa9a.ebfbd4","name":"Bathroom downstairs - 0","rules":[{"t":"set","p":"bathroom_downstairs","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":100,"wires":[["f616aaa1.d7f7e8","368f5668.c42e0a"]]},{"id":"f616aaa1.d7f7e8","type":"function","z":"4928fa9a.ebfbd4","name":"Bathroom downstairs - humidity","func":"var a = flow.get('bathroom_downstairs'); \nif (a > 0)\n{\n node.status({fill:\"red\",shape:\"ring\",text:\"High\"});\n}\nelse{\n node.status({fill:\"green\",shape:\"dot\",text:\"Normal\"});\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":730,"y":80,"wires":[[]]},{"id":"c8fe043b.0c0f78","type":"server-state-changed","z":"4928fa9a.ebfbd4","name":"Bathroom upstairs - humidity","server":"9a666d58.4e6c","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"sensor.badkamer_boven_dht_humidity","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"$number(\t $entities(\"sensor.gang_beneden_dht_humidity\").state\t)+15","halt_if_type":"jsonata","halt_if_compare":"gte","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":140,"y":300,"wires":[["e1941d2c.861ae"],["eddaf989.740d28"]]},{"id":"e1941d2c.861ae","type":"change","z":"4928fa9a.ebfbd4","name":"Bathroom upstairs - 1","rules":[{"t":"set","p":"bathroom_upstairs","pt":"flow","to":"1","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":260,"wires":[["21b5705c.d5705","368f5668.c42e0a"]]},{"id":"eddaf989.740d28","type":"change","z":"4928fa9a.ebfbd4","name":"Bathroom upstairs - 0","rules":[{"t":"set","p":"bathroom_upstairs","pt":"flow","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":300,"wires":[["21b5705c.d5705","368f5668.c42e0a"]]},{"id":"21b5705c.d5705","type":"function","z":"4928fa9a.ebfbd4","name":"Bathroom upstairs - humidity","func":"var a = flow.get('bathroom_upstairs'); \nif (a > 0)\n{\n node.status({fill:\"red\",shape:\"ring\",text:\"High\"});\n}\nelse{\n node.status({fill:\"green\",shape:\"dot\",text:\"Normal\"});\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":720,"y":300,"wires":[[]]},{"id":"506e5832.e1d4c8","type":"poll-state","z":"4928fa9a.ebfbd4","name":"Hallway downstairs - humidity","server":"9a666d58.4e6c","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":false,"entity_id":"sensor.gang_beneden_dht_humidity","state_type":"str","halt_if":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"x":140,"y":220,"wires":[[]]},{"id":"6afd390a.e79e38","type":"comment","z":"4928fa9a.ebfbd4","name":"XXX: DHT sensor landing","info":"","x":450,"y":340,"wires":[]},{"id":"6547591c.da87a8","type":"debug","z":"4928fa9a.ebfbd4","name":"Off","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"\"Extraction off\"","targetType":"jsonata","statusVal":"","statusType":"auto","x":950,"y":280,"wires":[]},{"id":"ed67dad3.61e358","type":"debug","z":"4928fa9a.ebfbd4","name":"On","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"\"Extraction on\"","targetType":"jsonata","statusVal":"","statusType":"auto","x":950,"y":180,"wires":[]},{"id":"81831f62.fbbaf","type":"switch","z":"4928fa9a.ebfbd4","name":"Action","property":"payload","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"num"},{"t":"eq","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":810,"y":240,"wires":[["ed67dad3.61e358"],["6547591c.da87a8"]]},{"id":"15bc8205.c9c2ce","type":"inject","z":"4928fa9a.ebfbd4","name":"Test high","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"69","payloadType":"str","x":140,"y":80,"wires":[["be3d6d0.572909"]]},{"id":"681b77c7.30f7c8","type":"inject","z":"4928fa9a.ebfbd4","name":"Test low","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"1","topic":"","payload":"0","payloadType":"str","x":140,"y":120,"wires":[["659657ca.7053c8"]]},{"id":"368f5668.c42e0a","type":"function","z":"4928fa9a.ebfbd4","name":"Extraction needed","func":"var a = flow.get('bathroom_downstairs');\nvar b = flow.get('bathroom_upstairs');\n\nmsg.payload = ( a+b ? 1 : 0 )\n\nstatus = ( msg.payload ? \"Yes\" : \"No\")\nnode.status({fill:\"blue\",shape:\"ring\",text:status});\n\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":690,"y":160,"wires":[["9fb22d23.ea0a7"]]},{"id":"d7d1b899.6fb688","type":"inject","z":"4928fa9a.ebfbd4","name":"Test high","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"69","payloadType":"str","x":140,"y":360,"wires":[["e1941d2c.861ae"]]},{"id":"a9aa27ea.689098","type":"inject","z":"4928fa9a.ebfbd4","name":"Test low","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"str","x":140,"y":400,"wires":[["eddaf989.740d28"]]},{"id":"ed1c86a0.b291a8","type":"comment","z":"4928fa9a.ebfbd4","name":"Extraction","info":"","x":80,"y":40,"wires":[]},{"id":"9fb22d23.ea0a7","type":"rbe","z":"4928fa9a.ebfbd4","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":670,"y":240,"wires":[["81831f62.fbbaf","9b438149.44ecd"]]},{"id":"9b438149.44ecd","type":"ha-get-entities","z":"4928fa9a.ebfbd4","server":"9a666d58.4e6c","name":"","rules":[{"property":"entity_id","logic":"is","value":".*humidity$","valueType":"re"}],"output_type":"split","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":710,"y":380,"wires":[["f1e62592.fe5768"]]},{"id":"7227aba0.6e8c94","type":"debug","z":"4928fa9a.ebfbd4","name":"","active":true,"tosidebar":true,"console":true,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":850,"y":480,"wires":[]},{"id":"5317af6c.a0716","type":"join","z":"4928fa9a.ebfbd4","name":"","mode":"custom","build":"string","property":"text","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"5","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":710,"y":440,"wires":[["c237593f.909a58"]]},{"id":"c237593f.909a58","type":"function","z":"4928fa9a.ebfbd4","name":"Notification","func":"newmsg = {};\nnewmsg.payload = { data: {'message': msg.text } };\n\nreturn newmsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":480,"wires":[["7227aba0.6e8c94"]]},{"id":"f1e62592.fe5768","type":"change","z":"4928fa9a.ebfbd4","name":"Set text","rules":[{"t":"set","p":"text","pt":"msg","to":"msg.payload.attributes.humidity & ' - ' & msg.payload.attributes.friendly_name","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":440,"wires":[["5317af6c.a0716"]]},{"id":"9a666d58.4e6c","type":"server","name":"Home Assistant","legacy":false,"addon":false,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
Mijn probleem is dat ik het idee heb dat de RBE node in mijn flow alle msg.payload dropt totdat deze wijzigt ten opzichte van de laatste waarde. Dat zou concreet moeten betekenen dat de aan/uit messages niet twee keer achter elkaar doorkomen. Wanneer ik de flow deploy en hem even laat lopen lijkt het niet zo te werken zoals ik voor ogen heb, als ik kijk naar de logs:
code:
1 2 3 4 5 6 7 8 9 10 11 { data:, 3 Dec 15:11:55 - [info] [debug:Off] Extraction off, { payload:, 3 Dec 15:11:55 - [info] [debug:7227aba0.6e8c94] , '52.85 - Badkamer Beneden - DHT humidity\n53.87 - Gang beneden - DHT humidity\n58.83 - Badkamer Boven - DHT humidity' } },, { message:, _msgid: '969f41a8.45f53' }, 3 Dec 15:37:27 - [info] [debug:Off] Extraction off, 3 Dec 15:37:27 - [info] [debug:7227aba0.6e8c94] , '52.08 - Badkamer Beneden - DHT humidity\n52.68 - Gang beneden - DHT humidity\n58.83 - Badkamer Boven - DHT humidity' } },, _msgid: 'b63f227a.fac6f' }
Twee keer "Extraction off" achter elkaar zou in deze toch niet mogelijk moeten zijn ? Ik ga er stiekem vanuit dat de flow goed te begrijpen valt. Mocht er meer info moeten komen, hoor ik het graag!
Wie kan mij advies geven / wat zie ik over het hoofd ?
Dit levert geen OR op en dit is ook niet de situatie die je nu hebt.
Er kunnen zich in de basis 2 events voordoen in je setup, namelijk:
1. sensor 1 gaat OFF
2. sensor 2 gaat OFF
Jij wilt dat als beide OFF zijn je lichten uitgaan.
In mijn flow gebeurt het volgende:
Bovenste stuk:
Sensor 1 gaat op OFF, check of sensor 2 op OFF staat. Als dat het geval is--> licht uit, als dat niet het geval is gebeurd er niets.
Onderste stuk
Sensor 2 gaat op OFF, check of sensor 1 op OFF staat. Als dat het geval is --> licht uit, als dat niet het geval is gebeurd er niets.
Waarom zou dit niet werken in jouw flow? Je licht zal nu enkel uitgaan indien beide op off staan. Indien 1 van beide op on staat gebeurt er niets.
@j.stam.84
Ik heb je node even geimport.
Als ik middels de inject node het test dan krijg ik max 1 message, dus kan je helaas niet verder helpen. Wel gafe node heb je gemaakt , mij iets te complex, denk het wel wat simpeler kan:)
[ Voor 13% gewijzigd door denuz op 06-12-2020 20:34 ]
:strip_exif()/f/image/obuzlb9gTW12n4S2vdL1haNM.jpg?f=fotoalbum_large)
[ Voor 77% gewijzigd door Jimbeam op 06-12-2020 20:47 ]
Hosky maximist
1
| [{"id":"bdfe4088.8ad59","type":"change","z":"5a2fc9d2.f02bf8","name":"","rules":[{"t":"set","p":"light_status","pt":"msg","to":"$split($.entity,\"_\")[1] & \"_\" & $.payload","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":1570,"wires":[["ddc3c3d2.6f786","4790edd7.107874"]]},{"id":"df34e262.75b27","type":"inject","z":"5a2fc9d2.f02bf8","name":"lamp 1 OFF","props":[{"p":"payload"},{"p":"entity","v":"light.lamp_1","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"OFF","payloadType":"str","x":290,"y":1530,"wires":[["bdfe4088.8ad59"]]},{"id":"c8b562e3.a9a5e","type":"inject","z":"5a2fc9d2.f02bf8","name":"lamp 1 ON","props":[{"p":"payload"},{"p":"entity","v":"light.lamp_1","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"ON","payloadType":"str","x":280,"y":1570,"wires":[["bdfe4088.8ad59"]]},{"id":"ddc3c3d2.6f786","type":"traffic","z":"5a2fc9d2.f02bf8","name":"","property_allow":"light_status","filter_allow":"1_OFF","ignore_case_allow":false,"negate_allow":false,"send_allow":false,"property_stop":"light_status","filter_stop":"1_ON","ignore_case_stop":false,"negate_stop":false,"send_stop":false,"default_start":false,"differ":false,"x":890,"y":1650,"wires":[["16e08ffa.b6d46"]]},{"id":"4790edd7.107874","type":"switch","z":"5a2fc9d2.f02bf8","name":"off?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"OFF","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":710,"y":1570,"wires":[["a8671f9c.ed1b5"]]},{"id":"16e08ffa.b6d46","type":"debug","z":"5a2fc9d2.f02bf8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1090,"y":1660,"wires":[]},{"id":"14881f6d.fffe81","type":"switch","z":"5a2fc9d2.f02bf8","name":"off?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"OFF","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":710,"y":1650,"wires":[["ddc3c3d2.6f786"]]},{"id":"a8671f9c.ed1b5","type":"traffic","z":"5a2fc9d2.f02bf8","name":"","property_allow":"light_status","filter_allow":"2_OFF","ignore_case_allow":false,"negate_allow":false,"send_allow":false,"property_stop":"light_status","filter_stop":"2_ON","ignore_case_stop":false,"negate_stop":false,"send_stop":false,"default_start":false,"differ":false,"x":880,"y":1570,"wires":[["30d6ab92.e9e924"]]},{"id":"478cfa93.4990f4","type":"change","z":"5a2fc9d2.f02bf8","name":"","rules":[{"t":"set","p":"light_status","pt":"msg","to":"$split($.entity,\"_\")[1] & \"_\" & $.payload","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":500,"y":1650,"wires":[["a8671f9c.ed1b5","14881f6d.fffe81"]]},{"id":"30d6ab92.e9e924","type":"debug","z":"5a2fc9d2.f02bf8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1090,"y":1560,"wires":[]},{"id":"8314f70f.1d4008","type":"inject","z":"5a2fc9d2.f02bf8","name":"lamp 2 ON","props":[{"p":"payload"},{"p":"entity","v":"light.lamp_2","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"ON","payloadType":"str","x":280,"y":1650,"wires":[["478cfa93.4990f4"]]},{"id":"8b87b6ae.395458","type":"inject","z":"5a2fc9d2.f02bf8","name":"lamp 2 OFF","props":[{"p":"payload"},{"p":"entity","v":"light.lamp_2","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"OFF","payloadType":"str","x":290,"y":1690,"wires":[["478cfa93.4990f4"]]}] |

In beide gevallen krijg je alléén een melding als beide apparaten of 'OFF' springen. Mooie hiervan is ook dat je weet in welk volgorde. Mocht dat handig zijn. Kan het makkelijker? Ja, zeker met HA sensoren. Dan zou ik ze gewoon achter elkaar plempen. Maar dit ziet er wel leuk uit
De RBE node werkt precies zoals jij denkt, dus er gaat ergens iets niet goed. NR toevallig herstart in de tussentijd?
[ Voor 8% gewijzigd door lolgast op 06-12-2020 21:46 ]
Maar die van denuz snap ik wel en die werkt perfect.
Hosky maximist
Gaat die SunSet goed bij jou?AUijtdehaag schreef op dinsdag 13 oktober 2020 @ 19:40:
@Aegle
Kun je hier iets mee?
code:
1 [{"id":"5a25ba8c.a50c94","type":"mqtt in","z":"451a5983.b9afa8","name":"SMA1930106727","topic":"sbfspot_1930106727","qos":"2","datatype":"auto","broker":"dea50b7b.7c8498","x":140,"y":80,"wires":[["ec0b07e6.7dcbb8","d9431a2f.0c6cc8","256254b1.70b39c"]]},{"id":"ec0b07e6.7dcbb8","type":"function","z":"451a5983.b9afa8","name":"Filter","func":"//devicename = msg.payload.fields.InvName\ninputjson = JSON.parse(msg.payload);\n\nvar _fields = {};\nfor(var item in inputjson){\n _fields[item] = inputjson[item];\n}\n\nmsg.payload = [\n {\n measurement: \"energy\",\n fields: _fields,\n timestamp: new Date(),\n tags:{\n\t\t device: msg.topic,\n\t\t direction: \"Zuid Boven\",\n\t\t },\n },\n ];\nreturn msg;\n\n\n","outputs":1,"noerr":0,"x":410,"y":80,"wires":[["3330b46b.76b31c"]]},{"id":"3d660e45.37df62","type":"influxdb batch","z":"451a5983.b9afa8","influxdb":"5ac075dd.fd7f4c","precision":"","retentionPolicy":"","name":"","x":890,"y":80,"wires":[]},{"id":"77658763.609188","type":"comment","z":"451a5983.b9afa8","name":"to InfluxDB","info":"","x":840,"y":40,"wires":[]},{"id":"3330b46b.76b31c","type":"switch","z":"451a5983.b9afa8","name":"Sunr-Suns","property":"payload[0].fields.Timestamp","propertyType":"msg","rules":[{"t":"btwn","v":"payload[0].fields.SunRise","vt":"msg","v2":"payload[0].fields.SunSet","v2t":"msg"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":80,"wires":[["3d660e45.37df62"]]},{"id":"c9b1cd17.37817","type":"comment","z":"451a5983.b9afa8","name":"Only between:","info":"","x":610,"y":40,"wires":[]},{"id":"9dc12900.766a18","type":"comment","z":"451a5983.b9afa8","name":"Zuid Boven","info":"","x":130,"y":40,"wires":[]},{"id":"256254b1.70b39c","type":"debug","z":"451a5983.b9afa8","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":350,"y":40,"wires":[]},{"id":"dea50b7b.7c8498","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"5ac075dd.fd7f4c","type":"influxdb","z":"","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"telegraf","name":"","usetls":false,"tls":""}]
Ik merk dat mijn SB3.0-AV40 op dat moment soms nog wat bogus waardes doorgeeft vlak voor uitschakelen.
Hierdoor wordt er door Node-Red gestopt met uitlezen en blijft er een opwekwaarde staan van bijv. 115 watt de hele nacht..
Wat me zo snel opviel was dat jullie weinig tot geen function nodes gebruiken? Persoonlijk had ik al snel het idee dat het niet ging lukken (of lastig werd) zonder.
Ben ook niet echt een NR expert, maar wie weet heeft iemand wat aan mijn creatie!
Deze flow zorgt ervoor dat de berichtjes van onze KAIFA slimmemeter (via een seriele P1 naar USB kabel van Ali) vertaalt worden naar MQTT, incl. de HASS discovery.
:no_upscale():strip_icc():fill(white):strip_exif()/f/image/aS4B2HGMleARWTOXOHecv0wS.jpg?f=user_large)
En de flow:
1
| [{"id":"b4e3b586.6ac2a8","type":"debug","z":"20ae7ee9.0312b2","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":310,"y":220,"wires":[]},{"id":"8d92138a.6a7d8","type":"serial in","z":"20ae7ee9.0312b2","name":"","serial":"cb747094.a80c","x":110,"y":160,"wires":[["b4e3b586.6ac2a8","969d4859.b5b808"]]},{"id":"969d4859.b5b808","type":"function","z":"20ae7ee9.0312b2","name":"Meterstanden uitlezen","func":"\nvar strDeviceName = context.get(\"deviceName\") || null;\nvar strDeviceManufacturer = context.get(\"deviceManufacturer\") || null;\nvar strDeviceModel = context.get(\"deviceModel\") || null;\nvar strDeviceSwVersion = context.get(\"deviceSwVersion\") || null;\nvar strDeviceID = context.get(\"deviceID\") || null;\nvar strDeviceGasID = context.get(\"deviceGasID\") || null;\n\nvar fltElektraHoogTarief = context.get(\"ElektraHoogTarief\") || null;\nvar fltElektraLaagTarief = context.get(\"ElektraLaagTarief\") || null;\n\n// Variabelen:\nvar msgPayload = msg.payload.trim();\nvar msgArray = null;\nvar strTopic = null;\nvar strPayload = null;\n\nvar strHassDiscoveryTopic = null;\nvar strHassDiscoveryPayload = null;\nvar strHassDiscoveryPayloadUnit = null;\nvar strHassDiscoveryPayloadFriendlyName = null;\nvar strHassDiscoveryPayloadEntityID = null;\nvar strHassDiscoveryPayloadIcon = null;\nvar strHassDiscoveryPayloadTemplate = null;\n\nvar date = new Date();\nvar year = date.getFullYear().toString();\t \nvar yearFirstPart = year.substr(0,2);\n\n// Indien de msgPayload met een '/' begint bevat deze de header informatie\n// Hieruit halen we deviceName en de deviceManufacturer.\nif (msgPayload.startsWith('/'))\n{\n context.set(\"deviceName\", msgPayload.replace('/', ''));\n if (msgPayload.includes(\"KAIFA\"))\n {\n context.set(\"deviceManufacturer\", \"KAIFA\");\n context.set(\"deviceModel\", context.get(\"deviceName\"))\n }\n else\n {\n context.set(\"deviceManufacturer\", \"Unknown\")\n context.set(\"deviceModel\", \"Unknown\")\n }\n}\nelse if (msgPayload.startsWith('!'))\n{\n // Einde van het bericht bereikt. Tijd om het totaal verbruik te versturen\n // msgArray[0] bevat doorgaans de Topic naam:\n\tstrTopic = strDeviceName + \"/\" + \"1-0:1.8.1 & 1-0:1.8.2\";\n\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Verbruik totaal';\n\tstrHassDiscoveryPayloadUnit = 'kWh';\n strHassDiscoveryPayloadIcon = 'mdi:flash';\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(fltElektraHoogTarief) + parseFloat(fltElektraLaagTarief)).toFixed(3));\n}\n// Anders, indien niet leeg...\nelse if(msgPayload !== \"\" && context.get(\"deviceName\") !== null)\n{\n // Maak van de msgPayload een array.\n // msgPayload : \"1-0:1.8.2(007646.115*kWh)\"\n // msgArray : \"1-0:1.8.2\",\"007646.115\",\"kWh\"\n \n\t// Gebruik van split + join vervangt hier replaceAll\n\t// welke blijkbaar niet werkt in Node-Red.\n\tmsgReplaced = msgPayload.split(')').join('');\n\tmsgReplaced = msgReplaced.split('(').join(',');\n\tmsgReplaced = msgReplaced.split('*s').join('s');\n\tmsgReplaced = msgReplaced.split('*').join(',');\n\n\tmsgArray = msgReplaced.split(\",\");\n\n // msgArray[0] bevat doorgaans de Topic naam:\n\tstrTopic = strDeviceName + \"/\" + msgArray[0];\n\n // Kijk of er een 'OBIS reference' waarde langs komt en doe er wat mee...\n\tswitch(msgArray[0]) {\n\tcase \"1-3:0.2.8\": // Version information for P1 output\n context.set(\"deviceSwVersion\", msgArray[1]);\n \n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n\t\tbreak;\n\tcase \"0-0:96.1.1\": // Equipment identifier\n context.set(\"deviceID\", msgArray[1]);\n\n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n\t\tbreak;\n\tcase \"0-1:96.1.0\": // Equipment identifier (Gas)\n context.set(\"deviceGasID\", msgArray[1]);\n\n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n\t\tbreak;\n\tcase \"0-0:1.0.0\": // Date-time stamp of the P1 message\n\t // 0-0:1.0.0(201016091834S) -> (YYMMDDHHmmss)\n\n\t // Payload: HH:mm:ss DD-MM-YY\n\t strPayload = msgArray[1].substr(6,2) + \":\" + msgArray[1].substr(8,2) + \":\" + msgArray[1].substr(10,2) + \" \" + msgArray[1].substr(4,2) + \"-\" + msgArray[1].substr(2,2) + \"-\" + yearFirstPart + msgArray[1].substr(0,2);\n\n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n\t\tbreak;\n\tcase \"1-0:1.8.1\": // Meter Reading electricity delivered to client (Tariff 1) in 0,001 kWh.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Verbruik laag tarief';\n\t\tstrHassDiscoveryPayloadUnit = 'kWh';\n strHassDiscoveryPayloadIcon = 'mdi:flash';\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(3));\n \n // Bewaar huidige waarde t.b.v. het totaal verbruik\n context.set(\"ElektraLaagTarief\", (parseFloat(msgArray[1])).toFixed(3));\n break;\n\tcase \"1-0:1.8.2\": // Meter Reading electricity delivered to client (Tariff 2) in 0,001 kWh.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Verbruik hoog tarief';\n\t\tstrHassDiscoveryPayloadUnit = \"kWh\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(3));\n\n // Bewaar huidige waarde t.b.v. het totaal verbruik\n context.set(\"ElektraHoogTarief\", (parseFloat(msgArray[1])).toFixed(3));\n break;\n\tcase \"1-0:2.8.1\": // Meter Reading electricity delivered by client (Tariff 1) in 0,001 kWh.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Levering laag tarief';\n\t\tstrHassDiscoveryPayloadUnit = \"kWh\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(3));\n break;\n\tcase \"1-0:2.8.2\": // Meter Reading electricity delivered by client (Tariff 2) in 0,001 kWh.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Levering hoog tarief';\n\t\tstrHassDiscoveryPayloadUnit = \"kWh\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(3));\n break;\n\tcase \"0-0:96.14.0\": // Tariff indicator elec-tricity.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Tarief groep';\n\t\tstrHassDiscoveryPayloadUnit = \"\";\n strHassDiscoveryPayloadIcon = \"mdi:cash-multiple\";\n //strHassDiscoveryPayloadTemplate = '{{% if states(\\'sensor.elektra_tarief_groep\\') | float = 2 %}Laag{% else %}Hoog{% endif %}}';\n\n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:1.7.0\": // Actual electricity power delivered (+P) in 1 Watt resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel verbruik';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:21.7.0\": // Instantaneous active power L1 (+P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel verbruik L1';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:41.7.0\": // Instantaneous active power L2 (+P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel verbruik L2';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:61.7.0\": // Instantaneous active power L3 (+P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel verbruik L3';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:2.7.0\": // Actual electricity power delivered (-P) in 1 Watt resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel geleverd';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:22.7.0\": // Instantaneous active power L1 (-P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel geleverd L1';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:42.7.0\": // Instantaneous active power L2 (-P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel geleverd L2';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:62.7.0\": // Instantaneous active power L3 (-P) in W resolution\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Actueel geleverd L3';\n\t\tstrHassDiscoveryPayloadUnit = \"W\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1]) * 1000).toFixed(0));\n break;\n\tcase \"1-0:31.7.0\": // Instantaneous current L1 in 1A resolution.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Stroom L1';\n\t\tstrHassDiscoveryPayloadUnit = \"A\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:51.7.0\": // Instantaneous current L2 in 1A resolution.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Stroom L2';\n\t\tstrHassDiscoveryPayloadUnit = \"A\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:71.7.0\": // Instantaneous current L3 in 1A resolution.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Stroom L3';\n\t\tstrHassDiscoveryPayloadUnit = \"A\";\n strHassDiscoveryPayloadIcon = \"mdi:flash\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"0-0:96.7.21\": // Number of power failures in any phase.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings uitval (Kort)';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"0-0:96.7.9\": // Number of long power failures in any phase.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings uitval (Lang)';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:32.32.0\": // Number of voltage sags in phase L1.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings dips L1';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:52.32.0\": // Number of voltage sags in phase L2.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings dips L2';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:72.32.0\": // Number of voltage sags in phase L3.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings dips L3';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:32.36.0\": // Number of voltage swells in phase L1.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings pieken L1';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:52.36.0\": // Number of voltage swells in phase L2.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings pieken L2';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:72.36.0\": // Number of voltage swells in phase L3.\n strHassDiscoveryPayloadFriendlyName = 'Elektra - Spannings pieken L3';\n\t\tstrHassDiscoveryPayloadUnit = \"x\";\n strHassDiscoveryPayloadIcon = \"mdi:flash-alert\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[1])).toFixed(0));\n break;\n\tcase \"1-0:99.97.0\": // Power Failure Event Log (long power failures).\n // Aantal log entries:\n var aantalLogEntries = parseFloat(msgArray[1]).toFixed(0);\n \n // Aantal log entries bericht:\n var logTopic = strTopic + \"(\" + msgArray[2] + \")/EventLogEntries\";\n var logPayload = aantalLogEntries\n \tvar logMsg = { payload: logPayload, topic: logTopic };\n\t node.send(logMsg);\n\n // Log bericht 1 - 10:\n for (var i = 1; i <= aantalLogEntries; i++)\n {\n // Start datum en tijd:\n\t // (201016091834S) -> (YYMMDDHHmmss) -> HH:mm:ss DD-MM-YY\n\t logPayload = msgArray[i*2 + 1].substr(6,2) + \":\" + msgArray[i*2 + 1].substr(8,2) + \":\" + msgArray[i*2 + 1].substr(10,2) + \" \" + msgArray[i*2 + 1].substr(4,2) + \"-\" + msgArray[i*2 + 1].substr(2,2) + \"-\" + yearFirstPart + msgArray[i*2 + 1].substr(0,2);\n \t logMsg = { payload: logPayload, topic: logTopic + \"/LogEntry:\" + i.toString() + \"/StartTime\" };\n\t node.send(logMsg);\n\n // Duur van de storing in seconden:\n\t logPayload = parseFloat(msgArray[i*2 + 2]).toFixed(0);\n \t logMsg = { payload: logPayload, topic: logTopic + \"/LogEntry:\" + i.toString() + \"/Duration\" };\n\t node.send(logMsg);\n }\n\t\tbreak;\n\tcase \"0-1:24.1.0\": // Device-Type\n\t strPayload = (parseFloat(msgArray[1])).toFixed(0);\n\n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n\t\tbreak;\n\tcase \"0-1:24.2.1\": // Last hourly value (temperature converted), gas delivered to client in m3, including decimal values and capture time.\n strHassDiscoveryPayloadFriendlyName = 'Gas - Verbruik';\n\t\tstrHassDiscoveryPayloadUnit = \"m3\";\n strHassDiscoveryPayloadIcon = \"mdi:fireplace\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht((parseFloat(msgArray[2])).toFixed(3));\n break;\n\tcase \"0-0:96.13.1\": // Text message codes: numeric 8 digits\n strHassDiscoveryPayloadFriendlyName = 'Tekst - Code';\n\t\tstrHassDiscoveryPayloadUnit = \"\";\n strHassDiscoveryPayloadIcon = \"mdi:message-text-outline\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht(msgArray[1]);\n break;\n\tcase \"0-0:96.13.0\": // Text message max 1024 characters.\n strHassDiscoveryPayloadFriendlyName = 'Tekst - Bericht';\n\t\tstrHassDiscoveryPayloadUnit = \"\";\n strHassDiscoveryPayloadIcon = \"mdi:message-text-outline\";\n \n // Verstuur huidige waarde en HASS discovery bericht:\n verstuurBericht(msgArray[1]);\n break;\n\tdefault:\n // OBIS reference niet gevonden?\n\t\tbreak;\n\t}\n}\n\n// =====================================================================================================================\n// =====================================================================================================================\n// =====================================================================================================================\n\nfunction verstuurBericht(strPayload) {\n // Verstuur HASS discovery bericht:\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadFriendlyName.toLowerCase();\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadEntityID.split('-').join('');\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadEntityID.split('(').join('');\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadEntityID.split(')').join('');\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadEntityID.split(' ').join(' ');\n strHassDiscoveryPayloadEntityID = strHassDiscoveryPayloadEntityID.split(' ').join('_');\n \n if(strHassDiscoveryPayloadTemplate !== \"\" && strHassDiscoveryPayloadTemplate !== null)\n {\n strHassDiscoveryPayloadTemplate = '\",\"value_template\":\"' + strHassDiscoveryPayloadTemplate;\n }\n else\n {\n strHassDiscoveryPayloadTemplate = \"\";\n }\n strHassDiscoveryTopic = \"homeassistant/sensor/\" + strDeviceName + \"/\" + strHassDiscoveryPayloadEntityID + \"/config\";\n strHassDiscoveryPayload = '{\"device\":{\"identifiers\":[\"' + strDeviceID + '\"],\"manufacturer\":\"' + strDeviceManufacturer + '\",\"model\":\"' + strDeviceModel + '\",\"name\":\"' + strDeviceName + '\",\"sw_version\":\"' + strDeviceSwVersion + '\"},\"icon\":\"' + strHassDiscoveryPayloadIcon + '\",\"name\":\"' + strHassDiscoveryPayloadFriendlyName + '\",\"state_topic\":\"' + strTopic + '\",\"unique_id\":\"' + strHassDiscoveryPayloadEntityID + '\",\"unit_of_measurement\":\"' + strHassDiscoveryPayloadUnit + strHassDiscoveryPayloadTemplate +'\"}';\n\t newMsg = { payload: strHassDiscoveryPayload, topic: strHassDiscoveryTopic };\n\t node.send(newMsg); \n\n // Verstuur bericht:\n\t newMsg = { payload: strPayload, topic: strTopic };\n\t node.send(newMsg); \n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":340,"y":160,"wires":[["647aab97.4d2934","4ddb0b82.ef07b4"]]},{"id":"647aab97.4d2934","type":"debug","z":"20ae7ee9.0312b2","name":"Complete msg object","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":600,"y":220,"wires":[]},{"id":"4ddb0b82.ef07b4","type":"mqtt out","z":"20ae7ee9.0312b2","name":"Data naar MQTT Broker","topic":"","qos":"1","retain":"false","broker":"9dd82745.b6011","x":610,"y":160,"wires":[]},{"id":"cb747094.a80c","type":"serial-port","z":"20ae7ee9.0312b2","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"\\n","bin":"false","out":"char","addchar":"","responsetimeout":"10000"},{"id":"9dd82745.b6011","type":"mqtt-broker","name":"MQTT Broker","broker":"192.168.2.4","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}] |
Opmerking en/of tips zijn natuurlijk welkom. Vragen ook, maar als vader van 2 jonge kinderen kan het even duren voor het antwoord er is
Ja dat werkt hier prima.loyske schreef op maandag 7 december 2020 @ 12:39:
[...]
Gaat die SunSet goed bij jou?
Ik merk dat mijn SB3.0-AV40 op dat moment soms nog wat bogus waardes doorgeeft vlak voor uitschakelen.
Hierdoor wordt er door Node-Red gestopt met uitlezen en blijft er een opwekwaarde staan van bijv. 115 watt de hele nacht..
https://snapshot.raintank...861LFNpj56u3XLKKDx0EtJFNx
Crontab van SBFspot staat op 1 minuut, misschien maakt dat nog uit?
[ Voor 6% gewijzigd door AUijtdehaag op 07-12-2020 16:52 ]
Ik heb een tweetal sensoren die ik wil uitlezen in node-red en deze data wil ik naar een influxdb schrijven. Ik heb een voorbeeld hiervan (onder de blauwe lijn) welke al werkt. Alleen mijn output (boven de blauwe lijn) krijg ik niet hetzelfde
/f/image/NvXNbmyOhEyw50xBtfNCz7DH.png?f=fotoalbum_large)
enige wat ik wil is die uitkomst van die sensor data in een influxdb pushen elke keer als het geupdate wordt.
Probeer om mee te beginnen de output van de debug node te wijzigen van msg.payload naar complete msg opbject. Dit kan in de properties van de debug node.Zorg schreef op woensdag 9 december 2020 @ 23:31:
hopelijk iemand die me een beetje op weg kan helpen met een zeer newbie vraag!
Ik heb een tweetal sensoren die ik wil uitlezen in node-red en deze data wil ik naar een influxdb schrijven. Ik heb een voorbeeld hiervan (onder de blauwe lijn) welke al werkt. Alleen mijn output (boven de blauwe lijn) krijg ik niet hetzelfde![]()
[Afbeelding]
enige wat ik wil is die uitkomst van die sensor data in een influxdb pushen elke keer als het geupdate wordt.
Vraagje inzake gebruik van NR. In de HA add-on. Dus wil ik mijn automations stapsgewijs overzetten (of iig kijken of ik dat beter vind werken. Maar waar ik niet echt uit kom, wat is 'best practice' als het gaat om verdeling?
Elke flow is een 'tabblad' , betekent dat dat elke automation 1 tabblad inneemt, of is een flow meer in te zetten als categorie? Dus LAMPEN, en dan meerdere automations op 1 pagina? Ik kan me voorstellen dat dat niet werkt, maar hoe hou je overzicht dan?
Notify - Time Based | Notificaties op vaste tijdstippen |
Notify - Presence Based | Notificaties omdat ik en/of mijn vrouw in een bepaalde zone komen |
Notify - Action Based | Notificaties omdat er iets gebeurd (deurbel, wasmachine, public IP-adres wijziging) |
MQTT | Alle automation die puur MQTT devices betreft |
Verlichting | ALLES wat met verlichting te maken heeft. Kunnen ook MQTT devices zijn. Dit wil ik in 1 overzicht hebben |
System/API | Alle automations die systeeminstellingen maken. Snapshots HA, Volumio playlists bepalen |
Ah thnx.. voor de werking maakt het dus niet uit dat je meerdere sequences in 1 flow hebt?lolgast schreef op donderdag 10 december 2020 @ 08:29:
@Koepert Je kunt er natuurlijk van maken wat je wilt, het maakt voor de werking van de automation niet uit of hij in tabblad 1 of tabblad 20 staat. Ik zelf heb de volgende verdeling:
Notify - Time Based Notificaties op vaste tijdstippen Notify - Presence Based Notificaties omdat ik en/of mijn vrouw in een bepaalde zone komen Notify - Action Based Notificaties omdat er iets gebeurd (deurbel, wasmachine, public IP-adres wijziging) MQTT Alle automation die puur MQTT devices betreft Verlichting ALLES wat met verlichting te maken heeft. Kunnen ook MQTT devices zijn. Dit wil ik in 1 overzicht hebben System/API Alle automations die systeeminstellingen maken. Snapshots HA, Volumio playlists bepalen
Zoek Wallylolgast schreef op donderdag 10 december 2020 @ 08:33:
@Koepert Nee. Voorbeeld van mijn 'Verlichting'-tab:
[Afbeelding]
Is het niet makkelijker / overzichtelijker om met (global) states te werken?Jimbeam schreef op zondag 6 december 2020 @ 20:38:
[denuz, je hebt gelijk, ik ga proberen dit zo te maken...
[Afbeelding]
:fill(white):strip_exif()/f/image/Cy91kI4QkZp8QAcmA3jCpTrn.png?f=user_large)
Om die vervolgens in elke flow te gebruiken welke je wilt:
/f/image/9CgZZysuNwt2wyXDmouH0Akq.png?f=fotoalbum_large)
/f/image/jLcQm4W0vINdIFUjnhPaH98M.png?f=fotoalbum_large)
[ Voor 9% gewijzigd door SkyFlyer op 10-12-2020 09:56 ]
Heb je ook de JSON ?SkyFlyer schreef op donderdag 10 december 2020 @ 09:50:
[...]
Is het niet makkelijker / overzichtelijker om met (global) states te werken?
[Afbeelding]
Om die vervolgens in elke flow te gebruiken welke je wilt:
[Afbeelding]
[Afbeelding]
Owner of DBIT Consultancy | DJ BassBrewer
Set state:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
| [ { "id": "fae446a8.de6308", "type": "tab", "label": "Set global states", "disabled": false, "info": "" }, { "id": "29b870d9.a6bfe", "type": "change", "z": "fae446a8.de6308", "name": "Set Global & Flow to night", "rules": [ { "t": "set", "p": "somfy.day", "pt": "global", "to": "false", "tot": "bool" }, { "t": "set", "p": "<light sensor>.day", "pt": "msg", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 670, "y": 100, "wires": [ [] ] }, { "id": "ceea0b40.e484d8", "type": "switch", "z": "fae446a8.de6308", "name": "Switch day/night", "property": "payload", "propertyType": "msg", "rules": [ { "t": "lte", "v": "75", "vt": "num" }, { "t": "gt", "v": "75", "vt": "num" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 410, "y": 120, "wires": [ [ "29b870d9.a6bfe" ], [ "3ccde0ae.c4be4" ] ] }, { "id": "32beb0d6.1cf39", "type": "server-state-changed", "z": "fae446a8.de6308", "name": "", "server": "d5023851.1bd698", "version": 1, "exposeToHomeAssistant": false, "haConfig": [ { "property": "name", "value": "" }, { "property": "icon", "value": "" } ], "entityidfilter": "sensor.<lightsensor>", "entityidfiltertype": "exact", "outputinitially": true, "state_type": "num", "haltifstate": "", "halt_if_type": "str", "halt_if_compare": "is", "outputs": 1, "output_only_on_state_change": true, "x": 150, "y": 120, "wires": [ [ "ceea0b40.e484d8" ] ] }, { "id": "3ccde0ae.c4be4", "type": "change", "z": "fae446a8.de6308", "name": "Set Global Somfy day", "rules": [ { "t": "set", "p": "somfy.day", "pt": "global", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 660, "y": 140, "wires": [ [] ] }, { "id": "a74e7b6d.4c2778", "type": "comment", "z": "fae446a8.de6308", "name": "Set Global Somfy Day", "info": "", "x": 120, "y": 60, "wires": [] }, { "id": "d5023851.1bd698", "type": "server", "name": "Home Assistant" } ] |
Use state:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
| [ { "id": "1b2a08ce.0b3657", "type": "tab", "label": "Outside light", "disabled": false, "info": "" }, { "id": "545ba1e1.1e5a7", "type": "server-state-changed", "z": "1b2a08ce.0b3657", "name": "", "server": "d5023851.1bd698", "version": 1, "exposeToHomeAssistant": false, "haConfig": [ { "property": "name", "value": "" }, { "property": "icon", "value": "" } ], "entityidfilter": "sensor.<light sensor>", "entityidfiltertype": "exact", "outputinitially": true, "state_type": "num", "haltifstate": "", "halt_if_type": "str", "halt_if_compare": "is", "outputs": 1, "output_only_on_state_change": true, "x": 160, "y": 100, "wires": [ [ "482eacb4.d471a4" ] ] }, { "id": "92cd71c5.8ef78", "type": "server-state-changed", "z": "1b2a08ce.0b3657", "name": "", "server": "d5023851.1bd698", "version": 1, "exposeToHomeAssistant": false, "haConfig": [ { "property": "name", "value": "" }, { "property": "icon", "value": "" } ], "entityidfilter": "sensor.<2nd light sensor>", "entityidfiltertype": "exact", "outputinitially": true, "state_type": "num", "haltifstate": "", "halt_if_type": "str", "halt_if_compare": "is", "outputs": 1, "output_only_on_state_change": true, "x": 150, "y": 160, "wires": [ [ "482eacb4.d471a4" ] ] }, { "id": "482eacb4.d471a4", "type": "switch", "z": "1b2a08ce.0b3657", "name": "Determine Somfy Day", "property": "somfy.day", "propertyType": "global", "rules": [ { "t": "true" }, { "t": "false" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 440, "y": 140, "wires": [ [ "c0709d46.71ac5", "8e31865a.57cfa8" ], [ "cd3c4507.2db5e8", "f3fda961.ec9968" ] ] }, { "id": "c0709d46.71ac5", "type": "api-call-service", "z": "1b2a08ce.0b3657", "name": "Switch Off light backdoor", "server": "d5023851.1bd698", "version": 1, "debugenabled": false, "service_domain": "switch", "service": "turn_off", "entityId": "switch.fibaro_system_fgs222_double_relay_switch_2x1_5kw_switch_2", "data": "", "dataType": "json", "mergecontext": "", "output_location": "", "output_location_type": "none", "mustacheAltTags": false, "x": 680, "y": 40, "wires": [ [] ] }, { "id": "8e31865a.57cfa8", "type": "api-call-service", "z": "1b2a08ce.0b3657", "name": "Switch off light frontdoor", "server": "d5023851.1bd698", "version": 1, "debugenabled": false, "service_domain": "light", "service": "turn_off", "entityId": "light.frontdoor_outside", "data": "", "dataType": "json", "mergecontext": "", "output_location": "", "output_location_type": "none", "mustacheAltTags": false, "x": 690, "y": 100, "wires": [ [] ] }, { "id": "cd3c4507.2db5e8", "type": "api-call-service", "z": "1b2a08ce.0b3657", "name": "Switch On light backdoor", "server": "d5023851.1bd698", "version": 1, "debugenabled": false, "service_domain": "switch", "service": "turn_on", "entityId": "switch.fibaro_system_fgs222_double_relay_switch_2x1_5kw_switch_2", "data": "", "dataType": "json", "mergecontext": "", "output_location": "", "output_location_type": "none", "mustacheAltTags": false, "x": 690, "y": 160, "wires": [ [] ] }, { "id": "f3fda961.ec9968", "type": "api-call-service", "z": "1b2a08ce.0b3657", "name": "Switch on light frontdoor", "server": "d5023851.1bd698", "version": 1, "debugenabled": false, "service_domain": "light", "service": "turn_on", "entityId": "light.frontdoor_outside", "data": "", "dataType": "json", "mergecontext": "", "output_location": "", "output_location_type": "none", "mustacheAltTags": false, "x": 690, "y": 220, "wires": [ [] ] }, { "id": "d5023851.1bd698", "type": "server", "name": "Home Assistant" } ] |
Thanks. Weet je of Node-Red die global-state ook retained over herstarts?
Owner of DBIT Consultancy | DJ BassBrewer
Dit moet er bij:
1
2
3
4
5
| contextStorage: { default: { module: "localfilesystem" } } |
Ai pijn aan mij ogen @lolgastKoepert schreef op donderdag 10 december 2020 @ 07:43:
Hoi,
Vraagje inzake gebruik van NR. In de HA add-on. Dus wil ik mijn automations stapsgewijs overzetten (of iig kijken of ik dat beter vind werken. Maar waar ik niet echt uit kom, wat is 'best practice' als het gaat om verdeling?
Elke flow is een 'tabblad' , betekent dat dat elke automation 1 tabblad inneemt, of is een flow meer in te zetten als categorie? Dus LAMPEN, en dan meerdere automations op 1 pagina? Ik kan me voorstellen dat dat niet werkt, maar hoe hou je overzicht dan?

Heb je een reden dat je niet meer spacing gebruikt en voor iedere automations comment nodes?
Tip @Koepert ; gebruikt de comment nodes. Dit zijn witte nodes met puur en alleen text om dingen te onderscheiden.
Als je vervolgens extra spacing (tussenruimte) naar de volgende automations maakt, dan ziet het er heel overzichtelijk uit. Ik zal straks wel een screenshot sturen.
Ik heb bijvoorbeeld een tabblad (flow heet dat) met motion. Al mijn motion automations hangen hierin.
Ik heb circa 8 flows (tabbladen dus)
[ Voor 6% gewijzigd door Wachten... op 10-12-2020 10:52 ]
Als je dit kunt lezen, dan werkt mij Signature!
Waarom zou ik meer ruimte gebruiken? Er lopen geen lijntjes kris-kras door elkaar dus elke automation is in mijn ogen bijzonder eenvoudig te volgen. Waarom nutteloze ruimte opofferen? Bovenstaande past precies op de helft van mijn scherm. Ik hoef niet te scrollen als ik alles wil zien, dat is mij 100% meer waard dan 10px extra witte ruimte.Wachten... schreef op donderdag 10 december 2020 @ 10:49:
[...]
Ai pijn aan mij ogen @lolgast![]()
Heb je een reden dat je niet meer spacing gebruikt en voor iedere automations comment nodes?
Tip @Koepert ; gebruikt de comment nodes. Dit zijn witte nodes met puur en alleen text om dingen te onderscheiden.
Als je vervolgens extra spacing (tussenruimte) naar de volgende automations maakt, dan ziet het er heel overzichtelijk uit. Ik zal straks wel een screenshot sturen.
Ik heb bijvoorbeeld een tabblad (flow heet dat) met motion. Al mijn motion automations hangen hierin.
Ik heb circa 8 flows (tabbladen dus)
Is toch ook een prima reden, ik vroeg met me alleen af.lolgast schreef op donderdag 10 december 2020 @ 10:56:
[...]
Waarom zou ik meer ruimte gebruiken? Er lopen geen lijntjes kris-kras door elkaar dus elke automation is in mijn ogen bijzonder eenvoudig te volgen. Waarom nutteloze ruimte opofferen? Bovenstaande past precies op de helft van mijn scherm. Ik hoef niet te scrollen als ik alles wil zien, dat is mij 100% meer waard dan 10px extra witte ruimte.
Persoonlijk als alles staat, dan zit ik zomaar eens een paar weken/maanden niet in Node-RED. Als ik dan weer iets zoek, dan vind ik net die extra spacing en comment nodes heel erg handig.
Het is allemaal personal preference uiteraard
Als je dit kunt lezen, dan werkt mij Signature!
Ik zit bijna elke dag in NR, het kan eigenlijk altijd beter/efficiënter. Of ik heb iets nieuws bedacht. Ik weet altijd waar welke automation te vinden is. En anders heb je altijd nog CTRL+FWachten... schreef op donderdag 10 december 2020 @ 11:03:
[...]
Is toch ook een prima reden, ik vroeg met me alleen af.
Persoonlijk als alles staat, dan zit ik zomaar eens een paar weken/maanden niet in Node-RED. Als ik dan weer iets zoek, dan vind ik net die extra spacing en comment nodes heel erg handig.
Het is allemaal personal preference uiteraardkan @Koepert zelf kijken wat hij handig vindt.
Nee dat weet ik niet, bij mij wordt hij elke herstart opnieuw geset, omdat de sensor wordt uitgelezen bij een herstart.DennusB schreef op donderdag 10 december 2020 @ 10:25:
[...]
Thanks. Weet je of Node-Red die global-state ook retained over herstarts?
lolgast in "Node-RED - grafisch 'programmeren' (bijv. voor domotica)"SkyFlyer schreef op donderdag 10 december 2020 @ 11:16:
[...]
Nee dat weet ik niet, bij mij wordt hij elke herstart opnieuw geset, omdat de sensor wordt uitgelezen bij een herstart.
..
Concreet dacht ik, voor de sender node, hier genoeg aan te hebben:
1
| [{"id":"273e9f1b.a0105","type":"server-events","z":"8339f3e4.d68d5","name":"Backup Success","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_successful","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":80,"y":120,"wires":[["70515374.aa843c"]]},{"id":"70515374.aa843c","type":"function","z":"8339f3e4.d68d5","name":"Backup Succes Melding","func":"msg.payload = {}\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup Succesful'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":120,"wires":[["a64fe38d.48fc3"]]},{"id":"2adfe038.70873","type":"server-events","z":"8339f3e4.d68d5","name":"Backup Failure","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_failed","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":80,"y":240,"wires":[["97bb4a03.dcc6"]]},{"id":"97bb4a03.dcc6","type":"function","z":"8339f3e4.d68d5","name":"Backup Failure Melding","func":"msg.payload = {}\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup Failed'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":220,"wires":[["a64fe38d.48fc3"]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}] |
[ Voor 65% gewijzigd door Koepert op 11-12-2020 08:02 ]
Ik vraag me af of "auto_backup.snapshot_successful" een event is. Als dat zo is dan werkt het ja? Al een backup gedraaid sinds gisteravond?Koepert schreef op donderdag 10 december 2020 @ 22:25:
Hoi. Newbie vraagje. Maar als ik in NR een notificatie wil laten sturen op het plaatsvinden van een event. Is de Events - all node dan voldoende voor dat stuk? Of moet er ook nog een andere node tussen if true or false? Kortweg wil ik bij autobackup failed en autobackup succes een melding. Als ik via een inject de verzending test gaat dat goed (ok ik krijg de juiste data niet mee, maar dat komt wel nog, bericht komt aan).
Concreet dacht ik, voor de sender node, hier genoeg aan te hebben:
JSON:
1 [{"id":"273e9f1b.a0105","type":"server-events","z":"8339f3e4.d68d5","name":"Backup Success","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_successful","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":80,"y":120,"wires":[["70515374.aa843c"]]},{"id":"70515374.aa843c","type":"function","z":"8339f3e4.d68d5","name":"Backup Succes Melding","func":"msg.payload = {}\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup Succesful'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":120,"wires":[["a64fe38d.48fc3"]]},{"id":"2adfe038.70873","type":"server-events","z":"8339f3e4.d68d5","name":"Backup Failure","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_failed","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":80,"y":240,"wires":[["97bb4a03.dcc6"]]},{"id":"97bb4a03.dcc6","type":"function","z":"8339f3e4.d68d5","name":"Backup Failure Melding","func":"msg.payload = {}\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup Failed'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":220,"wires":[["a64fe38d.48fc3"]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
Ik maak voor zulke gevallen eigenlijk alleen maar gebruik van events:state. Dus een trigger o.b.v. een eventwijziging.
De events:all gebruik ik alleen voor mobile_app_notification_action
Dit is het wel, zie ook hier: https://github.com/jcwillox/hass-auto-backupdenuz schreef op vrijdag 11 december 2020 @ 11:13:
[...]
Ik vraag me af of "auto_backup.snapshot_successful" een event is. Als dat zo is dan werkt het ja? Al een backup gedraaid sinds gisteravond?
Ik maak voor zulke gevallen eigenlijk alleen maar gebruik van events:state. Dus een trigger o.b.v. een eventwijziging.
De events:all gebruik ik alleen voor mobile_app_notification_action
1
2
3
4
| Event: auto_backup.snapshot_start, data: {"name": "NAME"} Event: auto_backup.snapshot_successful, data: {"name": "NAME", "slug": "SLUG"} Event: auto_backup.snapshot_failed, data: {"name": "NAME", "error": "ERROR"} Event: auto_backup.purged_snapshots, data: {"snapshots": ["SLUG"]} |
Deze automation werkt bij mij ook:
1
2
3
4
5
6
7
8
9
| - alias: "Notify Snapshot Failure" trigger: platform: event event_type: auto_backup.snapshot_failed action: service: persistent_notification.create data_template: title: "Snapshot Failed." message: "Name: {{ trigger.event.data.name }}\nError: {{ trigger.event.data.error }}" |
DIe wilde ik dus omzetten naar NodeRed om zo wat meer er van te leren, maar dat lukt dus niet helemaal
Ah kijk is, dat zou wel moeten werken.Koepert schreef op vrijdag 11 december 2020 @ 11:20:
[...]
Dit is het wel, zie ook hier: https://github.com/jcwillox/hass-auto-backup
code:
1 2 3 4 Event: auto_backup.snapshot_start, data: {"name": "NAME"} Event: auto_backup.snapshot_successful, data: {"name": "NAME", "slug": "SLUG"} Event: auto_backup.snapshot_failed, data: {"name": "NAME", "error": "ERROR"} Event: auto_backup.purged_snapshots, data: {"snapshots": ["SLUG"]}
Deze automation werkt bij mij ook:
YAML:
1 2 3 4 5 6 7 8 9 - alias: "Notify Snapshot Failure" trigger: platform: event event_type: auto_backup.snapshot_failed action: service: persistent_notification.create data_template: title: "Snapshot Failed." message: "Name: {{ trigger.event.data.name }}\nError: {{ trigger.event.data.error }}"
DIe wilde ik dus omzetten naar NodeRed om zo wat meer er van te leren, maar dat lukt dus niet helemaal
Je kan zelf een event publishen om te testen. Dit kan zowel via HA als via node-red.
Via ha; Developer tools --> events.
Via node-red via de fire event node.
Je event type is in beide gevallen; auto_backup.snapshot_failed en bij event dat kun je iets doen als; {"name": "Backup-hass", "error": "Opslag vol"}.
Hangt achter je function node even een debug node. Mocht het niet werken, post dan even de log van de debug node.
Ah ok. Dus die fire-event is handmatige trigger en events:all is de 'listener' zo je wil, maar hoe krijg ik de relevante output dan in mijn message? Ik ging er vanuit dat ik dan een function-node gebruik met daarin de verwerking van de output van het event, maar dat lijkt niet goed te gaandenuz schreef op vrijdag 11 december 2020 @ 11:13:
[...]
Ik vraag me af of "auto_backup.snapshot_successful" een event is. Als dat zo is dan werkt het ja? Al een backup gedraaid sinds gisteravond?
Ik maak voor zulke gevallen eigenlijk alleen maar gebruik van events:state. Dus een trigger o.b.v. een eventwijziging.
De events:all gebruik ik alleen voor mobile_app_notification_action
Dit werkt an sich wel, alleen mis ik dus info:
1
2
3
4
5
| msg.payload = {} msg.payload.chatId = xxx msg.payload.type = 'message' msg.payload.content = 'Backup Failed' return msg; |
Of werkt dat alleen als ik een andere event-node gebruik? Zo niet 'hoe' roep ik dan de juiste info op?
De event name is opgeslagen in ; payload.event.name en de error in payload.event.error.
Nu is alleen de vraag op welke manier je dat kunt gebruiken in je Function node. Dat antwoord heb ik zo even niet voor je. Je wilt een message sturen via telegram neem ik aan. Op welke manier verstuur je dat bericht? Je moet ook nog ergens een Bot ID invoeren toch?
In een template node werkt bijvoorbeeld; {{payload.event.name}} {{payload.event.error}}.
Ik zou het zelf als volgt doen;
:fill(white):strip_exif()/f/image/XZq3soqA9AQGCFrQeWpv68IE.png?f=user_large)
Dus in de template node wordt de msg.payload gecreerd o.b.v. de events all. In de telegram notify geef ik het chat- ID en de bot op. Vervolgens verstuurt deze de msg.payload. Ik vind deze manier het makkelijkst.
Edit:
Ah je kan je function node ook zo neerzetten.
1
2
3
4
5
| msg.payload = msg.payload.event.name + " " + msg.payload.event.error msg.payload.chatId = 1068168675 msg.payload.type = 'message' msg.payload.content = 'Backup failed' return msg; |
Je msg.payload.content kan dan denk ik nog weg. Maar je tekst staat dan in ieder geval ook in de msg.payload.
[ Voor 16% gewijzigd door denuz op 11-12-2020 12:52 ]
Hij errort dan op het volgende:denuz schreef op vrijdag 11 december 2020 @ 12:46:
De fire-event is inderdaad de handmatige trigger, in dit geval als vervanger van de inject node.
De event name is opgeslagen in ; payload.event.name en de error in payload.event.error.
Nu is alleen de vraag op welke manier je dat kunt gebruiken in je Function node. Dat antwoord heb ik zo even niet voor je. Je wilt een message sturen via telegram neem ik aan. Op welke manier verstuur je dat bericht? Je moet ook nog ergens een Bot ID invoeren toch?
In een template node werkt bijvoorbeeld; {{payload.event.name}} {{payload.event.error}}.
Ik zou het zelf als volgt doen;
[Afbeelding]
Dus in de template node wordt de msg.payload gecreerd o.b.v. de events all. In de telegram notify geef ik het chat- ID en de bot op. Vervolgens verstuurt deze de msg.payload. Ik vind deze manier het makkelijkst.
Edit:
Ah je kan je function node ook zo neerzetten.
code:
1 2 3 4 5 msg.payload = msg.payload.event.name + " " + msg.payload.event.error msg.payload.chatId = 1068168675 msg.payload.type = 'message' msg.payload.content = 'Backup failed' return msg;
Je msg.payload.content kan dan denk ik nog weg. Maar je tekst staat dan in ieder geval ook in de msg.payload.
1
| msg.payload.chatId is empty |
De rest:
1
2
3
4
5
6
| auto_backup.snapshot_failed : msg : Object object event_type: "auto_backup.snapshot_failed" topic: "auto_backup.snapshot_failed" payload: object _msgid: "71b73b1d.d00564 |
EDIT: Maakt het gebruik van Telegram-bot nog verschil? Ik zie de bot en de bot-home staan bij de mogelijke Telegram plugins.
[ Voor 3% gewijzigd door Koepert op 11-12-2020 15:47 ]
Dit geeft bij mij geen error, maar zorgt er ook niet voor dat ik een telegram bericht krijg.Koepert schreef op vrijdag 11 december 2020 @ 14:52:
[...]
Hij errort dan op het volgende:
code:
1 msg.payload.chatId is empty
De rest:
JSON:
1 2 3 4 5 6 auto_backup.snapshot_failed : msg : Object object event_type: "auto_backup.snapshot_failed" topic: "auto_backup.snapshot_failed" payload: object _msgid: "71b73b1d.d00564
EDIT: Maakt het gebruik van Telegram-bot nog verschil? Ik zie de bot en de bot-home staan bij de mogelijke Telegram plugins.
1
| [{"id":"2adfe038.70873","type":"server-events","z":"2838595f.c700c6","name":"Backup Failure","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_failed","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":200,"y":2820,"wires":[["97bb4a03.dcc6"]]},{"id":"b96d69dd.474b1","type":"debug","z":"2838595f.c700c6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":2820,"wires":[]},{"id":"fe8f6256.85484","type":"inject","z":"2838595f.c700c6","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":3000,"wires":[["93fcd347.b5cc38"]]},{"id":"93fcd347.b5cc38","type":"ha-fire-event","z":"2838595f.c700c6","name":"","server":"224924bb.3d06dc","event":"auto_backup.snapshot_failed","data":"{\"name\": \"Hass-Backup\", \"error\": \"Opslag vol\"}","dataType":"json","x":510,"y":3000,"wires":[[]]},{"id":"97bb4a03.dcc6","type":"function","z":"2838595f.c700c6","name":"Backup Failure Melding","func":"msg.payload = msg.payload.event.name + \" \" + msg.payload.event.error\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup failed'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":550,"y":2820,"wires":[["b96d69dd.474b1"]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"224924bb.3d06dc","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":false}] |
K zal nog eens verder zoeken.denuz schreef op vrijdag 11 december 2020 @ 17:25:
[...]
Dit geeft bij mij geen error, maar zorgt er ook niet voor dat ik een telegram bericht krijg.
code:
1 [{"id":"2adfe038.70873","type":"server-events","z":"2838595f.c700c6","name":"Backup Failure","server":"1d8e9a4c.b062a6","event_type":"auto_backup.snapshot_failed","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"x":200,"y":2820,"wires":[["97bb4a03.dcc6"]]},{"id":"b96d69dd.474b1","type":"debug","z":"2838595f.c700c6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":830,"y":2820,"wires":[]},{"id":"fe8f6256.85484","type":"inject","z":"2838595f.c700c6","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":3000,"wires":[["93fcd347.b5cc38"]]},{"id":"93fcd347.b5cc38","type":"ha-fire-event","z":"2838595f.c700c6","name":"","server":"224924bb.3d06dc","event":"auto_backup.snapshot_failed","data":"{\"name\": \"Hass-Backup\", \"error\": \"Opslag vol\"}","dataType":"json","x":510,"y":3000,"wires":[[]]},{"id":"97bb4a03.dcc6","type":"function","z":"2838595f.c700c6","name":"Backup Failure Melding","func":"msg.payload = msg.payload.event.name + \" \" + msg.payload.event.error\nmsg.payload.chatId = 1068168675\nmsg.payload.type = 'message'\nmsg.payload.content = 'Backup failed'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":550,"y":2820,"wires":[["b96d69dd.474b1"]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true},{"id":"224924bb.3d06dc","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":false}]
Mbt de Bot. Weet jij of t uitmaakt? De Telegrambot of de Telegrambot-home?
https://flows.nodered.org/node/node-red-contrib-telegrambot
https://flows.nodered.org...-contrib-telegrambot-home
Ik gebruik de bovenste, die wordt nog actief bijgehouden. Volgens mij zitten er nog wat functionele verschillen in.
1
2
3
| 11-12-2020 18:32:21node: Home Assistant msg : string[27] "msg.payload.chatId is empty" |
Terwijl een sequence op dezelfde flow Event NZBGet Download Complete --> function node die ChatID ed koppelt WEL een melding geeft.
Dit stukje lijkt dus de chatId te corrupten oid
1
| msg.payload = msg.payload.event.name + " " + msg.payload.event.error |
Je hebt gelijk. Dat stuk wat ik er in heb gezet dat werkt niet. Ik zag net dat ik bij het testen gebruik maakte van die andere telegram node. Ik ga ook nog even puzzelen hoe dit op te lossen. Zou niet moeilijk moeten zijn.Koepert schreef op vrijdag 11 december 2020 @ 18:36:
Grrr.. ik ben nog aan het peuteren.. maar kom er even niet uit. Als ik bovenstaande flow aftrap met een timestamp+fire event krijg ik deze error:
code:
1 2 3 11-12-2020 18:32:21node: Home Assistant msg : string[27] "msg.payload.chatId is empty"
Terwijl een sequence op dezelfde flow Event NZBGet Download Complete --> function node die ChatID ed koppelt WEL een melding geeft.
Dit stukje lijkt dus de chatId te corrupten oid
code:
1 msg.payload = msg.payload.event.name + " " + msg.payload.event.error
Gelukt.
Als je in de function node dit stopt;
1
2
3
4
5
| var bericht = msg.payload.event.name + ' ' + msg.payload.event.error; msg.payload = {chatId : xxxxxxx, type : 'message', content : bericht}; return msg; |
Dan zou het wel moeten werken
[ Voor 10% gewijzigd door denuz op 11-12-2020 23:34 ]
Tot nu toe vindt ik node red geweldig. Wel een paar rare dingen, zoals dat er een 'looptimer' node is en ik na vele uren debuggen erachter kom dat de Looptimer een big heeft en dat er daarom 'looptimer2' bestaat.
Wat ik momenteel het meeste moeite mee heb is hoe je moet formatteren/coderen.
Afhankelijk van de node kan het Jason, jsonata, jinja2, moustache, Javascript,... zijn.
Elk keer moet ik uitzoeken welke taal ik moet spreken en hoe die werkt. Zit daar enige logica in?
Voor de rest vind ik het geweldig wat ik tot nu toe als niet-programmeur heb kunnen in elkaar steken.
Ik probeer momenteel een unieke parameteriseerbare (text to speech, actionable, foto, geluid& vibratie, bestemmeling,...) sequence te maken voor mijn notificaties in de Android home assistant companion app die door alle andere sequences gebruikt kan worden.
De alarm_stream_max channel doet bij mij bijvoorbeeld helemaal niet wat hij hoort te doen dus voor security events (inbreker/brand) haal ik de huidige status van mijn telefoon op (volume/do not disturb) overrule die, stuur de berichten en zet dan alles in de oorspronkelijke staat.
Text to speech werkt dan weer op het media volume die soms aan staat terwijl mijn telefoon wel op stil staat. Voor niet-hoogdringende text to speech berichten moet er dus eerst een check zijn of mijn telefoon op stil staat.
Niet alles heb ik een oplossing voor, zo kan ik wel de notificatie volume aanpassen maar is er gek genoeg geen sensor om de huidige waarde uit te lezen.
Indien interesse zal ik mijn notificatie-sequence hier delen wanneer hij af is :-)
Doel: elke dag om 10u een reminder of ik mn meds gehad heb.
De hele string werkt, bij het reageren met JA (op de knop ja drukken) zet hij de input boolean ook keurig op ON. Alleen..
Ik laat dit aftrappen met een Inject Node. Handmatig werkt deze. Zet ik de interval op 1 minuut, werkt dit. Zet ik deze op at a specific time (en nu 13:39 bijv) dan werkt deze niet (elke weekdag). Begrijp ik de gevolgen van de setting "at a specific time" niet goed? Dit betekent toch gewoon dat deze om 13:39 inject, elke dag? Of moet er dan iets ' voor' ??
Er kan niets voor een inject node, dus dat is het niet.Koepert schreef op zaterdag 12 december 2020 @ 13:41:
Ik begrijp iets niet.. Ik dacht ik begin met ' simpele dingen' ...
Doel: elke dag om 10u een reminder of ik mn meds gehad heb.
De hele string werkt, bij het reageren met JA (op de knop ja drukken) zet hij de input boolean ook keurig op ON. Alleen..
Ik laat dit aftrappen met een Inject Node. Handmatig werkt deze. Zet ik de interval op 1 minuut, werkt dit. Zet ik deze op at a specific time (en nu 13:39 bijv) dan werkt deze niet (elke weekdag). Begrijp ik de gevolgen van de setting "at a specific time" niet goed? Dit betekent toch gewoon dat deze om 13:39 inject, elke dag? Of moet er dan iets ' voor' ??
Gezien alleen specific time niet werkt denk ik dat het een timezone issue is. Misschien dat even checken?
Waar zou dat in kunnen zitten? Let me explain:denuz schreef op zaterdag 12 december 2020 @ 13:46:
[...]
Er kan niets voor een inject node, dus dat is het niet.
Gezien alleen specific time niet werkt denk ik dat het een timezone issue is. Misschien dat even checken?
- Het is 15:25 op mn laptop
- De host heeft het op dat moment (via SSH) 15:25 op timedatectl:
Local time: za 2020-12-12 15:28:39 CET
Universal time: za 2020-12-12 14:28:39 UTC
RTC time: za 2020-12-12 14:28:39
Time zone: Europe/Amsterdam (CET, +0100)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
- NR is de HA addon (Supervised setup) die logs hebben ook de 15:25 timestamps
Dus daar zie ik het niet. Zal m eens op 10u laten staan voor de komende dagen, kijken of er IETS gaat gebeuren.
Vanochtend om 10u keurig de melding gehad.
/f/image/v4tpnALv0RHSpM5TT7zEDXjG.png?f=fotoalbum_large)
Dus: sensor 1 detecteert voor vijf minuten geen beweging, vervolgens checkt hij dan sensor 2. Wat ik liever zou willen is dat hij kijkt of sensor 2 ook uit is voor 5 minuten.
Zelf heb ik nu bedacht om 4 helper variabelen in Home Assistant te maken waarin ik +5 minuten doe op de sensoren, maar het project wordt zo steeds omslachtiger haha, dus als het simpeler kan dan hoor ik het graag. NR is voor mijn gevoel niet altijd even intuïtief.

@peetgate Goed bezig
Dat ruimt al aardig op. Dan hoef je voor aan/uit van licht enkel te kijken naar een state wijziging van die groep.
Dat kun je ook doen voor de persons,je kijk namelijk enkel of er iemand thuis is en niet wie er thuis is.
Wat betreft je delay van 5 minuten. Ik denk dat een trigger node wel geschikt zal zijn. Die kan je als volgt instellen;
:fill(white):strip_exif()/f/image/hDThgqn4WTJ2cPFlerMYcQok.png?f=user_large)
Je kan er dus voor kiezen om in bepaalde gevallen de timer te resetten d.m.v een msg.reset bericht. Of om de timer iedere keer te resetten als er een nieuw bericht binnenkomt.
Awesome! Ik dacht dat groepen alleen voor lampen was. Weer wat geleerd. Daar worden de flows een stuk eenvoudiger van. Thanx.denuz schreef op zaterdag 12 december 2020 @ 19:17:
@quizzical Voor zover ik weet zit er geen 'logica' in. Iedereen kan een node maken, en zoals je gemerkt hebt worden er verschillende talen gebruikt. Zolang de documentatie maar in orde is vind ik het wel prima.
@peetgate Goed bezig. Ik zou die beweging sensoren in een Home assistant group zetten.
Dat ruimt al aardig op. Dan hoef je voor aan/uit van licht enkel te kijken naar een state wijziging van die groep.
Dat kun je ook doen voor de persons,je kijk namelijk enkel of er iemand thuis is en niet wie er thuis is.
Wat betreft je delay van 5 minuten. Ik denk dat een trigger node wel geschikt zal zijn. Die kan je als volgt instellen;[Afbeelding]
Je kan er dus voor kiezen om in bepaalde gevallen de timer te resetten d.m.v een msg.reset bericht. Of om de timer iedere keer te resetten als er een nieuw bericht binnenkomt.
1
2
| msg.payload.data = Math.round(msg.payload.data + 1); return msg; |
Iemand die hier reeds een oplossing voor heeft?
Nog even n kort vraagje hierover, dit werkt dus inmiddels, maar als ik hier een ' titel' aan wil geven, waar zet ik dan neer? Tussen de aanhalingstekens? of juist bij content.denuz schreef op vrijdag 11 december 2020 @ 23:31:
@Koepert
Gelukt.
Als je in de function node dit stopt;
code:
1 2 3 4 5 var bericht = msg.payload.event.name + ' ' + msg.payload.event.error; msg.payload = {chatId : xxxxxxx, type : 'message', content : bericht}; return msg;
Dan zou het wel moeten werken
Het bericht is nu:
1
| Backup: Monday, December 14, 2020 Timeout on /snapshots/new/full request |
liever zou ik dit willen:
1
2
| Backup Failed Backup: Monday, December 14, 2020 Timeout on /snapshots/new/full request |
Maar gaat me meer om het combineren van Vaste tekst met variabel. Zet ik dat bij variabel in, of in de content?
Dat werkt toch?Thoit schreef op dinsdag 15 december 2020 @ 15:18:
Ik ben nu al een hele tijd aan het zoeken naar een oplossing, maar ik kan er helaas geen vinden. Wat ik probeer is de huidige temperatuur in de woonkamer uit te laten en hierbij bijv. 1 op te tellen. Dus als 19 graden wordt gemeten, wil ik hier 20 van maken. Ik zit al een hele tijd met een function node te pielen, maar meer dan dit heb ik er helaas niet van kunnen maken:
code:
1 2 msg.payload.data = Math.round(msg.payload.data + 1); return msg;
Iemand die hier reeds een oplossing voor heeft?
Helaas niet, zojuist de calculator node gevonden en die kan +1 doen. Echter hoe kan ik de waarde die deze node nu weergeeft injecteren in Home Assistant middels Climate? Ik heb nu het volgende geprobeerd:
1
2
3
4
5
| { "entity_id": "climate.woonkamer", "temperature": "msg.payload", "hvac_mode": "heat" } |
Ik wil het volgende: We hebben vloerverwarming en een houtkachel. In de woonkamer en keuken meet ik de temperatuur. In de woonkamer hangt de thermostaat, die uitgaat zodra de houtkachel aan gaat. Ik wil er echter voor zorgen dat daardoor de temperatuur in de keuken niet te ver zakt. Hierdoor wil ik de verwarming middels de thermostaat aan laten springen zodra de temperatuur in de keuken onder de 18 graden komt.lolgast schreef op dinsdag 15 december 2020 @ 15:44:
@Thoit Dus als ik het goed begrijp heb je een HA sensor die de gemeten waarde doorgeeft. Die waarde wil je (in sommige gevallen waarschijnlijk) +1 doen en daar de verwarming op instellen zodat hij gaat verwarmen? Of wil je het gebruiken om een gemeten afwijking te corrigeren?
De thermostaat kan ik echter pas aan laten springen door de gewenste temperatuur hoger in te stellen dan de huidige temperatuur. Vandaar de +1 bijv.
Zoiets?Thoit schreef op dinsdag 15 december 2020 @ 15:48:
[...]
Ik wil het volgende: We hebben vloerverwarming en een houtkachel. In de woonkamer en keuken meet ik de temperatuur. In de woonkamer hangt de thermostaat, die uitgaat zodra de houtkachel aan gaat. Ik wil er echter voor zorgen dat daardoor de temperatuur in de keuken niet te ver zakt. Hierdoor wil ik de verwarming middels de thermostaat aan laten springen zodra de temperatuur in de keuken onder de 18 graden komt.
De thermostaat kan ik echter pas aan laten springen door de gewenste temperatuur hoger in te stellen dan de huidige temperatuur. Vandaar de +1 bijv.
1
| [{"id":"6f9fd243.a92acc","type":"api-call-service","z":"5a2fc9d2.f02bf8","name":"Verwarming hoger","server":"5c0abd7f.7b22a4","version":1,"debugenabled":false,"service_domain":"climate","service":"set_temperature","entityId":"{{topic}}","data":"{\"temperature\":\"{{{temp}}}\"}","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":850,"y":1370,"wires":[[]]},{"id":"e1051a10.7da168","type":"function","z":"5a2fc9d2.f02bf8","name":"","func":"let temp = parseInt(msg.payload)\nmsg.temp = Math.round(temp + 1)\nmsg.topic = \"climate.woonkamer\"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":520,"y":1370,"wires":[["6f9fd243.a92acc"]]},{"id":"42585290.4ee6cc","type":"inject","z":"5a2fc9d2.f02bf8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"20","payloadType":"str","x":210,"y":1370,"wires":[["e1051a10.7da168"]]},{"id":"5c0abd7f.7b22a4","type":"server","name":"HassIO","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}] |
[ Voor 38% gewijzigd door lolgast op 15-12-2020 16:53 ]
Probeer dit eensThoit schreef op dinsdag 15 december 2020 @ 15:39:
[...]
Helaas niet, zojuist de calculator node gevonden en die kan +1 doen. Echter hoe kan ik de waarde die deze node nu weergeeft injecteren in Home Assistant middels Climate? Ik heb nu het volgende geprobeerd:
code:
1 2 3 4 5 { "entity_id": "climate.woonkamer", "temperature": "msg.payload", "hvac_mode": "heat" }
1
2
3
4
5
| { "entity_id": "climate.woonkamer", "temperature": {{payload}}, "hvac_mode": "heat" } |
of anders;
1
2
3
4
5
| { "entity_id": "climate.woonkamer", "temperature": "{{payload}}", "hvac_mode": "heat" } |
Als ik op de github van de telegram node kijk dan zie ik niet de optie voor een titel. (zoals bij notifications via de companion app wel kan).Koepert schreef op dinsdag 15 december 2020 @ 15:25:
[...]
Nog even n kort vraagje hierover, dit werkt dus inmiddels, maar als ik hier een ' titel' aan wil geven, waar zet ik dan neer? Tussen de aanhalingstekens? of juist bij content.
Het bericht is nu:
code:
1 Backup: Monday, December 14, 2020 Timeout on /snapshots/new/full request
liever zou ik dit willen:
code:
1 2 Backup Failed Backup: Monday, December 14, 2020 Timeout on /snapshots/new/full request
Maar gaat me meer om het combineren van Vaste tekst met variabel. Zet ik dat bij variabel in, of in de content?
Maar de tekst moet je in de var zetten. In de aanhalingstekens kan tekst, ik heb ze er enkel neergezet zodat er een spatie ontstaat tussen event.name en event.error.
Dus je begint met bijvoorbeeld:
var bericht = 'hier kan wat staan ' + msg.payload.event.name + ' ' + 'of hier ook ' + msg.payload.event.error + 'hier ook';
Als je een 'titel' wil kan je misschien ook 2 berichten sturen? of anders gewoon notificaties via de app
[ Voor 47% gewijzigd door denuz op 15-12-2020 17:41 ]
Thanks, helaas pakte die hem niet. Heb er uiteindelijk dit van gemaakt wat werkt:lolgast schreef op dinsdag 15 december 2020 @ 16:49:
[...]
Zoiets?
JSON:
1 [{"id":"6f9fd243.a92acc","type":"api-call-service","z":"5a2fc9d2.f02bf8","name":"Verwarming hoger","server":"5c0abd7f.7b22a4","version":1,"debugenabled":false,"service_domain":"climate","service":"set_temperature","entityId":"{{topic}}","data":"{\"temperature\":\"{{{temp}}}\"}","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":850,"y":1370,"wires":[[]]},{"id":"e1051a10.7da168","type":"function","z":"5a2fc9d2.f02bf8","name":"","func":"let temp = parseInt(msg.payload)\nmsg.temp = Math.round(temp + 1)\nmsg.topic = \"climate.woonkamer\"\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":520,"y":1370,"wires":[["6f9fd243.a92acc"]]},{"id":"42585290.4ee6cc","type":"inject","z":"5a2fc9d2.f02bf8","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"20","payloadType":"str","x":210,"y":1370,"wires":[["e1051a10.7da168"]]},{"id":"5c0abd7f.7b22a4","type":"server","name":"HassIO","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
1
2
| msg.payload = Number(msg.payload) + 0.1; return msg; |
Dit pakt die:denuz schreef op dinsdag 15 december 2020 @ 17:20:
[...]
Probeer dit eens
code:
1 2 3 4 5 { "entity_id": "climate.woonkamer", "temperature": {{payload}}, "hvac_mode": "heat" }
of anders;
code:
1 2 3 4 5 { "entity_id": "climate.woonkamer", "temperature": "{{payload}}", "hvac_mode": "heat" }
1
| "temperature": {{payload}} |
Beide heel erg bedankt voor een juiste richting uit te sturen!
Graag leun ik op de hier aanwezige kennis voor het volgende:
Ik wil, indien ik mijn Chromecast op pauze zet, mij Hue verlichting aan laten gaan en wanneer ik de Chrome weer laat spelen, de Hue verlichting laten dimmen. Een ' bios mode' dus.
Ik heb het Hue deel onder controle maar is het ueberhaupt mogelijk om een pauze te detecteren van de Chromecast (v2)?
Heb zelf al het nodige zoekwerk achter de rug maar helaas nog niets zinnigs kunnen vinden.
Dank alvast!
Gebruik je enkel node-red?szjoin schreef op dinsdag 15 december 2020 @ 21:48:
Hi,
Graag leun ik op de hier aanwezige kennis voor het volgende:
Ik wil, indien ik mijn Chromecast op pauze zet, mij Hue verlichting aan laten gaan en wanneer ik de Chrome weer laat spelen, de Hue verlichting laten dimmen. Een ' bios mode' dus.
Ik heb het Hue deel onder controle maar is het ueberhaupt mogelijk om een pauze te detecteren van de Chromecast (v2)?
Heb zelf al het nodige zoekwerk achter de rug maar helaas nog niets zinnigs kunnen vinden.
Dank alvast!
Ik gebruik home assistent icm node red en kan dus daardoor de status van de chromecast uitlezen.
Ik heb zowel node-red-contrib-cast als node-red-contrib-castv2 geinstalleerd.
Weet alleen niet of ik ergens overheen kijk of dat het signaal ueberhaupt niet wordt aangeboden.
Zou in dat geval met deze moeten lukken?szjoin schreef op dinsdag 15 december 2020 @ 22:10:
Alleen NR inderdaad. Ik had gehoopt op een palette.
Ik heb zowel node-red-contrib-cast als node-red-contrib-castv2 geinstalleerd.
Weet alleen niet of ik ergens overheen kijk of dat het signaal ueberhaupt niet wordt aangeboden.
Edit;
Ah die heb je al. Wat gaat er mis?
Even getest met ;
1
| [{"id":"82e3c67a.27b218","type":"cast-to-client","z":"2838595f.c700c6","name":"","url":"","contentType":"","message":"","language":"en","ip":"192.168.22.54","port":"8009","volume":"","x":530,"y":3500,"wires":[["6bc79592.92574c"]]},{"id":"a5bddaf0.4e9578","type":"inject","z":"2838595f.c700c6","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":220,"y":3500,"wires":[["82e3c67a.27b218"]]},{"id":"6bc79592.92574c","type":"debug","z":"2838595f.c700c6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":800,"y":3500,"wires":[]}] |
Als de chromecast gepauzeerd is krijg ik 2 berichten binnen. Als de chromecast op play staat maar 1.
Zie;
:fill(white):strip_exif()/f/image/yEAaJL0e5lu2SthyXwMbKbYR.png?f=user_large)
Bovenste 2 zijn op paused; onderste op playing.
Dus met payload.playerState kun je zien of je chromecast op paused staat.
[ Voor 56% gewijzigd door denuz op 15-12-2020 22:32 ]
1
| [{"id":"744dfc9b.d85d24","type":"function","z":"f6f2187d.f17ca8","name":"Cinema Mode","func":"if(msg.payload.playerState === \"PLAYING\"){\n msg.payload = {\n on : false,\n transitionTime: 3\n }\n}\n\nif(msg.payload.playerState === \"PAUSED\"){\n msg.payload = {\n on : true,\n brightness : 100,\n transitionTime : 5\n }\n}\n \nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":340,"wires":[["b5679e72.b0d608"]]}] |
Gebruikt: node-red-contrib-castv2
Dank @denuz
[ Voor 3% gewijzigd door szjoin op 16-12-2020 15:11 ]
Ik ben een subflow aan het maken die al mijn notificaties naar onze mobieltjes regelt.
de environment variables leken mij een handige functionaliteit, so hoef ik geen changenode te gebruiken voor ik de subflow aanroep om alle parameters in messages (msg.title, msg.timeout,...) te steken die de subflow dan kan gebruiken.
Het lijkt er echter op dat ik enkel statische waarden kan invullen.
Ik moet echter variabele dingen doorgeven. Zo definieer ik bvb dynamisch de filenaam van de snapshot en moet die uiteraard aan de subflow doorgeven zodat deze die snapshot kan oproepen.
Begrijp ik het goed dat ik dit niet in een environment variable moet steken en dus in de plaats msg.imageRetrieveURL moet definieren die ik wel dynamisch kan invullen en dan door de subflow laten uitlezen?"/config/www/"&data.new_state.attributes.friendly_name&$now('[Y0001][M01][D01] [H01][m01][s01]', '+0100')&".jpg"
Dat haalt voor mij voor een groot deel het nut van de environment variables onderuit want ik moet dan toch al een change node gebruiken voor ik de subflow aanroep om dynamische parameters te definieren...
Heb je een screenshot van je gehele flow? En met welke cast app(s) gebruik je dit? Ik zie namelijk dat ik bij het casten van YouTube netjes de 'playing' / 'paused' doorkrijg, maar bij Videoland blijft het helemaal stil in Node-RED, ik krijg alleen 'undefined' terug uit het node-red-contrib-castv2 blokje. Met Netflix zelfde verhaal...szjoin schreef op woensdag 16 december 2020 @ 14:40:
Gelukt. Voor de liefhebbers: Cinema mode met Google Chromecast + Philips Hue:
code:
1 [{"id":"744dfc9b.d85d24","type":"function","z":"f6f2187d.f17ca8","name":"Cinema Mode","func":"if(msg.payload.playerState === \"PLAYING\"){\n msg.payload = {\n on : false,\n transitionTime: 3\n }\n}\n\nif(msg.payload.playerState === \"PAUSED\"){\n msg.payload = {\n on : true,\n brightness : 100,\n transitionTime : 5\n }\n}\n \nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":800,"y":340,"wires":[["b5679e72.b0d608"]]}]
Gebruikt: node-red-contrib-castv2
Dank @denuz
- Lamp aan om 08:u
- Is het 10:15u? Ja? Lamp uit. Nee? Lamp Aan laten.
Dus ik dacht
- Inject node, repeat dagelijks, om 08u
- Call service light on
- Check time
- Call Service light off
oftwel:
1
| [{"id":"1bc6f1ed.a51dfe","type":"inject","z":"6dc72dfa.49a6dc","name":"Ochtendroutine","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 08 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":140,"wires":[["dd4a30e0.d2d7a8"]]},{"id":"dd4a30e0.d2d7a8","type":"api-call-service","z":"6dc72dfa.49a6dc","name":"Aanrechtlampen aan","server":"1d8e9a4c.b062a6","version":1,"debugenabled":false,"service_domain":"light","service":"turn_on","entityId":"light.lampen_aanrecht","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":390,"y":140,"wires":[["324f4cdd.43d10c","28ca8c71.a501d4"]]},{"id":"28ca8c71.a501d4","type":"timecheck","z":"6dc72dfa.49a6dc","name":"Is het 10:15 uur","time":"10:15","x":630,"y":140,"wires":[["3c575bf2.3ceb94","3ceeb1ad.eb0ffe"],[]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}] |
Klopt dit? Want het UIT werkt op dit moment NIET.
Je flow is nu;Koepert schreef op donderdag 17 december 2020 @ 10:35:
Ik probeer dus NR te leren met wat simpelere dingen.
- Lamp aan om 08:u
- Is het 10:15u? Ja? Lamp uit. Nee? Lamp Aan laten.
Dus ik dacht
- Inject node, repeat dagelijks, om 08u
- Call service light on
- Check time
- Call Service light off
oftwel:
JSON:
1 [{"id":"1bc6f1ed.a51dfe","type":"inject","z":"6dc72dfa.49a6dc","name":"Ochtendroutine","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 08 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":110,"y":140,"wires":[["dd4a30e0.d2d7a8"]]},{"id":"dd4a30e0.d2d7a8","type":"api-call-service","z":"6dc72dfa.49a6dc","name":"Aanrechtlampen aan","server":"1d8e9a4c.b062a6","version":1,"debugenabled":false,"service_domain":"light","service":"turn_on","entityId":"light.lampen_aanrecht","data":"","dataType":"json","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":390,"y":140,"wires":[["324f4cdd.43d10c","28ca8c71.a501d4"]]},{"id":"28ca8c71.a501d4","type":"timecheck","z":"6dc72dfa.49a6dc","name":"Is het 10:15 uur","time":"10:15","x":630,"y":140,"wires":[["3c575bf2.3ceb94","3ceeb1ad.eb0ffe"],[]]},{"id":"1d8e9a4c.b062a6","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]
Klopt dit? Want het UIT werkt op dit moment NIET.
inject om 0800, vervolgens aanrechtlampen aan, vervolgens check of het 10.15 is,
De flow loopt direct door. Dus om 0800 check je of het 10.15 is... dat zal natuurlijk niet het geval zijn
Als ik zie wat je wil doen zou je het volgende kunnen doen.
-Aparte inject node om 10:15 die het licht uitzet.
- delay van 2 uur 15 minuten die om 10:15 het licht uitzet
Thnx, ik dacht dat die checktime soort van 'nonstop' checkte..Wel logisch dat ie dat NIET doet eigenlijk..denuz schreef op donderdag 17 december 2020 @ 10:41:
[...]
Je flow is nu;
inject om 0800, vervolgens aanrechtlampen aan, vervolgens check of het 10.15 is,
De flow loopt direct door. Dus om 0800 check je of het 10.15 is... dat zal natuurlijk niet het geval zijn.
Als ik zie wat je wil doen zou je het volgende kunnen doen.
-Aparte inject node om 10:15 die het licht uitzet.
- delay van 2 uur 15 minuten die om 10:15 het licht uitzet
Nee dat klopt niet. Deze sequence zal dus elke dag om 8u starten. Hij zal op dat moment het licht aandoen en dan meteen kijken hoe laat het is en aangezien het nog steeds 8u zal zijn de lamp aan laten.Koepert schreef op donderdag 17 december 2020 @ 10:35:
Ik probeer dus NR te leren met wat simpelere dingen.
- Lamp aan om 08:u
- Is het 10:15u? Ja? Lamp uit. Nee? Lamp Aan laten.
Als je de lamp wil uitzetten om 10:15 heb je een inject node nodig die een sequence start om 10:15 om de lamp uit te zetten.
Ik heb momenteel 2 smart switches met kerstverlichting die s'ochtends aangaan tot zonsopgang en vanaf zonsondergang weer aangaan tot 23:00.
Gebruikt de bigtimer node dus die moet je wel even installeren. Hier is de code:
1
| [{"id":"365463df.b215cc","type":"bigtimer","z":"426a13d9.dbd79c","outtopic":"","outpayload1":"","outpayload2":"","name":"on: 7h-30minbeforesunrise & sunset-23h","comment":"","lat":"50.750217","lon":"4.346583","starttime":"420","endtime":"5003","starttime2":"5004","endtime2":"1380","startoff":"0","endoff":0,"startoff2":"-30","endoff2":"","offs":0,"outtext1":"on","outtext2":"off","timeout":1440,"sun":true,"mon":true,"tue":true,"wed":true,"thu":true,"fri":true,"sat":true,"jan":true,"feb":true,"mar":true,"apr":true,"may":true,"jun":true,"jul":true,"aug":true,"sep":true,"oct":true,"nov":true,"dec":true,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":"","month6":"","day7":"","month7":"","day8":"","month8":"","day9":"","month9":"","day10":"","month10":"","day11":"","month11":"","day12":"","month12":"","d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":"","w6":"","xday1":"","xmonth1":"","xday2":"","xmonth2":"","xday3":"","xmonth3":"","xday4":"","xmonth4":"","xday5":"","xmonth5":"","xday6":"","xmonth6":"","xd1":"","xw1":"","xd2":"","xw2":"","xd3":"","xw3":"","xd4":"","xw4":"","xd5":"","xw5":"","xd6":"","xw6":"","suspend":false,"random":false,"randon1":false,"randoff1":false,"randon2":false,"randoff2":false,"repeat":true,"atstart":true,"odd":false,"even":false,"x":240,"y":960,"wires":[[],[],["25087a29.b200c6"]]},{"id":"25087a29.b200c6","type":"switch","z":"426a13d9.dbd79c","name":"Switch","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":471,"y":970.5,"wires":[["69093af5.414c04","50dd9e3a.69145"],["819d5571.123d28","9f3bee9d.575eb"]]},{"id":"69093af5.414c04","type":"api-call-service","z":"426a13d9.dbd79c","name":"Kerstlicht Keukenraam aan","server":"5c29d263.09d2ac","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_on","entityId":"switch.living_switch","data":"","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":720,"y":880,"wires":[[]]},{"id":"50dd9e3a.69145","type":"api-call-service","z":"426a13d9.dbd79c","name":"Kerstlicht Keukenterras aan","server":"5c29d263.09d2ac","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_on","entityId":"switch.bureau_switch","data":"","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":734,"y":926.5,"wires":[[]]},{"id":"819d5571.123d28","type":"api-call-service","z":"426a13d9.dbd79c","name":"Kerstlicht Keukenraam uit","server":"5c29d263.09d2ac","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_off","entityId":"switch.living_switch","data":"","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":730,"y":1000,"wires":[[]]},{"id":"9f3bee9d.575eb","type":"api-call-service","z":"426a13d9.dbd79c","name":"Kerstlicht Keukenterras uit","server":"5c29d263.09d2ac","version":1,"debugenabled":false,"service_domain":"switch","service":"turn_off","entityId":"switch.bureau_switch","data":"","dataType":"json","mergecontext":"","output_location":"payload","output_location_type":"msg","mustacheAltTags":false,"x":730,"y":1040,"wires":[[]]},{"id":"8a3ce93b.07fcc8","type":"comment","z":"426a13d9.dbd79c","name":"output at startup staat aan","info":"","x":310,"y":920,"wires":[]},{"id":"5c29d263.09d2ac","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true}] |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| if (msg.payload.includes('"Fan_State": 0') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"0" } } if (msg.payload.includes('"Fan_State": 1') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"10" } } if (msg.payload.includes('"Fan_State": 2') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"20" } } if (msg.payload.includes('"Fan_State": 3') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"30" } } if (msg.payload.includes('"Fan_State": 4') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"40" } } if (msg.payload.includes('"Fan_State": 5') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"50" } } if (msg.payload.includes('"Fan_State": 6') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"60" } } return msg; |
De error:
1
| "TypeError: msg.payload.includes is not a function" |
Het lukt me niet om een antwoord te vinden, naar mijn idee is het goed zo. Iemand een suggestie?
Niet direct antwoord op je vraag, waarom gebruik je de switch node niet in dit geval?Knielen schreef op donderdag 17 december 2020 @ 11:46:
Ik probeer nu in een functie te kijken of de payload een bepaalde tekst bevat, maar ik krijg een foutmelding. De code die ik heb geproduceerd:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 if (msg.payload.includes('"Fan_State": 0') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"0" } } if (msg.payload.includes('"Fan_State": 1') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"10" } } if (msg.payload.includes('"Fan_State": 2') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"20" } } if (msg.payload.includes('"Fan_State": 3') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"30" } } if (msg.payload.includes('"Fan_State": 4') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"40" } } if (msg.payload.includes('"Fan_State": 5') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"50" } } if (msg.payload.includes('"Fan_State": 6') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"60" } } return msg;
De error:
code:
1 "TypeError: msg.payload.includes is not a function"
Het lukt me niet om een antwoord te vinden, naar mijn idee is het goed zo. Iemand een suggestie?
Die lijkt me wel goed geschikt hiervoor..
:fill(white):strip_exif()/f/image/9Uz52fWTk3wZQwInVsLIegbP.png?f=user_large)
[ Voor 4% gewijzigd door denuz op 17-12-2020 12:14 ]
Die heb/had ik ook, maar omdat het visueel dan zo'n groot blok werd wil ik hem graag vervangen met een functiedenuz schreef op donderdag 17 december 2020 @ 12:13:
[...]
Niet direct antwoord op je vraag, waarom gebruik je de switch node niet in dit geval?
Die lijkt me wel goed geschikt hiervoor..
[Afbeelding]
Oke... dat kan.Knielen schreef op donderdag 17 december 2020 @ 12:39:
[...]
Die heb/had ik ook, maar omdat het visueel dan zo'n groot blok werd wil ik hem graag vervangen met een functie
Zet er een aantal else tussen;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| if (msg.payload.includes('"Fan_State": 0') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"0" } } else if (msg.payload.includes('"Fan_State": 1') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"10" } } else if (msg.payload.includes('"Fan_State": 2') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"20" } } else if (msg.payload.includes('"Fan_State": 3') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"30" } } else if (msg.payload.includes('"Fan_State": 4') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"40" } } else if (msg.payload.includes('"Fan_State": 5') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"50" } } else if (msg.payload.includes('"Fan_State": 6') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"60" } } return msg; |
=== true kan trouwens weg.
Super, dat werkt! Toevoegen van de else statements was de truuk.denuz schreef op donderdag 17 december 2020 @ 13:23:
[...]
Oke... dat kan.
Zet er een aantal else tussen;
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 if (msg.payload.includes('"Fan_State": 0') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"0" } } else if (msg.payload.includes('"Fan_State": 1') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"10" } } else if (msg.payload.includes('"Fan_State": 2') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"20" } } else if (msg.payload.includes('"Fan_State": 3') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"30" } } else if (msg.payload.includes('"Fan_State": 4') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"40" } } else if (msg.payload.includes('"Fan_State": 5') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"50" } } else if (msg.payload.includes('"Fan_State": 6') === true){ msg.payload = {"command": "switchlight", "idx": 549, "switchcmd": "Set Level", "level":"60" } } return msg;
=== true kan trouwens ook weg.
Ik moet helaas terugkomen op mijn verhaal: ik krijg hetzelfde.ThinkPadd schreef op donderdag 17 december 2020 @ 09:20:
[...]
Heb je een screenshot van je gehele flow? En met welke cast app(s) gebruik je dit? Ik zie namelijk dat ik bij het casten van YouTube netjes de 'playing' / 'paused' doorkrijg, maar bij Videoland blijft het helemaal stil in Node-RED, ik krijg alleen 'undefined' terug uit het node-red-contrib-castv2 blokje. Met Netflix zelfde verhaal...
In Youtube doet het exact wat ik wil.
Netflix krijg ik:
TypeError: Cannot read property 'playerState' of undefined
voor zowel het spelen als het pauzeren.
Update: https://github.com/i8beef...v2#supported-applications
- Netflix - media control only
Update:
De developer heeft de code aangepast. Als je nu een update doet en rednode herstart dan werkt het! (Detail: Youtube geeft 'PAUSED' en Netflix geeft 'BUFFERING')
Nieuwe code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| [ { "id": "f6f2187d.f17ca8", "type": "tab", "label": "Flow 1", "disabled": false, "info": "" }, { "id": "744dfc9b.d85d24", "type": "function", "z": "f6f2187d.f17ca8", "name": "Cinema Mode", "func": "if (msg.payload.playerState === \"PLAYING\") {\n msg.payload = {\n on : false,\n transitionTime: 3\n }\n} else {\n msg.payload = {\n on : true,\n brightness : 100,\n transitionTime : 5\n }\n}\n \nreturn msg;", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "x": 800, "y": 340, "wires": [ [ "b5679e72.b0d608" ] ] }, { "id": "b5679e72.b0d608", "type": "hue-group", "z": "f6f2187d.f17ca8", "name": "Hue go zone", "bridge": "b0a78769.84f168", "groupid": "3", "colornamer": true, "skipevents": false, "universalevents": false, "x": 1030, "y": 340, "wires": [ [] ] }, { "id": "71cde734.97821", "type": "castv2-sender", "z": "f6f2187d.f17ca8", "name": "ChromecastV2 woonkamer", "connection": "108963fd.eab0ac", "spotifyAccessToken": "", "spotifyAccessTokenExpiration": "", "spotifyDeviceName": "", "x": 520, "y": 340, "wires": [ [ "744dfc9b.d85d24" ] ] }, { "id": "b0a78769.84f168", "type": "hue-bridge", "name": "TEST", "bridge": "192.168.1.120", "key": "nwIxgZjA9qMsUO8Jgbr7r8RfwbnVfG1vzRYZIQj9", "interval": "3000", "disableupdates": false }, { "id": "108963fd.eab0ac", "type": "castv2-connection", "name": "", "target": "", "host": "192.168.1.104", "port": "8009" } ] |
Happy watching!
[ Voor 67% gewijzigd door szjoin op 18-12-2020 09:25 . Reden: Voortschrijdend inzicht ]
Opzich lukt dit wel maar als ik vervolgens mijn flows importeer en ze deploy dan ervaar ik twee problemen:
1: mijn MQTT nodes blijven op connecting staan
2: in het debug venster komt een melding "Configuration invalid" en deze wijst dan naar de influxdb nodes
In portainer is alles healthy of running.
Moet ik ergens nog eens soort van connectie maken om uit de eene container te komen en vervolgens er weer in te komen bij de andere?
Ik heb overigens deze site gebruikt om Docker te installeren
Ik krijg bijvoorbeeld de volgende string binnen:
1
| "{"Fume_Temperature": 129, "RPM_Fam_Fume": 1000, "Active_Live": 151, "Total_Operating_Hours": "943:02:23", "Hours_Of_Operation_In_Power2": "383:11:05"}" |
Nu wil ik hieruit bijvoorbeeld de Active_Live waarde halen om door te sturen. Het lastige is dat de string alleen items bevat die een update hebben gehad, dit betekend dus dat Active_Live niet steeds op dezelfde plek in de string voorkomt.
Hoe kan ik in zo een string zoeken op Active_Live en hieruit de waarde halen om door te sturen?
Met de split functie kom ik niet zover, maar dat zal vast aan mijn beperkte kennis liggen.
Ik denk dat je wat basic Docker kennis mist. Je zult de containers aan hetzelfde Docker netwerk moeten koppelen, of de poort moeten doorzetten naar je host en het IP-adres van je host moeten invullen in NR voor de verbinding.Claes Maarten schreef op donderdag 17 december 2020 @ 22:35:
Ik ben mijn nieuwe PI aan het installeren en dacht laat ik eens proberen om o.a. Node Red, Mosquitto en Influxdb te installeren via Docker.
Opzich lukt dit wel maar als ik vervolgens mijn flows importeer en ze deploy dan ervaar ik twee problemen:
1: mijn MQTT nodes blijven op connecting staan
2: in het debug venster komt een melding "Configuration invalid" en deze wijst dan naar de influxdb nodes
In portainer is alles healthy of running.
Moet ik ergens nog eens soort van connectie maken om uit de eene container te komen en vervolgens er weer in te komen bij de andere?
Ik heb overigens deze site gebruikt om Docker te installeren
Ik probeer de gegevens van de fusionsolar (Huawei omvormers) te parsen naar mqtt, zodat het leesbaar is voor Loxone (ons smart home systeem). De API-gegevens heb ik (zie ook https://forum.huawei.com/...ount/thread/591478-100027 voor de werking), maar ik heb geen idee hoe ik al die posts in Node-RED gegoten krijg... Kan iemand me op weg helpen? Ik vind er bitter weinig van, ofwel zoek ik verkeerd.
Wie o wie kan mij verder helpen met Node-Red.
Ik heb een Rasp pi waar gemeten waarden worden weg geschreven in een Influx DB. Deze gemeten waarden wil ik importeren met in een andere Rasp pi. Hierop draait Node Red en Domoticz.
Ik wil nu de gemeten waarden van de Influx DB via Node Red naar een virtual Device sturen in Domoticz.
Wie heeft voor mij een werkend voorbeeld hoe ik dit zou moeten doen in Node Red. Het importeren van de Influx DB waarden in Node Red is gelukt, en ik kan ze in de debug mode zien. Ik heb in Node red een Node aangemaakt (http request) waarmee ik een vaste waarde kan versturen naar domoticz, dit werkt ook. Maar hoe moet ik nu de gemeten waarde van de Influx DB versturen met de Node Http request.
Alvast bedankt
Helaas met Videoland nog steeds geen enkele output. Ik zie je GitHub issue staan, heb voor Videoland ook even een issue aangemaakt.szjoin schreef op donderdag 17 december 2020 @ 13:54:
[...]
Update:
De developer heeft de code aangepast. Als je nu een update doet en rednode herstart dan werkt het! (Detail: Youtube geeft 'PAUSED' en Netflix geeft 'BUFFERING')
[...]
@szjoin De ontwikkelaar is erg snel, hij heeft de node nu veel meer algemeen gemaakt, waardoor het nu met Videoland ook perfect werkt. Ik kan nu netjes de playing/paused uitlezen. Je kunt trouwens ook de Chromecast bedienen, ik wil kijken of ik hem kan pauzeren als de deurbel wordt ingedrukt
Afspelen/pauzeren werkt als volgt:
1
| [{"id":"bbc567.cb46ca98","type":"inject","z":"f404d106.368c88","name":"","props":[{"p":"payload","v":"","vt":"str"},{"p":"topic","v":"","vt":"string"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":90,"y":300,"wires":[["49b58520.37d604"]]},{"id":"79df60d5.d47ec8","type":"inject","z":"f404d106.368c88","name":"","props":[{"p":"payload","v":"","vt":"str"},{"p":"topic","v":"","vt":"string"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":90,"y":360,"wires":[["d5081055.b291a8"]]},{"id":"d5081055.b291a8","type":"function","z":"f404d106.368c88","name":"play","func":"return { payload: { type: \"PLAY\"} }","outputs":1,"noerr":0,"initialize":"","finalize":"","x":270,"y":360,"wires":[["df6620f0.e77598"]]},{"id":"49b58520.37d604","type":"function","z":"f404d106.368c88","name":"pause","func":"return { payload: { type: \"PAUSE\"} }","outputs":1,"noerr":0,"initialize":"","finalize":"","x":270,"y":300,"wires":[["df6620f0.e77598"]]},{"id":"df6620f0.e77598","type":"castv2-sender","z":"f404d106.368c88","name":"Woonkamer","connection":"5f15cda9.98244c","spotifyAccessToken":"","spotifyAccessTokenExpiration":"","spotifyDeviceName":"","x":520,"y":320,"wires":[["f701edc9.a7829"]]},{"id":"5f15cda9.98244c","type":"castv2-connection","name":"","target":"","host":"192.168.4.42","port":"8009"}] |
[ Voor 78% gewijzigd door ThinkPad op 19-12-2020 21:50 ]
Van deze integratie: https://www.home-assistant.io/integrations/nzbget/
Staat een Yaml automation voor notificatie via Telegram.
1
2
3
4
5
6
7
8
9
10
11
| - alias: Completed Torrent trigger: platform: event event_type: nzbget_download_complete - event_data: category: tv action: service: notify.telegram_notifier data: title: "Download completed!" message: "{{trigger.event.data.name}}" |
Nu gaat het mij om het message deel. Is dat 1 op 1 vertaling naar NR? Dus stop ik dat letterlijk in NR-function Node? Of werkt dit anders? Dit bericht werkt, maar krijg ik geen verdere informatie., dus het "Nzbget Download Complete stuk werkt, maar de andere twee (msg.payload) geven undefined. Hoe vertaal ik bovenstaande? msg.payload.data en msg.payload.name of msg.payload.trigger.event.data.name of anders?
1
2
3
4
5
| var bericht = 'NZBGet Download Complete' + msg.payload.event.type + ' ' + msg.payload.event.data + msg.payload.event.data; msg.payload = {chatId : 1068168675, type : 'message', content : bericht}; return msg; |
Ik denk dat het moet zijn msg.payload.event.name maar dit kun je makkelijk achter halen door achter je events all node een debug node te hangen.Koepert schreef op zaterdag 19 december 2020 @ 13:04:
Hoi, vraagje over de syntax van iets in relatie tot node red.
Van deze integratie: https://www.home-assistant.io/integrations/nzbget/
Staat een Yaml automation voor notificatie via Telegram.
YAML:
1 2 3 4 5 6 7 8 9 10 11 - alias: Completed Torrent trigger: platform: event event_type: nzbget_download_complete - event_data: category: tv action: service: notify.telegram_notifier data: title: "Download completed!" message: "{{trigger.event.data.name}}"
Nu gaat het mij om het message deel. Is dat 1 op 1 vertaling naar NR? Dus stop ik dat letterlijk in NR-function Node? Of werkt dit anders? Dit bericht werkt, maar krijg ik geen verdere informatie., dus het "Nzbget Download Complete stuk werkt, maar de andere twee (msg.payload) geven undefined. Hoe vertaal ik bovenstaande? msg.payload.data en msg.payload.name of msg.payload.trigger.event.data.name of anders?
code:
1 2 3 4 5 var bericht = 'NZBGet Download Complete' + msg.payload.event.type + ' ' + msg.payload.event.data + msg.payload.event.data; msg.payload = {chatId : 1068168675, type : 'message', content : bericht}; return msg;
In de debug node kun je vervolgens het juiste vinden door te klikken op "copy path".
:fill(white):strip_exif()/f/image/Nd8oasbiRnGHDuTEfllQB182.png?f=user_large)
In de function node moet je er dan nog msg. voorzetten. Of je er iets voor moet zetten verschilt per node.
Nvm, ik ben al terug bij Volumio. moOde werkt nog slechter/onbetrouwbaarder met Spotify (in mijn ogen dan)
[ Voor 15% gewijzigd door lolgast op 21-12-2020 19:18 ]
ik zit met een probleem en weet niet hoe ik dat het beste kan oplossen.
ik heb een node die elke minuut false stuurt zolang de tv uit staat
nu wil ik dan 1 keer iets triggeren tot de tv een keer true heeft gegeven en dan weer 1 keer bij false
wie kan me in de goede richting helpen ??
Nico
- Na 18:00 uur;
- Lux beneden (zeg eens: 20)
- Plug ON
MAAR: Als het voor 18u al beneden 20 is, moet de plug ook aangaan (Maar pas OM 18u!). Blijft het tot 21:00 uur boven de 20, dan hoeft deze niet aan (t is n nachtlampje
Hoe kun je dit in NR het beste vormgeven? Timestamp op 18u --> Check lux --> Lamp aan ? Of Check Lux --> Check time --> Lamp aan? Of anders? of maakt die volgorde niet echt uit?
Dus hij moet gewoon na 18u aan, als het beneden 20 is?Koepert schreef op dinsdag 22 december 2020 @ 18:27:
Vraagje over de " visie" alhier. Ik heb een Lux-sensor en een Zigbee smartplug. Nu wil ik eigenlijk dat het volgende plaats gaat vinden:
- Na 18:00 uur;
- Lux beneden (zeg eens: 20)
- Plug ON
MAAR: Als het voor 18u al beneden 20 is, moet de plug ook aangaan (Maar pas OM 18u!). Blijft het tot 21:00 uur boven de 20, dan hoeft deze niet aan (t is n nachtlampje). UIT gaat handmatig.
Hoe kun je dit in NR het beste vormgeven? Timestamp op 18u --> Check lux --> Lamp aan ? Of Check Lux --> Check time --> Lamp aan? Of anders? of maakt die volgorde niet echt uit?

Maar dan in node-red
Ja.. dat is de korte uitleg jagraceful schreef op dinsdag 22 december 2020 @ 18:39:
[...]
Dus hij moet gewoon na 18u aan, als het beneden 20 is?![]()
[Afbeelding]
Maar dan in node-red

Heb 10 minuten staan twijfelen om te reageren, in de hoop dat ik gek was.
De volgorde maakt niet uit. Timestamp -> l response -> etc, zou ik doen.
Snap ik wel. Maar had m via Home assistant automation en die ging eerst alleen als het na 18u onder de 20 kwam. Dus als het al beneden de 20 was om 18u ging hij niet aan. Vandaar het expliciete, zij het ietwat omslachtige, omschrijven.graceful schreef op dinsdag 22 december 2020 @ 18:50:
[...]
Heb 10 minuten staan twijfelen om te reageren, in de hoop dat ik gek was.![]()
De volgorde maakt niet uit. Timestamp -> l response -> etc, zou ik doen.
Zoiets?Koepert schreef op dinsdag 22 december 2020 @ 19:26:
[...]
Snap ik wel. Maar had m via Home assistant automation en die ging eerst alleen als het na 18u onder de 20 kwam. Dus als het al beneden de 20 was om 18u ging hij niet aan. Vandaar het expliciete, zij het ietwat omslachtige, omschrijven.
:fill(white):strip_exif()/f/image/iRBCytmtIsTAN1RdMV5bJEs5.png?f=user_large)
1
| [{"id":"db53d294.db0de8","type":"inject","z":"2838595f.c700c6","name":"18:00","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":4100,"wires":[["954982f9.9a0738"]]},{"id":"954982f9.9a0738","type":"api-current-state","z":"2838595f.c700c6","name":"lux<20","server":"224924bb.3d06dc","version":1,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","override_topic":false,"entity_id":"","state_type":"str","state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","blockInputOverrides":false,"x":390,"y":4100,"wires":[["a256145d.204ad"]]},{"id":"a256145d.204ad","type":"debug","z":"2838595f.c700c6","name":"licht aan","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":670,"y":4160,"wires":[]},{"id":"157643d0.5f8c34","type":"server-state-changed","z":"2838595f.c700c6","name":"lux< 20","server":"224924bb.3d06dc","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"x":150,"y":4180,"wires":[["24637111.d38cee"]]},{"id":"24637111.d38cee","type":"time-range-switch","z":"2838595f.c700c6","name":"","lat":"","lon":"","startTime":"18:00","endTime":"21:00","startOffset":0,"endOffset":0,"x":380,"y":4180,"wires":[["a256145d.204ad"],[]]},{"id":"224924bb.3d06dc","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":false}] |
Dit is één van de redenen dat ik node-red top vind.
De triggers staan helemaal los van de actie. Zo makkelijk om extra triggers toe te voegen zonder te moeten prutsen
Ik heb zoiets voor de stekker die aan mijn kerstboom hangt.
/f/image/zDX2ycuVRKjIJfgaS6Af3HxO.png?f=fotoalbum_large)
1
| [{"id":"d2c21afe.c2c8c8","type":"poll-state","z":"ed68e40c.87eb78","name":"Licht sensor <70","server":"32040c05.d72744","version":1,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"updateinterval":"60","updateIntervalUnits":"seconds","outputinitially":false,"outputonchanged":true,"entity_id":"sensor.lumi_lumi_sen_ill_mgl01_illuminance","state_type":"str","halt_if":"70","halt_if_type":"num","halt_if_compare":"gte","outputs":2,"x":190,"y":220,"wires":[["3e12a008.e11ad"],["b7586029.84553"]]},{"id":"32040c05.d72744","type":"server","name":"Home Assistant","legacy":false,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}] |
Hij polled de status van de lichtsensor en kijkt vervolgens of hij al aanstaat.
Uiteindelijk na lang zoeken in de headers van de mail een foutmelding gevonden dat de 'content-type' twee keer werd meegestuurd. Toen gekeken naar m'n function node en hier de debugger op gezet met 'complete msg object' (i.p.v. alleen msg.payload). Hier bleek een msg.headers object aanwezig te zijn, van het HTTP-request wat ik al veel eerder vooraan in de flow deed!!

Uiteindelijk opgelost door niet
1
| return msg; |
1
| return {topic:msg.topic, to:msg.to, payload: msg.payload} |

Dit kostte wel even wat tijd

[ Voor 5% gewijzigd door ThinkPad op 24-12-2020 13:49 ]
Ik ben toevallig begin deze week flink bezig geweest met http-requests en ik vind het niet altijd even prettig bouwen. Uiteindelijk alles in de kliko gegooid want ik ben het hele product niet gaan gebruiken. Maar wel weer wijzer geworden voor de volgende keer.
erg he ... uren werk .. 1 simpel iets.ThinkPadd schreef op donderdag 24 december 2020 @ 13:44:
Net nog tegen een beetje dom (user error) issue aangelopen. Ik heb een flow waarin ik een HTTP-request doe om wat waardes op te halen. Hier doe ik dan wat berekeningen mee en zet het dan op de mail. Ik wilde hier een aanpassing in doen, maar kreeg het met geen mogelijkheid meer goed werkend. De mail kwam wel aan, maar de body bleef telkens leeg!? Plain text in de body lukte wel, maar zodra ik iets met HTML i.c.m. variables ging doen bleef de body leeg.
Uiteindelijk na lang zoeken in de headers van de mail een foutmelding gevonden dat de 'content-type' twee keer werd meegestuurd. Toen gekeken naar m'n function node en hier de debugger op gezet met 'complete msg object' (i.p.v. alleen msg.payload). Hier bleek een msg.headers object aanwezig te zijn, van het HTTP-request wat ik al veel eerder vooraan in de flow deed!!![]()
Hier stond 'text/plain', maarja mijn mail was van het type 'text/html' natuurlijk, dus geen wonder dat de mailfunctie niet wist wat hij er mee moest.
Uiteindelijk opgelost door nietJavaScript:te doen in m'n function node, maar
1 return msg;JavaScript:zodat alle overige bagger niet meegestuurd werd naar het mail node blokje
1 return {topic:msg.topic, to:msg.to, payload: msg.payload}
Dit kostte wel even wat tijdWijze les om de output op te schonen en alleen te returnen wat je ook echt gebruikt.
Het lijkt mij handiger om een splitsing html of plain text te doen. welke je later eventueel samenvoegt.
een beetje mail client kan onderscheid maken tussen A of B. maar als je bv nog wat wilt doen op een ander systeem met de tekst dan is plain altijd nuttig om erbij te hebben.
Tja vanalles