Heeft iemand tips/ervaring voor een node die tekst kan omzetten naar een afbeelding? Ik zal dan een soort 'mapping' moeten maken denk ik, dat ik bijv. linksboven op coordinaten x,y de variabele $stroomverbruik wil tonen.
[ Voor 8% gewijzigd door ThinkPad op 20-01-2023 21:52 ]
Kheb hier een brandmeldcentrale thuis, en deze wil ik graag zn status en meldingen weergeven in HA.
Via putty krijg ik volgende data binnen
:fill(white):strip_exif()/f/image/QU0B2Ba7qfpxEwrrZkUtMaSI.png?f=user_large)
In node red zie ik dit dan
:fill(white):strip_exif()/f/image/4j2hUpwuo3GIgPmu0JNcLHyj.png?f=user_large)
Kan er iemand mij op weg helpen om de strings samen te voegen tot bruikbare meldingen?
Brandcentrale heeft een seriele poort, daarop heb ik een moxa aangesloten die dan de com poort beschikbaar maakt via netwerk.
Dus in node red doe ik dan via Tcp in en zo bekom ik de data, maar deze word in stukken gekapt.
Wil dus graag een kaart in lovelave hebben met deze info en dan verder automatisering op loslaten.
Je doet alles in NR dus schopje NR topic
[ Voor 2% gewijzigd door Septillion op 22-01-2023 16:41 ]
Hikvision HCSA, Paxton, Siemens, Raspberry Pi
Interessant projectThinkPad schreef op vrijdag 20 januari 2023 @ 21:51:
Ik ben bezig met een leuk projectje (Electronic Shelf Labels, reverse engineering en hergebruik). Maar het script wat gebruikt wordt wil een afbeelding hebben (.png) Mijn idee was om data vanuit Node-RED te tonen op het digitale prijskaartje. Ik moet dus een afbeelding creëren met die data.
Heeft iemand tips/ervaring voor een node die tekst kan omzetten naar een afbeelding? Ik zal dan een soort 'mapping' moeten maken denk ik, dat ik bijv. linksboven op coordinaten x,y de variabele $stroomverbruik wil tonen.
Nooit opgevallen
Misschien is dit wat je zoekt? https://flows.nodered.org/node/node-red-contrib-image-tools
Heb het zelf niet gebruikt maar lees dat je tekst kunt 'printen'
Dat kan met join, alleen moet je wel weten wat het begin en einde van de berichten zijn.RedPas schreef op zondag 22 januari 2023 @ 08:02:
Goeiemorgen met zn allen,
Kheb hier een brandmeldcentrale thuis, en deze wil ik graag zn status en meldingen weergeven in HA.
Via putty krijg ik volgende data binnen
[Afbeelding]
In node red zie ik dit dan
[Afbeelding]
Kan er iemand mij op weg helpen om de strings samen te voegen tot bruikbare meldingen?
Brandcentrale heeft een seriele poort, daarop heb ik een moxa aangesloten die dan de com poort beschikbaar maakt via netwerk.
Dus in node red doe ik dan via Tcp in en zo bekom ik de data, maar deze word in stukken gekapt.
Wil dus graag een kaart in lovelave hebben met deze info en dan verder automatisering op loslaten.
[mbr]Je doet alles in NR dus schopje NR topic[/mbr]
Kun je in de connector naar HA niet instellen dat de data per regel verzonden wordt ?
dus wachten op enter / newline commando aangezien in putty het er een stuk beter uitziet.
"brand melding"
"kelder"
het lijkt erop
http://www.pvoutput.org/list.jsp?id=46229&sid=42168
Die COM2 screenshot van Putty, is dat ook via de Moxa? Of is dat met een laptop en een USB-Serial verbonden? In je Node-RED breekt hij de zinnen halverwege af. Mogelijk is dat een instelling op de Moxa en anders in Node-RED.RedPas schreef op zondag 22 januari 2023 @ 08:02:
Goeiemorgen met zn allen,
Kheb hier een brandmeldcentrale thuis, en deze wil ik graag zn status en meldingen weergeven in HA.
Via putty krijg ik volgende data binnen
[Afbeelding]
In node red zie ik dit dan
[Afbeelding]
Kan er iemand mij op weg helpen om de strings samen te voegen tot bruikbare meldingen?
Brandcentrale heeft een seriele poort, daarop heb ik een moxa aangesloten die dan de com poort beschikbaar maakt via netwerk.
[...]
Wat heb je zelf al gevonden? Als je zoekt op 'nodered serial port message split' etc. dan vind je wel voorbeelden zoals hier.
Stap 1 is zorgen dat de berichten niet worden afgebroken. Daarna kun je ze wel verder gaan verwerken.
Hey thanks, die ziet er wel goed uit. Heb het prijskaartjes verhaal nog niet werkend (wacht nog op de juiste hardware), zal eens met die node experimenteren zodra ik de hardware in huis heb om plaatjes op de pricetags te krijgen!Step5 schreef op dinsdag 24 januari 2023 @ 22:54:
[...]
Interessant project![]()
Nooit opgevallendie dingen in het echt...
Misschien is dit wat je zoekt? https://flows.nodered.org/node/node-red-contrib-image-tools
Heb het zelf niet gebruikt maar lees dat je tekst kunt 'printen'
Ik gebruik al een mooie tijd Nodered in combinatie met HomeAssisant voor een aantal automatiseringen naar alle tevredenheid.
Nu kwam ik er een paar dagen geleden achter dat de pomp van mijn vloerverwarming niet aangestuurd werd terwijl de ketel brand op stand CV, dit werkte voorheen perfekt......
Dus zoeken waar dat nu in zit en uiteindelijk kom ik bij nodered uit welke in de log een foutmelding tegen betreffende connectie met de server: Home Assistant.
:fill(white):strip_exif()/f/image/KkNeJOIQwbq8GVi6tJSzFVBV.png?f=user_large)
Dit heeft als resultaat dat de nodes telkens connecten en disconnecten, ik heb geen idee waar ik dit moet zoeken. Niks veranderd aan de situatie behalve dan wat updates.
Heb al geprobeerd een aantal backups terug te installeren (HA) maar dat lost het probleem niet op.
Ook zie ik bij de nodes gewoon nog steeds de server HomeAssistant staan.
/f/image/9LHICsJL484BREf926OdIhBL.png?f=fotoalbum_large)
/f/image/gwoLFO8JWeWba5zabeHxvAl8.png?f=fotoalbum_large)
:fill(white):strip_exif()/f/image/832M1Ln4G224BLFuajwCReHj.png?f=user_large)
Edit, update van node-red-contrib-home-assistant-websocket naar 0.48.0 heeft niks geholpen iig. Nog steeds hetzelfde probleem....
Edit 2, nu wel ander probleem, kan niet meer in Nodered komen en andere foutmeldingen in logboek HA
/f/image/w7hD6jzMfEk0PSbjqcZHyNF3.png?f=fotoalbum_large)
Hij zegt nu iets met server config node not found?????
/f/image/qUWTEyQrcaILPF1pxwikYasZ.png?f=fotoalbum_large)
[ Voor 56% gewijzigd door Peet3kabo op 25-01-2023 14:09 ]
Lastigheid voor mij is vooral het combineren van meerdere payloads. Heb nu zoiets bedacht:
1
| [{"id":"420f1c99e861ca1a","type":"mqtt in","z":"c8a6321ead03bb3c","name":"TOP15 - panasonic_heat_pump/main/Heat_Energy_Production","topic":"panasonic_heat_pump/main/Heat_Energy_Production","qos":"0","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":330,"y":300,"wires":[["a4c8d9f67534c7c5","b4aff4f765959ef1","3ee02210dfe6c1f7"]]},{"id":"adb8e1c3f6da9609","type":"mqtt in","z":"c8a6321ead03bb3c","name":"TOP16 - panasonic_heat_pump/main/Heat_Energy_Consumption","topic":"panasonic_heat_pump/main/Heat_Energy_Consumption","qos":"0","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":330,"y":360,"wires":[["66341f3f1e9e487b","08ad673ed29fca04","9b711245a18cdc0e"]]},{"id":"a4c8d9f67534c7c5","type":"debug","z":"c8a6321ead03bb3c","name":"debug 105","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":260,"wires":[]},{"id":"66341f3f1e9e487b","type":"debug","z":"c8a6321ead03bb3c","name":"debug 106","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":400,"wires":[]},{"id":"5b1630bf6dd16e1a","type":"debug","z":"c8a6321ead03bb3c","name":"debug 107","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":520,"wires":[]},{"id":"8dd5b50f97c6341d","type":"mqtt out","z":"c8a6321ead03bb3c","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1690,"y":340,"wires":[]},{"id":"b6d54692fda4dee5","type":"function","z":"c8a6321ead03bb3c","d":true,"name":"function 13","func":"let msg1={}, msg2={};\n\nif (msg.payload.heatprod != 'undefined' && msg.payload.heatprod != NaN)\n{\n msg1.payload = { \"idx\": 608, \"svalue\": String(Number(msg.payload.heatprod)) };\n}\n\nelse \n{\n msg1.payload = { \"idx\": 608, \"svalue\": String(Number(0)) };\n}\n\nif (msg.payload.heatcons != 'undefined' && msg.payload.heatcons != NaN)\n{\n msg2.payload = { \"idx\": 609, \"svalue\": String(Number(msg.payload.heatcons)) };\n}\n\nelse {\n msg2.payload = { \"idx\": 609, \"svalue\": String(Number(0)) };\n}\n\nreturn [msg1,msg2];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":340,"wires":[["2a94c56afad49146","8dd5b50f97c6341d"],["7cde290ee1af5a7a","8dd5b50f97c6341d"]]},{"id":"2a94c56afad49146","type":"debug","z":"c8a6321ead03bb3c","name":"debug 111","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1250,"y":260,"wires":[]},{"id":"7cde290ee1af5a7a","type":"debug","z":"c8a6321ead03bb3c","name":"debug 112","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1250,"y":400,"wires":[]},{"id":"b4aff4f765959ef1","type":"change","z":"c8a6321ead03bb3c","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.heatprod","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":300,"wires":[["b6d54692fda4dee5","f5942b1a26f634f5"]]},{"id":"f5942b1a26f634f5","type":"debug","z":"c8a6321ead03bb3c","name":"debug 115","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":970,"y":260,"wires":[]},{"id":"08ad673ed29fca04","type":"change","z":"c8a6321ead03bb3c","name":"","rules":[{"t":"move","p":"payload","pt":"msg","to":"payload.heatcons","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":360,"wires":[["b6d54692fda4dee5","ef0dcb3c9a97880b"]]},{"id":"ef0dcb3c9a97880b","type":"debug","z":"c8a6321ead03bb3c","name":"debug 116","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":970,"y":400,"wires":[]},{"id":"3ee02210dfe6c1f7","type":"function","z":"c8a6321ead03bb3c","name":"function 16","func":"msg.payload = { \"idx\": 608, \"svalue\": String(Number(msg.payload)) };\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":200,"wires":[["8dd5b50f97c6341d","75320a84cfc089df"]]},{"id":"9b711245a18cdc0e","type":"function","z":"c8a6321ead03bb3c","name":"function 17","func":"msg.payload = { \"idx\": 609, \"svalue\": String(Number(msg.payload)) };\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":970,"y":460,"wires":[["8dd5b50f97c6341d"]]},{"id":"75320a84cfc089df","type":"debug","z":"c8a6321ead03bb3c","name":"debug 117","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1530,"y":200,"wires":[]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
Met de volgende functie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| let msg1={}, msg2={}; if (msg.payload.heatprod != 'undefined' && msg.payload.heatprod != NaN) { msg1.payload = { "idx": 608, "svalue": String(Number(msg.payload.heatprod)) }; } else { msg1.payload = { "idx": 608, "svalue": String(Number(0)) }; } if (msg.payload.heatcons != 'undefined' && msg.payload.heatcons != NaN) { msg2.payload = { "idx": 609, "svalue": String(Number(msg.payload.heatcons)) }; } else { msg2.payload = { "idx": 609, "svalue": String(Number(0)) }; } return [msg1,msg2]; |
Volgens mij zit ik mezelf flink in de knoop, maar ik krijg nu allerlei NaN meldingen, terwijl de losse waardes gewoon netjes gevuld worden. Iemand een zetje in de goede richting?
En je hebt String(Number()), dus iets wat wellicht al een string is maak je een number van en dan moet het weer terug naar een string? Whut?
Handig truukje is om het volgende even in je function node te zetten
1
| node.warn(typeof jouwvariabele) |
[ Voor 31% gewijzigd door ThinkPad op 25-01-2023 15:36 ]
Weet jij misschien wat ik verkeerd doe ik deze flow.
Je hebt me eerder geholpen door lampen te laten dimmen, net voordat de lamp uit zou gaan.
Dit werkt op zich helemaal goed, behalve 1 ding.
Zodra het dimmen is ingezet (dus net voor de lamp uit gaat), dan blijft de lamp wel aan, maar dan in diezelfde gedimde stand. Ik dacht dat een reset op de trigger het probleem wel zou helpen en dat de lamp dan opnieuw aan zou gaan, maar helaas.
Wat zie ik over het hoofd?
1
| [{"id":"22088a9c6f6e1a67","type":"subflow","name":"Vertragingen (3) (2)","info":"","category":"","in":[{"x":100,"y":120,"wires":[{"id":"43450335975589ca"}]}],"out":[{"x":980,"y":280,"wires":[{"id":"6db119437475920b","port":0},{"id":"d9a7d2c5bf0255dc","port":0},{"id":"c8d7e0ca9a7b7d65","port":0},{"id":"2c8e1e230621cc25","port":0}]}],"env":[{"name":"dimmer","type":"str","value":""}],"meta":{},"color":"#DDAA99"},{"id":"43450335975589ca","type":"api-current-state","z":"22088a9c6f6e1a67","name":"Schoonmaakster aanwezig?","server":"2065350e.86a40a","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.schoonmaakster","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":320,"y":120,"wires":[["6db119437475920b"],["6e835e1b40dd9daf"]]},{"id":"6e835e1b40dd9daf","type":"api-current-state","z":"22088a9c6f6e1a67","name":"Dimmer handmatig ingedrukt?","server":"2065350e.86a40a","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.dimmer_gang","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":310,"y":200,"wires":[["2c8e1e230621cc25"],["1dd013fb17cb6354"]]},{"id":"1dd013fb17cb6354","type":"api-current-state","z":"22088a9c6f6e1a67","name":"Slaapt iedereen?","server":"9b8bc642.fed038","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.slapen","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":310,"y":280,"wires":[["d9a7d2c5bf0255dc"],["c8d7e0ca9a7b7d65"]],"outputLabels":["aan","uit"]},{"id":"c8d7e0ca9a7b7d65","type":"change","z":"22088a9c6f6e1a67","name":"Vertraging standaard","rules":[{"t":"set","p":"payload","pt":"msg","to":"standaard","tot":"str"},{"t":"set","p":"vertraging","pt":"msg","to":"VERTRAGING_STANDAARD","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":300,"wires":[[]]},{"id":"d9a7d2c5bf0255dc","type":"change","z":"22088a9c6f6e1a67","name":"Vertraging slapen","rules":[{"t":"set","p":"payload","pt":"msg","to":"Iedereen slaapt","tot":"str"},{"t":"set","p":"vertraging","pt":"msg","to":"VERTRAGING_SLAPEN","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":240,"wires":[[]]},{"id":"6db119437475920b","type":"change","z":"22088a9c6f6e1a67","name":"Vertraging schoonmaakster","rules":[{"t":"set","p":"payload","pt":"msg","to":"Schoonmaakster","tot":"str"},{"t":"set","p":"vertraging","pt":"msg","to":"VERTRAGING_SCHOONMAAKSTER","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":740,"y":120,"wires":[[]]},{"id":"744d3c76cd03d400","type":"comment","z":"22088a9c6f6e1a67","name":"Informatie over tijd","info":"De vertraging die wordt ingesteld in de\nchangenode is in miliseconden\n\nDus 5 seconden wordt 5000","x":290,"y":60,"wires":[]},{"id":"2c8e1e230621cc25","type":"change","z":"22088a9c6f6e1a67","name":"Vertraging dimmer","rules":[{"t":"set","p":"payload","pt":"msg","to":"Dimmer","tot":"str"},{"t":"set","p":"vertraging","pt":"msg","to":"VERTRAGING_DIMMER","tot":"global"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":180,"wires":[[]]},{"id":"b94d3c6bf94c92d1","type":"subflow","name":"Dagdeel Hue color (3) (2)","info":"","category":"","in":[{"x":180,"y":240,"wires":[{"id":"6224bde6d9d9ae1d"},{"id":"710c8a8eb3088fb6"},{"id":"3f8d2d33f2d279ca"}]}],"out":[{"x":1040,"y":260,"wires":[{"id":"efe8c88b4ddc2dfc","port":0},{"id":"54b4264999c0795a","port":0},{"id":"7d4456bb8c401165","port":0},{"id":"497877dcafd7a4c6","port":0}]}],"env":[],"meta":{},"color":"#DDAA99","outputLabels":["Overdag"]},{"id":"6224bde6d9d9ae1d","type":"time-range-switch","z":"b94d3c6bf94c92d1","name":"tussen Sunrise & Sunset","lat":"52.12","lon":"4.65","startTime":"sunrise","endTime":"sunset","startOffset":0,"endOffset":0,"x":390,"y":180,"wires":[["efe8c88b4ddc2dfc"],[]]},{"id":"710c8a8eb3088fb6","type":"time-range-switch","z":"b94d3c6bf94c92d1","name":"tussen Sunset & 00:00","lat":"52.12","lon":"4.65","startTime":"sunset","endTime":"00:00","startOffset":0,"endOffset":0,"x":380,"y":240,"wires":[["54b4264999c0795a"],[]]},{"id":"3f8d2d33f2d279ca","type":"time-range-switch","z":"b94d3c6bf94c92d1","name":"tussen 00:01 & Sunrise","lat":"52.12","lon":"4.65","startTime":"00:01","endTime":"sunrise","startOffset":0,"endOffset":0,"x":390,"y":300,"wires":[["c3a49e61540bb6f6"],[]]},{"id":"efe8c88b4ddc2dfc","type":"change","z":"b94d3c6bf94c92d1","name":"overdag","rules":[{"t":"set","p":"payload","pt":"msg","to":"overdag","tot":"str"},{"t":"set","p":"hue_color_brightness_pct","pt":"global","to":"100","tot":"num"},{"t":"set","p":"hue_color_transition","pt":"global","to":"0.5","tot":"num"},{"t":"set","p":"hue_color_kelvin","pt":"global","to":"2700","tot":"num"},{"t":"set","p":"rgb_color","pt":"global","to":"255,148,45","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":180,"wires":[[]]},{"id":"54b4264999c0795a","type":"change","z":"b94d3c6bf94c92d1","name":"avond","rules":[{"t":"set","p":"payload","pt":"msg","to":"avond","tot":"str"},{"t":"set","p":"hue_color_brightness_pct","pt":"global","to":"60","tot":"num"},{"t":"set","p":"hue_color_transition","pt":"global","to":"0.5","tot":"num"},{"t":"set","p":"hue_color_kelvin","pt":"global","to":"2700","tot":"num"},{"t":"set","p":"rgb_color","pt":"msg","to":"255,148,45","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":240,"wires":[[]]},{"id":"7d4456bb8c401165","type":"change","z":"b94d3c6bf94c92d1","name":"nacht","rules":[{"t":"set","p":"payload","pt":"msg","to":"nacht","tot":"str"},{"t":"set","p":"hue_color_brightness_pct","pt":"global","to":"50","tot":"num"},{"t":"set","p":"hue_color_transition","pt":"global","to":"0.5","tot":"num"},{"t":"set","p":"hue_color_kelvin","pt":"global","to":"2100","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":850,"y":300,"wires":[[]]},{"id":"c3a49e61540bb6f6","type":"api-current-state","z":"b94d3c6bf94c92d1","name":"Slaap scene uit?","server":"9b8bc642.fed038","version":3,"outputs":2,"halt_if":"off","halt_if_type":"str","halt_if_compare":"is","entity_id":"input_boolean.slapen_scene","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":630,"y":300,"wires":[["7d4456bb8c401165"],["497877dcafd7a4c6"]]},{"id":"497877dcafd7a4c6","type":"change","z":"b94d3c6bf94c92d1","name":"slapen","rules":[{"t":"set","p":"payload","pt":"msg","to":"nacht","tot":"str"},{"t":"set","p":"hue_color_brightness_pct","pt":"global","to":"10","tot":"num"},{"t":"set","p":"hue_color_transition","pt":"global","to":"0.5","tot":"num"},{"t":"set","p":"hue_color_kelvin","pt":"global","to":"2100","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":850,"y":360,"wires":[[]]},{"id":"9b8bc642.fed038","type":"server","name":"Home Assistant","version":4,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m"},{"id":"4e0b1fa01c86a80e","type":"comment","z":"934d9cd289491d7c","name":"Algemene info","info":"**Kelvin waardes**\n\n6000 Kelvin: Koel wit, zoals een helder blauwe lucht met een middagzon.\n\n5500 Kelvin: Standaard daglicht wit, zoals een heldere lucht.\n\n4800 Kelvin: Daglicht met direct zonlicht.\n\n4000 Kelvin: Wit met een warme gloed, zoals het licht van TL buizen.\n\n3000 Kelvin: Warmwit zoals het licht van halogeenlampen. (badkamer en keuken)\n\n2800 Kelvin: Warm licht zoals een gloeilamp.\n\n2200 Kelvin: Warm licht zoals het licht van HPS lampen.\n\n1900 Kelvin: Warm licht zoals kaarslicht\n\n**standaard helder scene schoonmaakster**\n{\"brightness\":255,\"color_temp\":255,\"transition\":1}\n\n**Let op dat de wait untill node tijd 2x telt aangezien de off node ook een signaal geeft**\n\n\n{\"brightness_pct\":100,\"transition\":0.5}\n\n{\"brightness_pct\":{{global.hue_color_brightness_pct}}, \"transition\":{{global.hue_color_transition}}}","x":150,"y":40,"wires":[]},{"id":"e6c95492613167dd","type":"comment","z":"934d9cd289491d7c","name":"Light informatie zit in HACS adaptive lightning","info":"**Kelvin waardes**\n\n6000 Kelvin: Koel wit, zoals een helder blauwe lucht met een middagzon.\n\n5500 Kelvin: Standaard daglicht wit, zoals een heldere lucht.\n\n4800 Kelvin: Daglicht met direct zonlicht.\n\n4000 Kelvin: Wit met een warme gloed, zoals het licht van TL buizen.\n\n3000 Kelvin: Warmwit zoals het licht van halogeenlampen. (badkamer en keuken)\n\n2800 Kelvin: Warm licht zoals een gloeilamp.\n\n2200 Kelvin: Warm licht zoals het licht van HPS lampen.\n\n1900 Kelvin: Warm licht zoals kaarslicht\n\n**standaard helder scene schoonmaakster**\n{\"brightness\":255,\"color_temp\":255,\"transition\":1}\n\n**Let op dat de wait untill node tijd 2x telt aangezien de off node ook een signaal geeft**\n\n\n{\"brightness_pct\":100,\"transition\":0.5}\n\n{\"brightness_pct\":{{global.hue_color_brightness_pct}}, \"transition\":{{global.hue_color_transition}}}","x":410,"y":40,"wires":[]},{"id":"264f3a58d2de6549","type":"server-state-changed","z":"934d9cd289491d7c","name":"bewegingssensor","server":"2065350e.86a40a","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"binary_sensor.bewegingssensor_gang","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":160,"y":180,"wires":[["4d5c40d49e71d8ad","f0a7dd54a43f8c65"],["76c99aa275610b78"]]},{"id":"4197e0a92a035d05","type":"comment","z":"934d9cd289491d7c","name":"Gang","info":"{\"brightness_pct\":{{global.hue_color_brightness_pct}}, \"transition\":{{global.hue_color_transition}}}","x":130,"y":140,"wires":[]},{"id":"aa19be224f8d87e5","type":"api-call-service","z":"934d9cd289491d7c","name":"Lamp aan","server":"2065350e.86a40a","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.lamp_gang"],"data":"{\"brightness_pct\":{{global.hue_color_brightness_pct}}, \"transition\":{{global.hue_color_transition}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":980,"y":140,"wires":[[]]},{"id":"150ec21a7fe49e41","type":"api-call-service","z":"934d9cd289491d7c","name":"Lamp dimmen","server":"2065350e.86a40a","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["light.gang_group"],"data":"{ \"brightness\": $max([ $entities(\"light.gang_group\").attributes.brightness /2, 5 ])}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1020,"y":280,"wires":[["dbcf79d1f6198cfb"]]},{"id":"bf14341cd2cea7ae","type":"trigger","z":"934d9cd289491d7c","name":"","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"1","extend":true,"overrideDelay":true,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":820,"y":280,"wires":[["150ec21a7fe49e41"]]},{"id":"32a2843399f594ae","type":"change","z":"934d9cd289491d7c","name":"Stel vertraging in","rules":[{"t":"set","p":"delay","pt":"msg","to":"vertraging","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":280,"wires":[["bf14341cd2cea7ae"]]},{"id":"4d5c40d49e71d8ad","type":"change","z":"934d9cd289491d7c","name":"Reset trigger","rules":[{"t":"set","p":"reset","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":570,"y":240,"wires":[["bf14341cd2cea7ae","dbcf79d1f6198cfb"]]},{"id":"d411c2deb94d5825","type":"subflow:b94d3c6bf94c92d1","z":"934d9cd289491d7c","name":"Lampwaardes dagdeel","env":[],"x":760,"y":140,"wires":[["aa19be224f8d87e5","161666ae99c1485a"]]},{"id":"161666ae99c1485a","type":"debug","z":"934d9cd289491d7c","name":"Welke dagdeel is het","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1020,"y":80,"wires":[]},{"id":"f0a7dd54a43f8c65","type":"api-current-state","z":"934d9cd289491d7c","name":"lux onder 50","server":"9b8bc642.fed038","version":3,"outputs":2,"halt_if":"50","halt_if_type":"num","halt_if_compare":"lt","entity_id":"sensor.bewegingssensor_gang_lux","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":550,"y":140,"wires":[["d411c2deb94d5825"],[]]},{"id":"76c99aa275610b78","type":"subflow:22088a9c6f6e1a67","z":"934d9cd289491d7c","name":"","env":[{"name":"dimmer","value":"input_boolean.dimmer_overloop","type":"str"}],"x":380,"y":280,"wires":[["32a2843399f594ae","1afa2bbbec7ec64c"]]},{"id":"1afa2bbbec7ec64c","type":"debug","z":"934d9cd289491d7c","name":"Welke vertraging wordt ingesteld","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":340,"wires":[]},{"id":"0e6281475183fab7","type":"api-call-service","z":"934d9cd289491d7c","name":"Lamp uit","server":"2065350e.86a40a","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["light.gang_group"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":1380,"y":280,"wires":[[]]},{"id":"dbcf79d1f6198cfb","type":"trigger","z":"934d9cd289491d7c","name":"","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"10","extend":true,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":1210,"y":280,"wires":[["0e6281475183fab7"]]},{"id":"2065350e.86a40a","type":"server","name":"Home Assistant","version":4,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30,"areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":"at: ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"h23","statusTimeFormat":"h:m"}] |
/f/image/k36DWzkq3SS523FsnzZpfQPA.png?f=fotoalbum_large)
Als je dit kunt lezen, dan werkt mij Signature!
Je zegt; zodra het dimmen is ingezet, dan blijft de lamp wel aan, maar dan in diezelfde gedimde stand?
Waar in de flow loopt het precies mis? Lamp dimmen? Lamp uit?
Edit;
ik heb het even getest; heb enkel mijn eigen lamp er in gezet. De lamp dimt en gaat daarna uit?
:fill(white):strip_exif()/f/image/b4PdJhJiOYHhRixXfIQ9I9gd.png?f=user_large)
[ Voor 42% gewijzigd door denuz op 26-01-2023 20:56 ]
Sorry, ik bedoel dat zodra het gedimde stuk is ingezet, en ik loopt toevallig weer de kamer in, dan wil ik (of zou ik verwachten) dat de lamp weer vol gaat branden alsof de flow opnieuw draait. Dit gebeurt echter niet. De lamp blijft dus wel aan, maar dan in de gedimde stand.denuz schreef op donderdag 26 januari 2023 @ 20:53:
@Wachten... Ik snap het niet?
Je zegt; zodra het dimmen is ingezet, dan blijft de lamp wel aan, maar dan in diezelfde gedimde stand?
Waar in de flow loopt het precies mis? Lamp dimmen? Lamp uit?
Edit;
ik heb het even getest; heb enkel mijn eigen lamp er in gezet. De lamp dimt en gaat daarna uit?
[Afbeelding]
Als je dit kunt lezen, dan werkt mij Signature!
Bij beweging stuur je een reset naar de 2 triggers. De lamp gaat daardoor inderdaad niet meer uit.Wachten... schreef op donderdag 26 januari 2023 @ 21:10:
[...]
Sorry, ik bedoel dat zodra het gedimde stuk is ingezet, en ik loopt toevallig weer de kamer in, dan wil ik (of zou ik verwachten) dat de lamp weer vol gaat branden alsof de flow opnieuw draait. Dit gebeurt echter niet. De lamp blijft dus wel aan, maar dan in de gedimde stand.
In dit gedeelte van je flow gebeurt verder niets om de lamp opnieuw in te stellen. (enkel dimmen en uit)
/f/image/Gsjggm72ThGJHgySfS6y6W3O.png?f=fotoalbum_large)
:fill(white):strip_exif()/f/image/qFL65a8Burcz74feHXRLzzSi.png?f=user_large)
Is de lux wel onder 50?
Als je de eerste keer motion hebt gaat de lamp wel aan?
Ja bij de eerste keer doet hij gewoon wat hij moet doen. De reset is dat als er opnieuw beweging is, dat de triggers dan gereset worden.denuz schreef op donderdag 26 januari 2023 @ 21:21:
[...]
Bij beweging stuur je een reset naar de 2 triggers. De lamp gaat daardoor inderdaad niet meer uit.
In dit gedeelte van je flow gebeurt verder niets om de lamp opnieuw in te stellen. (enkel dimmen en uit)
[Afbeelding]
[Afbeelding]
Is de lux wel onder 50?
Als je de eerste keer motion hebt gaat de lamp wel aan?
Mij lijkt niet dat het aan de Lux ligt, want als de lamp aan gaat dan gaat niet de lux omhoog door de lamp toch?
Als je dit kunt lezen, dan werkt mij Signature!
Het lastige is dat ik niet kan zien of debuggen waarom het niet werkt. Het lukt de eerste keer wel, daarnaWachten... schreef op donderdag 26 januari 2023 @ 21:32:
[...]
Ja bij de eerste keer doet hij gewoon wat hij moet doen. De reset is dat als er opnieuw beweging is, dat de triggers dan gereset worden.
Mij lijkt niet dat het aan de Lux ligt, want als de lamp aan gaat dan gaat niet de lux omhoog door de lamp toch?
niet.
Mijn advies: koppel er 5 debugs node's achter en je ziet precies achter welke node je flow stopt.
Plug er nog een aantal inject nodes bij en je kan binnen een paar minuten alles testen
Gek genoeg werkt alles wel als ik het wil debuggen.denuz schreef op donderdag 26 januari 2023 @ 21:34:
[...]
Het lastige is dat ik niet kan zien of debuggen waarom het niet werkt. Het lukt de eerste keer wel, daarna
niet.
Mijn advies: koppel er 5 debugs node's achter en je ziet precies achter welke node je flow stopt.
Plug er nog een aantal inject nodes bij en je kan binnen een paar minuten alles testen
Ik heb voor de zekerheid even de lux er toch maar wel uitgehaald. Even kijken of dat het probleem op gaat lossen.
Als je dit kunt lezen, dan werkt mij Signature!
Heel eerlijk; ik heb geen flauw idee wat ik aan het doen benThinkPad schreef op woensdag 25 januari 2023 @ 15:32:
Misschien kun je uitleggen wat je precies wil doen? Heb de nodes even geimporteerd, je hebt twee waardes en er moet één waarde uit? Ik mis waarschijnlijk een berekening ofzo?
En je hebt String(Number()), dus iets wat wellicht al een string is maak je een number van en dan moet het weer terug naar een string? Whut?Domoticz wil toch ook gewoon een number/float hebben aangezien het een sensorwaarde is (temperatuur/verbruik o.i.d. maak ik op uit de context).
Handig truukje is om het volgende even in je function node te zettenJavaScript:In de debug console zie je dan netjes 'string', 'number' etc.
1 node.warn(typeof jouwvariabele)
Nee, ik wil het stap voor stap doen, uiteindelijk wil ik een COP berekening gaan maken.
Daarvoor wilde ik eerst de productie en de consumptie in één function node trekken, om te zien of de waardes correct zijn. Vervolgens kreeg ik NaN waardes, en daar was ik een beetje gestrand.
Domoticz wil volgens mij voor een Custom sensor met COP een string waarde hebben.
Was nu bezig deze afzonderlijke waardes correct naar Domoticz te krijgen.
Belangrijk om te onthouden: nodes in een flow zijn agnostisch, maw ze zijn niet aware van andere messages (elke msg heeft zijn eigen ID en word individueel behandeld), je kunt dus niet 2 verschillende sources aan een enkele functie node hangen en dan de values vergelijken.MikeyMan schreef op vrijdag 27 januari 2023 @ 09:31:
Vervolgens kreeg ik NaN waardes, en daar was ik een beetje gestrand.
Je zult de berichten eerst moeten combineren, dit kan met de join-node, deze kun je flexibel instellen zodat je 1 msg krijgt met beide properties, die je dan op zijn beurt de function node in kunt sturen. Zelfs zou ik dan de native switch nodes gebruiken, maakt een flow veel leesbaarder.
:strip_exif()/f/image/TC11RjyjECcnBtTmgO7PGwIf.jpg?f=fotoalbum_medium)
De in inhoud van beide payloads zijn het hetzelfde maar toch laat hij het bericht niet door. Aan 11 ipv 11.0 ligt het niet dat heb ik al wel getest.Want als ik payload2 vergelijk met een vaste waarde maakt het niet uit of ik 11 of 11.0 ingeef.
[ Voor 21% gewijzigd door OcGuru op 12-02-2023 14:06 ]
Bl44t
Als je number 11 en number 11.0 met elkaar vergelijkt, zal hij wel de waarde "on" doorgeven.
Of pas je HA-node aan dat hij bij State type niet string, maar number doorgeeft. Maar in dat geval zal je bij payload geen "on" meer krijgen maar een nummer.
[ Voor 20% gewijzigd door iCrOn op 12-02-2023 16:33 ]
Thx voor je bericht. Het aanpassen van de events : state node naar number ipv string maakte geen verschil.iCrOn schreef op zondag 12 februari 2023 @ 15:18:
Kan je payload1 en payload2 niet omzetten naar number ipv string? Als je aan je switch een 2e regel toevoegt met "otherwise" en daar een debug er aan zal je zien dat 11.0 en 11 in string niet hetzelfde zijn en dus via de "otherwise" er uit komt als je een string vergelijkt met elkaar.
Als je number 11 en number 11.0 met elkaar vergelijkt, zal hij wel de waarde "on" doorgeven.
Of pas je HA-node aan dat hij bij State type niet string, maar number doorgeeft. Maar in dat geval zal je bij payload geen "on" meer krijgen maar een nummer.
Volgens mij zit het probleem is dat payload2 payload3 HA helpers van het float datatype zijn ipv payload1 die weer een integer is.
Maak nu via een omweg van payload2 en payload3 een integer en daarna de vergelijking. En dit werkt voorlopig

Bl44t
Hiervoor heb ik logischerwijs twee bronnen, de lichtsensor vanuit Tahoma en de temperatuur vanuit Evohome.
De losse berichten kan ik op zich benaderen, maar het samenvoegen om ze in een functie te kunnen gebruiken gaat me niet zo heel goed af.
Heb een join node gebruikt om ze samen in één function node te krijgen. Maar, dit levert geregeld een foutmelding op:
1
2
3
| 22-2-2023 16:57:15node: Functie 2e verdieping function : (error) "TypeError: Cannot read properties of undefined (reading 'svalue2')" |
Ik denk dat dit komt doordat niet alle berichten synchroon binnen komen. De lichtsensor geeft vaker een bericht dan EvoHome, en daar zit die svalue2 niet in.
Deze code heb ik geprutst in de opvolgende function node:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| let measure = parseFloat(msg.payload["domoticz/out/Verlichtingssensor achterkant"].svalue1); let setpoint = parseFloat('2500'); let roomtemp = msg.payload["domoticz/out/2e Verdieping"]; let roomset = parseFloat(msg.payload["domoticz/out/2e Verdieping"].svalue2); let msg1 = {}; let msg2 = {}; if (measure >= setpoint && roomtemp >= (roomset - 1)) { msg1.payload = { "command": "switchlight", "idx": 499, "switchcmd": "Off" }; //Off = Down msg2.payload = { "command": "switchlight", "idx": 500, "switchcmd": "Off" }; //Off = Down } else { msg1.payload = { "command": "switchlight", "idx": 499, "switchcmd": "On" }; //On = Up msg2.payload = { "command": "switchlight", "idx": 500, "switchcmd": "On" }; //On = Up } return [msg1, msg2]; |
Iemand enig idee hoe dit te voorkomen?
Het lijkt op zich te werken, maar beter zonder errors natuurlijk
voor de volledigheid: flowtje:
1
| [{"id":"72dbd6e0609fb14a","type":"mqtt in","z":"743a62898f598be4","name":"","topic":"domoticz/out/Verlichtingssensor achterkant","qos":"2","datatype":"json","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":200,"y":400,"wires":[["e22b7252c47338be","6d9ebcd15f26eb47","16f10790b1453774"]]},{"id":"e22b7252c47338be","type":"debug","z":"743a62898f598be4","name":"Debug Input","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":570,"y":400,"wires":[]},{"id":"d26215205e094572","type":"mqtt out","z":"743a62898f598be4","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1410,"y":500,"wires":[]},{"id":"882f9884960f2879","type":"function","z":"743a62898f598be4","name":"Functie 2e verdieping","func":"let measure = parseFloat(msg.payload[\"domoticz/out/Verlichtingssensor achterkant\"].svalue1);\nlet setpoint = parseFloat('2500');\nlet roomtemp = msg.payload[\"domoticz/out/2e Verdieping\"];\nlet roomset = parseFloat(msg.payload[\"domoticz/out/2e Verdieping\"].svalue2);\nlet msg1 = {};\nlet msg2 = {};\n\n\nif (measure >= setpoint && roomtemp >= (roomset - 1)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n}\n\nreturn [msg1, msg2];","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1120,"y":500,"wires":[["d26215205e094572","5110aa3d54c890d5"]]},{"id":"5110aa3d54c890d5","type":"debug","z":"743a62898f598be4","name":"Debug Functie 2e verdieping","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1460,"y":560,"wires":[]},{"id":"b88bd87a65abac9a","type":"link in","z":"743a62898f598be4","name":"2e Verdieping Evohome","links":["abcf7140801bb72a"],"x":360,"y":500,"wires":[["16f10790b1453774","d7ccae4e9da1b344"]],"l":true},{"id":"f4e134461ec0c386","type":"debug","z":"743a62898f598be4","name":"debug 94","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1020,"y":560,"wires":[]},{"id":"16f10790b1453774","type":"join","z":"743a62898f598be4","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"1","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":790,"y":500,"wires":[["f4e134461ec0c386","882f9884960f2879"]]},{"id":"d7ccae4e9da1b344","type":"debug","z":"743a62898f598be4","name":"debug 125","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":580,"wires":[]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
Volgende uitdaging... Vanuit de EvoHome api komen ook rechtstreeks berichten in nodered... Deze zijn per zone gescheiden, en zien er dan zo uit:
1
2
| {"id":"5589567","name":"garage","currentTemperature":15,"targetTemperature":17,"systemModeStatus":{"mode":"Auto","isPermanent":true}} {"id":"3873688","name":"woonkamer","currentTemperature":19.5,"targetTemperature":19.5,"systemModeStatus":{"mode":"Auto","isPermanent":true}} |
Wat zou een logische manier zijn om deze in afzonderlijke output te pushen? Ben met filter en change node aan de gang geweest; maar ik vrees een beetje dat het losse function nodes worden per kamer?
Begin steeds meer het idee te krijgen dat die aanhalingstekens wel uit de topic titel mogen
[ Voor 58% gewijzigd door MikeyMan op 22-02-2023 17:29 ]
Die hadden er ook nooit mogen staan.MikeyMan schreef op woensdag 22 februari 2023 @ 17:01:
Begin steeds meer het idee te krijgen dat die aanhalingstekens wel uit de topic titel mogen
Het is wel degelijk programmeren. Dat de presentatie grotendeels grafisch is doet daar niets aan af.
Als je in de Join node bij 'After a number of message parts' 2 invult, wacht de node totdat hij twee topics binnen heeft voordat hij een message doorgeeft.
[ Voor 18% gewijzigd door JW te R op 22-02-2023 19:44 ]
Ja eensJW te R schreef op woensdag 22 februari 2023 @ 19:12:
[...]
Die hadden er ook nooit mogen staan.
Het is wel degelijk programmeren. Dat de presentatie grotendeels grafisch is doet daar niets aan af.
Als je in de Join node bij 'After a number of message parts' 2 invult, wacht de node totdat hij twee topics binnen heeft voordat hij een message doorgeeft.
Twee topics; dat kunnen ook twee dezelfde zijn? Of wacht ie dan echt op de beide inputs?
Zit sowieso te denken, die mismatch in binnenkomende berichten maakt het misschien wel lastig om deze samen te gebruiken of niet?
Ik bedoel; als ie de functie alleen kan uitvoeren op de momenten dat er toevallig twee waardes binnen komen...? Zou dan die inkomende info niet eerst in een variabele moeten worden opgeslagen waartegen daarna getest kan worden? Hij lijkt nu alleen data te kunnen vinden op het moment van het ontvangen van een bericht.
Maar misschien zit ik er te ver over na te denken nu. Eerst die join node maar doen
[ Voor 15% gewijzigd door MikeyMan op 23-02-2023 11:29 ]
Die error kun je denk ik voorkomen door zoiets:MikeyMan schreef op woensdag 22 februari 2023 @ 17:01:
Heb een join node gebruikt om ze samen in één function node te krijgen. Maar, dit levert geregeld een foutmelding op:
code:
1 2 3 22-2-2023 16:57:15node: Functie 2e verdieping function : (error) "TypeError: Cannot read properties of undefined (reading 'svalue2')"
Ik denk dat dit komt doordat niet alle berichten synchroon binnen komen. De lichtsensor geeft vaker een bericht dan EvoHome, en daar zit die svalue2 niet in.
Deze code heb ik geprutst in de opvolgende function node:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 let measure = parseFloat(msg.payload["domoticz/out/Verlichtingssensor achterkant"].svalue1); let setpoint = parseFloat('2500'); let roomtemp = msg.payload["domoticz/out/2e Verdieping"]; let roomset = parseFloat(msg.payload["domoticz/out/2e Verdieping"].svalue2); let msg1 = {}; let msg2 = {}; if (measure >= setpoint && roomtemp >= (roomset - 1)) { msg1.payload = { "command": "switchlight", "idx": 499, "switchcmd": "Off" }; //Off = Down msg2.payload = { "command": "switchlight", "idx": 500, "switchcmd": "Off" }; //Off = Down } else { msg1.payload = { "command": "switchlight", "idx": 499, "switchcmd": "On" }; //On = Up msg2.payload = { "command": "switchlight", "idx": 500, "switchcmd": "On" }; //On = Up } return [msg1, msg2];
Iemand enig idee hoe dit te voorkomen?
Het lijkt op zich te werken, maar beter zonder errors natuurlijk
...
1
2
3
4
5
| if (msg.payload[xxx] != undefined) { if (msg.payload [xxx].yyy != undefined) { do something } } |
Ik heb even je flow bekeken en hoewel ik geen expert ben op de join node, denk ik dat het zo niet gaat werken...MikeyMan schreef op woensdag 22 februari 2023 @ 17:01:
Ik probeer een sturing te maken die op basis van de kamertemperatuur de zonneschermen wel of niet dicht laat gaan.
Hiervoor heb ik logischerwijs twee bronnen, de lichtsensor vanuit Tahoma en de temperatuur vanuit Evohome.
De losse berichten kan ik op zich benaderen, maar het samenvoegen om ze in een functie te kunnen gebruiken gaat me niet zo heel goed af.
Heb een join node gebruikt om ze samen in één function node te krijgen. Maar, dit levert geregeld een foutmelding op:
code:
1 2 3 22-2-2023 16:57:15node: Functie 2e verdieping function : (error) "TypeError: Cannot read properties of undefined (reading 'svalue2')"
Ik denk dat dit komt doordat niet alle berichten synchroon binnen komen. De lichtsensor geeft vaker een bericht dan EvoHome, en daar zit die svalue2 niet in.
Iemand enig idee hoe dit te voorkomen?
Je hebt nu namelijk 2 triggers, namelijk Kamertemp en Lichtsensor.
Met "message parts" op 1, dan triggert elk van deze de function node en dan zal er dus maar 1 van de waarden beschikbaar zijn.
Met "message parts" op 2, dan wordt de function node pas uitgevoerd als van elk van de trigger nodes er 1-tje is binnengekomen (aangenomen dat het topic verschillend is)
Wat je kunt doen om te debuggen is een inject node naast de trigger nodes plaatsen met verschillende waarden zodat je eenvoudig verschillende inputs kunt testen.
Wat je volgens mij eigenlijk wilt is slechts 1 trigger, namelijk de Lichtsensor. Als deze boven een bepaalde waarde komt (2500) dan moet pas gekeken worden naar de temperatuur in de kamer (is dus geen trigger, maar gewoon waarde uitlezen).
Andersom kan misschien ook: als de temp in de kamer te hoog wordt (trigger), kijk dan of de zon schijnt (waarde uitlezen). Zo ja, doe het scherm omlaag.
Hou er wel rekening mee dat je waarschijnlijk nog een vertraging of temperatuurbereik moet inbouwen, want anders kan het zomaar zijn dat je zonnescherm open/dicht/open/dicht/etc gaat. De temperatuur in de kamer kan namelijk dalen als het zonnescherm naar beneden gaat, of er kan een wolkje langsdrijven.
Feel free to Buy me a coffee
Ben nu bezig om e.e.a. om te gooien. Heb nu domoticz als bron voor de evohome input. Maar merk dat daar weleens een paar rare dingen in zitten. Ga node red leading maken en de data daar vandaan naar domoticz sturen ipv andersom.
Daarna verder met de zonneschermen. De vertraging is ook wel een punt. Wilde dat idd met een range doen en een beetje afvlakken met de smooth node.
Die waarde moet je natuurlijk dan wel kunnen ophalen.
Nog steeds tevreden domoticz gebruiker? Stap over op HA
En waarde ophalen betekent dan iets van global set?denuz schreef op vrijdag 24 februari 2023 @ 12:35:
@MikeyMan Nee, hoeft niet in hetzelfde bericht ( de trigger) te zitten je kan later in de flow altijd nog een check doen op de huidige waarde.
Die waarde moet je natuurlijk dan wel kunnen ophalen.
Als ik iets niet wil is het integratie tussen verschillende stukken software. Node red draait nu in docker op mn nas. Zit me prima zo.offtopic:
Nog steeds tevreden domoticz gebruiker? Stap over op HAdie heeft een stuk betere integratie met Node-red
Mbt domoticz; het heeft allebei zn voors en tegens. Was door het stoppen van openzwave support op het punt om over te stappen, maar de migratie is me veel teveel moeite voor wat ik ervoor terug krijg eerlijk gezegd. Heb het wel naast elkaar draaien nu om te testen, heeft allebei zn voors en tegens. Maar domoticz is nu in vele jaren zo gegroeid.
Kun je o.b.v. de Idx in domoticz de waarde ophalen?MikeyMan schreef op vrijdag 24 februari 2023 @ 12:55:
[...]
En waarde ophalen betekent dan iets van global set?
[...]
Als ik iets niet wil is het integratie tussen verschillende stukken software. Node red draait nu in docker op mn nas. Zit me prima zo.
Mbt domoticz; het heeft allebei zn voors en tegens. Was door het stoppen van openzwave support op het punt om over te stappen, maar de migratie is me veel teveel moeite voor wat ik ervoor terug krijg eerlijk gezegd. Heb het wel naast elkaar draaien nu om te testen, heeft allebei zn voors en tegens. Maar domoticz is nu in vele jaren zo gegroeid.
Ik zie dat je nu naar MQTT gebruikt, je zou o.b.v. de MQTT de waarde in een flow.variabele kunnen zetten.
Mogelijke oplossing:
/f/image/mHyrR1OyUIsU5btjpkRXoVwr.png?f=fotoalbum_large)
De functie bouw je dus om om niet de payload waarde maar de flow waarde te gebruiken.
En wat betreft de integratie.. je gebruikt nu MQTT om waardes in node-red te krijgen. Dat is toch ook een vorm van integratie/connectie.
Ik gebruik in node-red websockets(gewoon een addon) om connectie te maken. Daarmee kan je dus direct de waarde opvragen van een sensor in home assistant.
Probeer alleen te zeggen dat de moeite die je nu(en ook eerder) moet doen om iets uit domoticz te halen een enorm verschil is.
Ik heb ook in het verleden domoticz gebruikt en snap dat de overstap tijd/moeite kost.
:strip_exif()/f/image/LXqMvI2kWHTUvwaoH5gCkvyP.jpg?f=fotoalbum_large)
Eenmaal over op HomeAssitant krijg ik deze rotine niet meer nagebouwd. Eerst tevergeefs met blueprints geprobeert. Nu in NodeRed ben ik voor mijn gevoel dichtbij, maar hij doet het nog niet helemaal. Als beweging de trigger is, schakelt de verlichting niet automatisch aan en uit, en als dag/nacht de trigger is, lijkt de beweging het niet altijd te doen. Iemand tips?
:strip_exif()/f/image/XH7DmKTaK5RXi6Oj8Fbanali.jpg?f=fotoalbum_large)
Beweging heb je nu niet als trigger?Dr.156 schreef op zaterdag 25 februari 2023 @ 13:39:
Ik had in Domoticz een mooie routine voor mijn dimbare buitenverlichting met bewegingssensor: na zonsondergang aan op 30% (voor de sfeer), bij beweging even naar 100%. Na 22:00 uit, maar bij beweging wel weer op 100%, en overdag helemaal uit natuurlijk. Dit was de blocky die werkte:
[Afbeelding]
Eenmaal over op HomeAssitant krijg ik deze rotine niet meer nagebouwd. Eerst tevergeefs met blueprints geprobeert. Nu in NodeRed ben ik voor mijn gevoel dichtbij, maar hij doet het nog niet helemaal. Als beweging de trigger is, schakelt de verlichting niet automatisch aan en uit, en als dag/nacht de trigger is, lijkt de beweging het niet altijd te doen. Iemand tips?
[Afbeelding]
De big timer(gebruik ik zelf niet) is nu je trigger. Als deze wijzigt wordt er gecheckt of er beweging is.
Ik zou het opsplitsen.
1x om licht aan te zetten op 25%
1x licht uit
1x beweging, afhankelijk van tijd, kan gewoon met time range node de verlichting naar 100%
Kun je daar wat mee?
1
| [{"id":"f9baa6877a6cb5f7","type":"http request","z":"743a62898f598be4","name":"Get Devices","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://10.0.0.161:8443/enduser-mobile-web/1/enduserAPI/setup/devices","tls":"930fdadf3d5bf745","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"bearer","senderr":false,"headers":[],"x":330,"y":1080,"wires":[["8996eb27cc3798ba"]]},{"id":"c013bae9169e27b9","type":"inject","z":"743a62898f598be4","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"60","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":1080,"wires":[["f9baa6877a6cb5f7"]]},{"id":"8996eb27cc3798ba","type":"json","z":"743a62898f598be4","name":"","property":"payload","action":"","pretty":false,"x":550,"y":1080,"wires":[["d166203d735fae5f","1eaab033f68f4aeb"]]},{"id":"017a08c0a582c90c","type":"debug","z":"743a62898f598be4","name":"Debug zonnescherm Woonkamer","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1100,"y":1080,"wires":[]},{"id":"d166203d735fae5f","type":"function","z":"743a62898f598be4","name":"Functie Woonkamer","func":"var Lichtsensor = msg.payload[3].states[3].value;\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\nlet Check = Woonkamer_SP + 1;\n\nmsg.payload = { \"Licht\": Lichtsensor, \"PV\": Woonkamer_PV, \"SP\": Woonkamer_SP, \"Setpoint\": Setpoint };\n\nreturn msg;\n\n\n/*\nvar Lichtsensor = msg.payload[3].states[3].value ;\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Check = Zolder_SP + 1;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Check)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint }; //test\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'Check': Check }; //test\n}\n\nreturn [msg1, msg2, msg3];\n*/","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1080,"wires":[["017a08c0a582c90c"]]},{"id":"1eaab033f68f4aeb","type":"function","z":"743a62898f598be4","name":"Functie 2e Verdieping","func":"var Lichtsensor = msg.payload[3].states[3].value ;\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Check = Zolder_SP + 1;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Check)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint }; //test\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'Check': Check }; //test\n}\n\nreturn [msg1, msg2, msg3];\n\n//return [msg];\n\n\n/*\n\n\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Zolder_SP - 1)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n}\n\nreturn [msg1, msg2];\n*/","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":800,"y":1180,"wires":[["4e1831d42cf531af","2348cf9aa4611024"],["4e1831d42cf531af","2348cf9aa4611024"],["4e1831d42cf531af"]]},{"id":"4e1831d42cf531af","type":"debug","z":"743a62898f598be4","name":"Debug zonneschermen 2e verdieping","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1230,"y":1240,"wires":[]},{"id":"2348cf9aa4611024","type":"mqtt out","z":"743a62898f598be4","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1650,"y":1160,"wires":[]},{"id":"930fdadf3d5bf745","type":"tls-config","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false,"alpnprotocol":""},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
Variabelen zijn m.i. nog een beetje een rommeltje qua naamgeving.
En denk dat ik nog iets moet met een smooth node op de lichtsensor om op en neergaan van de schermen te voorkomen.
En ik zie eerlijk gezegd de Tahoma API call nog weleens stuk lopen op de autorisatie ook. Draak van een oplossing voor een lokale doos.

Zit te denken aan elke minuut pollen en dan een smooth node over vijf waardes.
Met HA heb je een aantal HA-specifieke Node Red nodes ter beschikking, en dan zou een (heel erg basic) flow er zo uit kunnen zien:
:strip_exif()/f/image/qUT147l1UzzST0a5qdCsphVA.jpg?f=fotoalbum_large)
Natuurlijk heb je in jouw geval wat specifieke dingen zoals de EvoHome en TaHoma communicatie, maar dat zou voor de basis-logica niet uit moeten maken.
Is het in jouw situatie mogelijk om de boel op te delen in elementaire bouwsteentjes, die elk afzonderlijk kunnen werken? Dus zoiets:
:strip_exif()/f/image/CCsfCxQ6hE6fTiHyTt2wpm2h.jpg?f=fotoalbum_large)
Ik weet overigens niet wat EvoHome_woonkamer_PV en EvoHome_woonkamer_SP precies betekenen. Is dat toevallig de actuele vs de ingestelde temperatuur in de woonkamer?
Feel free to Buy me a coffee
Ik wil juist de afhankelijkheid van domoticz verminderen door de APIs rechtstreeks aan te roepen. Das dus inderdaad een aparte evohome en een aparte tahoma api.
Daarnaast zijn het zes zonneschermen die op basis van vier kamertemperaturen en bijbehorend setpoint mogen werken
Feel free to Buy me a coffee
Vooral uitgaande mqtt berichten mis ik weleens wat. En de evohome api loopt achter in domoticz.musicpixel schreef op dinsdag 28 februari 2023 @ 12:44:
@MikeyMan Nu hou ik ook niet van teveel afhankelijkheden, maar wat is voor jou de reden dat je minder afhankelijkheid van domoticz wilt?
Heb daar nu meer controle over op deze manier.
Je kunt ook een hysterese inbouwen:MikeyMan schreef op dinsdag 28 februari 2023 @ 10:06:
En denk dat ik nog iets moet met een smooth node op de lichtsensor om op en neergaan van de schermen te voorkomen.
(..)
Zit te denken aan elke minuut pollen en dan een smooth node over vijf waardes.
Scherm omhoog bij (waarde < x), omlaag bij (waarde > (x + y))
Goeie! Kan ik idd wel doen.JW te R schreef op dinsdag 28 februari 2023 @ 19:33:
[...]
Je kunt ook een hysterese inbouwen:
Scherm omhoog bij (waarde < x), omlaag bij (waarde > (x + y))
Zal wel naast elkaar moeten denk ik. Je wilt niet bij elke wolk de schermen weer in hebben.
In principe stuur je natuurlijk vooral het moment van openen. En als het zomer is, zal alles als het goed is vooral op de lichtsensor lopen.
Denk vooral wat stoken te besparen zo, door meer gebruik te maken van de zon
[ Voor 24% gewijzigd door MikeyMan op 28-02-2023 20:08 ]
Ben er ff mee aan het stoeien, want kleine variaties rond het meetpunt leverden inderdaad wat heen en weer gedrag op.... Maar volgens mij gaat er in m'n logica nu iets niet helemaal goed...?
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
| var Lichtsensor = msg.payload; Lichtsensor = parseFloat(Lichtsensor.toFixed(0)); var Woonkamer_PV = global.get('EvoHome_woonkamer_PV', "file"); var Woonkamer_SP = global.get('EvoHome_woonkamer_SP', "file"); let Setpoint = global.get('Tahoma_setpoint', "file"); // parseFloat ('25000'); let DT = global.get('Woonkamer_dT', "file") let msg1 = {}; let msg2 = {}; let msg3 = {}; let msg4 = {}; let Switch = Woonkamer_SP + DT let OnOff = global.get('TahomaSwitch',"file"); //msg.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint }; if (Lichtsensor >= Setpoint && Woonkamer_PV >= (Switch) && OnOff == true) { msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "Off" }; //Off = Down msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "Off" }; //Off = Down msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg4.payload = Woonkamer_PV } else if (Lichtsensor >= Setpoint && Woonkamer_PV < (Switch-0.5) && OnOff == true) { msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "On" }; //On = Up msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "On" }; //On = Up msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg4.payload = Woonkamer_PV } else { msg1.payload = { "command": "switchlight", "idx": 492, "switchcmd": "On" }; //On = Up msg2.payload = { "command": "switchlight", "idx": 493, "switchcmd": "On" }; //On = Up msg3.payload = { "Licht": Lichtsensor, "PV": Woonkamer_PV, "SP": Woonkamer_SP, "Setpoint": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg4.payload = Woonkamer_PV } |
Moet ik nou een else verzinnen die buiten alle bovenstaande gevallen gaat? Was mijn eerste ingeving, maar heb het idee dat ik daar iets over het hoofd zie...?
Of toch nog een else if toevoegen die op de lichtsensor triggert?
[ Voor 5% gewijzigd door ThinkPad op 02-03-2023 16:54 . Reden: code=javascript voor extragratis kleurtjes!11 ]
Ik begrijp niet goed wat je probeert te bereiken. Wat wil je bijvoorbeeld doen als het donker is?
Ook zie ik niet hoe dit stukje Javascript in je flow past (ik heb even teruggekeken naar de flow die je een paar dagen geleden hebt gepost, maar ik denk dat die niet meer uptodate is).
Ik ga toch een poging wagen.
Die lichtsensor buiten beschouwing latend vermoed ik dat er nog iets niet goed gaat in je condities.
De eerste : (Woonkamer_PV >= (Switch)) moet m.i. zijn (Woonkamer_PV > (Switch))
De tweede if: (Woonkamer_PV < (Switch-0.5) moet m.i. zijn (Woonkamer_PV < Woonkamer_SP))
en in de laatste else tak moet je niks met het scherm doen. Dan zit je ongeveer op de gewenste temperatuur.
De DT moet denk ik groter zijn dan 0,5 graad, want de Honeywell node werkt niet nauwkeuriger dan 0,5 graad.
Om die reden gebruik ik zelf de Honeywell integratie van Home Assistant, waarvan ik de metingen via MQTT doorgeef naar Node-Red. Omslachtig, maar het werkt op 0,1 graad nauwkeurig.
En nog een tip: Als je vanaf een SD kaart werkt kun je de PV beter niet wegschrijven naar een file; houd die lekker in het geheugen. Zie de documentatie over context.
Werk overigens op een NAS, dus file is op zich prima. Voordeel van file is dat ie na een reboot ook door draai lijkt me?
Ah ja, wilde juist de lichtsensor gebruiken als trigger, niet de temperatuur. Daarom heb ik die opgeslagen.JW te R schreef op donderdag 2 maart 2023 @ 20:28:
PV is de meting van het moment. Die wordt per definitie elke keer opnieuw bepaald met een sensor. Het heeft dus geen zin om die op disk te zetten.
Had misschien inderdaad niet gehoeven.
Gezien de volatiliteit van zowel de temperatuurmetingen (die evohome meting is echt drama. Rondt af richting setpoint) als de lichtmeting heb ik hier nog een paar smooth nodes op gezet. Tis daarmee wel een beetje uit de hand gelopen
Voor evohome gebruik ik nu de volgende flow om de metingen los te trekken. En een smooth node om de volatiliteit een beetje te dempen. Had eerst een enkele smooth node achter de evohome node zitten, maar dat leverde hele rare waardes op. Schrijf inderdaad alles naar file weg, leek me makkelijker om zo elders op te pakken als global value. Maar misschien overbodig inderdaad.
/f/image/zRVBzd49lDD5xYbxWjkHzUSV.png?f=fotoalbum_large)
[ Voor 92% gewijzigd door MikeyMan op 03-03-2023 14:24 ]
/f/image/n6KYOlDOwuggBdOmvyUz6k4m.png?f=fotoalbum_large)
1
| [{"id":"c8d703f331c6071d","type":"group","z":"743a62898f598be4","name":"Zonneschermen","style":{"label":true},"nodes":["f9baa6877a6cb5f7","c013bae9169e27b9","8996eb27cc3798ba","017a08c0a582c90c","d166203d735fae5f","1eaab033f68f4aeb","4e1831d42cf531af","2348cf9aa4611024","f7ecd15f245f12af","ef617d8ce6930543","3ca391b0f4bd36e8","5be6961222360e34","04421a302892d6b4","600193ffafd5b981","2dc60a25e7b4e180","9602b1977e1bd875","980d0d0ec33fdb13","10505c1f6d64de38","9ebe33c37380e440","fa21d77d608d2e27","ecc7d7a1107b7fe1","d1bf2590bff5ebb0","1e3a6e1f00af0555","cd8247a5b99e3bba","1a1e75425d864eb2","e7d1685b76b30329","4984951f2f209c9a","1311622006974fd7","f98c7ce054f65983","a8e954352c582076","53f2ee23598af3bd","727ad394334376ae","02e40a2b349b97bb","1b7e179817b90ce8","5339a2cf2a892a70","12235a4e62659c4c","5a869be925c71afc","a544716e34b0934b","bff78000d0158a48","446e6035a22d2517","90914236891c77c7","095985e3aba8f8bd","07fd601fb49189ca","82ba4aae8b8369ea","c2c37f185ae8e4a4","566546da77f190ca","21d96ab435737c02","77a2a99ae11a396e","bd9766838d44804b","c53da0a8c39cac4d","f0a764cccac8b5b0","6c5e0442f3b81ca6","7a23dba3918351b7","2e3d397b960dfa16","cef03e389cc31311"],"x":14,"y":699,"w":2692,"h":962},{"id":"f9baa6877a6cb5f7","type":"http request","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Get Devices","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://10.0.0.161:8443/enduser-mobile-web/1/enduserAPI/setup/devices","tls":"930fdadf3d5bf745","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"bearer","senderr":false,"headers":[],"x":330,"y":1040,"wires":[["8996eb27cc3798ba","c2c37f185ae8e4a4"]]},{"id":"c013bae9169e27b9","type":"inject","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"180","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":1040,"wires":[["f9baa6877a6cb5f7"]]},{"id":"8996eb27cc3798ba","type":"json","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","property":"payload","action":"","pretty":false,"x":510,"y":1040,"wires":[["3ca391b0f4bd36e8"]]},{"id":"017a08c0a582c90c","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Woonkamer Domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2030,"y":740,"wires":[]},{"id":"d166203d735fae5f","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Functie Woonkamer","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Woonkamer_PV = global.get('EvoHome_woonkamer_PV', \"file\");\nvar Woonkamer_SP = global.get('EvoHome_woonkamer_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet DT = global.get('Woonkamer_dT', \"file\")\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\nlet msg4 = {};\nlet Switch = Woonkamer_SP + DT\nlet OnOff = global.get('TahomaSwitch',\"file\");\n\n//msg.payload = { \"Licht\": Lichtsensor, \"PV\": Woonkamer_PV, \"SP\": Woonkamer_SP, \"Setpoint\": Setpoint };\n\nif (Lichtsensor >= Setpoint && Woonkamer_PV >= (Switch) && OnOff == true) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 492, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 493, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Woonkamer_PV, \"SP\": Woonkamer_SP, \"Setpoint\": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg4.payload = Woonkamer_PV\n}\n\nelse if (Lichtsensor >= Setpoint && Woonkamer_PV < (Switch-0.5) && OnOff == true) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 492, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 493, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Woonkamer_PV, \"SP\": Woonkamer_SP, \"Setpoint\": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg4.payload = Woonkamer_PV\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 492, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 493, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Woonkamer_PV, \"SP\": Woonkamer_SP, \"Setpoint\": Setpoint, 'DT': DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg4.payload = Woonkamer_PV\n}\n\n\nreturn [msg1, msg2, msg3, msg4];\n\n\n\n//return msg;\n\n/*\nvar Lichtsensor = msg.payload[3].states[3].value;\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Check = Zolder_SP + 0.5;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Check)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint }; //test\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'Check': Check }; //test\n}\n\nreturn [msg1, msg2, msg3];\n*/","outputs":4,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":820,"wires":[["017a08c0a582c90c","2348cf9aa4611024"],["017a08c0a582c90c","2348cf9aa4611024"],["ef617d8ce6930543","12235a4e62659c4c"],["77a2a99ae11a396e"]]},{"id":"1eaab033f68f4aeb","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Functie 2e Verdieping","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Zolder_DT = global.get('Zolder_dT', \"file\")\nlet Switch = Zolder_SP + Zolder_DT;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\nlet msg4 = {};\nlet OnOff = global.get('TahomaSwitch', \"file\");\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Switch) && OnOff == true) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 497, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'DT': Zolder_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg4.payload = Zolder_PV;\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 497, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'DT': Zolder_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg4.payload = Zolder_PV;\n}\n\nreturn [msg1, msg2, msg3, msg4];\n\n//return [msg];\n\n\n/*\n\n\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Zolder_SP - 1)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 499, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n}\n\nreturn [msg1, msg2];\n*/","outputs":4,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1280,"y":1520,"wires":[["4e1831d42cf531af","2348cf9aa4611024"],["4e1831d42cf531af","2348cf9aa4611024"],["f7ecd15f245f12af","bff78000d0158a48"],["f0a764cccac8b5b0"]]},{"id":"4e1831d42cf531af","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonneschermen 2e verdieping domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2060,"y":1480,"wires":[]},{"id":"2348cf9aa4611024","type":"mqtt out","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":2150,"y":1120,"wires":[]},{"id":"f7ecd15f245f12af","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonneschermen 2e verdieping values","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2050,"y":1520,"wires":[]},{"id":"ef617d8ce6930543","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Woonkamer values","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2020,"y":780,"wires":[]},{"id":"3ca391b0f4bd36e8","type":"change","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[3].states[3].value","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":700,"y":1040,"wires":[["5be6961222360e34","04421a302892d6b4","5a869be925c71afc","90914236891c77c7"]]},{"id":"5be6961222360e34","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 140 raw measure","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":970,"y":1260,"wires":[]},{"id":"04421a302892d6b4","type":"smooth","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","property":"payload","action":"mean","count":"3","round":"0","mult":"single","reduce":false,"x":920,"y":1040,"wires":[["d166203d735fae5f","1eaab033f68f4aeb","600193ffafd5b981","2dc60a25e7b4e180","10505c1f6d64de38"]]},{"id":"600193ffafd5b981","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 141 smooth measure","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1280,"y":1040,"wires":[]},{"id":"2dc60a25e7b4e180","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Functie Slaapkamer","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Slaapkamer_PV = global.get('EvoHome_slaapkamer_PV', \"file\");\nvar Slaapkamer_SP = global.get('EvoHome_slaapkamer_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Slaapkamer_DT = global.get('Slaapkamer_dT', \"file\")\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\nlet Switch = Slaapkamer_SP + Slaapkamer_DT;\nlet OnOff = global.get('TahomaSwitch', \"file\");\n\n\n/*\nmsg.payload = { \"Licht\": Lichtsensor, \"PV\": Slaapkamer_PV, \"SP\": Slaapkamer_SP, \"Setpoint\": Setpoint };\nreturn msg;\n*/\n\nif (Lichtsensor >= Setpoint && Slaapkamer_PV >= (Switch) && OnOff == true) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 494, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"Licht\": Lichtsensor, \"PV\": Slaapkamer_PV, \"SP\": Slaapkamer_SP, \"Setpoint\": Setpoint, 'DT': Slaapkamer_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg3.payload = Slaapkamer_PV\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 494, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"Licht\": Lichtsensor, \"PV\": Slaapkamer_PV, \"SP\": Slaapkamer_SP, \"Setpoint\": Setpoint, 'DT': Slaapkamer_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg3.payload = Slaapkamer_PV\n}\n\nreturn [msg1, msg2, msg3];\n\n\n\n\n/*\nvar Lichtsensor = msg.payload[3].states[3].value;\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Check = Zolder_SP + 0.5;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Check)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint }; //test\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'Check': Check }; //test\n}\n\nreturn [msg1, msg2, msg3];\n*/","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":940,"wires":[["2348cf9aa4611024","9602b1977e1bd875"],["980d0d0ec33fdb13","a544716e34b0934b"],["21d96ab435737c02"]]},{"id":"9602b1977e1bd875","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Slaapkamer Domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2250,"y":900,"wires":[]},{"id":"980d0d0ec33fdb13","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Slaapkamer Values","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2240,"y":940,"wires":[]},{"id":"10505c1f6d64de38","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Functie Gym","func":"var Lichtsensor = msg.payload;\nLichtsensor = parseFloat(Lichtsensor.toFixed(0));\nvar Gym_PV = global.get('EvoHome_gym_PV', \"file\");\nvar Gym_SP = global.get('EvoHome_gym_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Gym_DT = global.get('Gym_dT', \"file\")\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\nlet Switch = Gym_SP + Gym_DT;\nlet OnOff = global.get('TahomaSwitch', \"file\");\n\n/*\nmsg.payload = { \"Licht\": Lichtsensor, \"PV\": Gym_PV, \"SP\": Gym_SP, \"Setpoint\": Setpoint };\nreturn msg;\n*/\n\nif (Lichtsensor >= Setpoint && Gym_PV >= (Switch) && OnOff == true) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 495, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"Licht\": Lichtsensor, \"PV\": Gym_PV, \"SP\": Gym_SP, \"Setpoint\": Setpoint, 'DT': Gym_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg3.payload = Gym_PV;\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 495, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"Licht\": Lichtsensor, \"PV\": Gym_PV, \"SP\": Gym_SP, \"Setpoint\": Setpoint, 'DT': Gym_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test\n msg3.payload = Gym_PV;\n}\n\nreturn [msg1, msg2, msg3];\n\n\n\n/*\nvar Lichtsensor = msg.payload[3].states[3].value;\nvar Zolder_PV = global.get('EvoHome_2everdieping_PV', \"file\");\nvar Zolder_SP = global.get('EvoHome_2everdieping_SP', \"file\");\nlet Setpoint = global.get('Tahoma_setpoint', \"file\"); // parseFloat ('25000');\nlet Check = Zolder_SP + 0.5;\nlet msg1 = {};\nlet msg2 = {};\nlet msg3 = {};\n\n//msg.payload = {\"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint};\n\nif (Lichtsensor >= Setpoint && Zolder_PV >= (Check)) {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"Off\" }; //Off = Down\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"Off\" }; //Off = Down\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint }; //test\n}\n\nelse {\n msg1.payload = { \"command\": \"switchlight\", \"idx\": 496, \"switchcmd\": \"On\" }; //On = Up\n msg2.payload = { \"command\": \"switchlight\", \"idx\": 500, \"switchcmd\": \"On\" }; //On = Up\n msg3.payload = { \"Licht\": Lichtsensor, \"PV\": Zolder_PV, \"SP\": Zolder_SP, \"Setpoint\": Setpoint, 'Check': Check }; //test\n}\n\nreturn [msg1, msg2, msg3];\n*/","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1250,"y":1300,"wires":[["2348cf9aa4611024","9ebe33c37380e440"],["fa21d77d608d2e27","446e6035a22d2517"],["c53da0a8c39cac4d"]]},{"id":"9ebe33c37380e440","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Gym Domoticz","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2190,"y":1240,"wires":[]},{"id":"fa21d77d608d2e27","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Debug zonnescherm Gym Values","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2180,"y":1280,"wires":[]},{"id":"ecc7d7a1107b7fe1","type":"ui_numeric","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"Lux Schakeling","tooltip":"","group":"11b8876a7b7e5539","order":2,"width":0,"height":0,"wrap":true,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":"100000","step":"1000","className":"","x":140,"y":1320,"wires":[["1e3a6e1f00af0555"]]},{"id":"d1bf2590bff5ebb0","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 144","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":1320,"wires":[]},{"id":"1e3a6e1f00af0555","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Lux switch","func":"let Setpoint = {};\n\nSetpoint = msg.payload;\n{\nglobal.set('Tahoma_setpoint', Setpoint, \"file\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":1320,"wires":[["d1bf2590bff5ebb0"]]},{"id":"cd8247a5b99e3bba","type":"ui_numeric","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"dT Woonkamer","tooltip":"","group":"11b8876a7b7e5539","order":3,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":"2","step":"0.1","className":"","x":140,"y":1380,"wires":[["1a1e75425d864eb2"]]},{"id":"1a1e75425d864eb2","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function dT Woonkamer","func":"let DT = {};\n\nDT = msg.payload;\n{\nglobal.set('Woonkamer_dT', DT, \"file\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":1380,"wires":[["f98c7ce054f65983"]]},{"id":"e7d1685b76b30329","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function dT Slaapkamer","func":"let DT = {};\n\nDT = msg.payload;\n{\n global.set('Slaapkamer_dT', DT, \"file\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":1440,"wires":[["a8e954352c582076"]]},{"id":"4984951f2f209c9a","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function dT Gym","func":"let DT = {};\n\nDT = msg.payload;\n{\n global.set('Gym_dT', DT, \"file\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1500,"wires":[["53f2ee23598af3bd"]]},{"id":"1311622006974fd7","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function 2e Verdieping","func":"let DT = {};\n\nDT = msg.payload;\n{\n global.set('Zolder_dT', DT, \"file\");\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":1560,"wires":[["727ad394334376ae"]]},{"id":"f98c7ce054f65983","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 145","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":1380,"wires":[]},{"id":"a8e954352c582076","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 146","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":1440,"wires":[]},{"id":"53f2ee23598af3bd","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 147","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":1500,"wires":[]},{"id":"727ad394334376ae","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 148","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":650,"y":1560,"wires":[]},{"id":"02e40a2b349b97bb","type":"ui_numeric","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"dT Slaapkamer","tooltip":"","group":"11b8876a7b7e5539","order":4,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":"2","step":"0.1","className":"","x":140,"y":1440,"wires":[["e7d1685b76b30329"]]},{"id":"1b7e179817b90ce8","type":"ui_numeric","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"dT Gym","tooltip":"","group":"11b8876a7b7e5539","order":5,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":"2","step":"0.1","className":"","x":120,"y":1500,"wires":[["4984951f2f209c9a"]]},{"id":"5339a2cf2a892a70","type":"ui_numeric","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"dT 2e Verdieping","tooltip":"","group":"11b8876a7b7e5539","order":6,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":"2","step":"0.1","className":"","x":150,"y":1560,"wires":[["1311622006974fd7"]]},{"id":"12235a4e62659c4c","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":3,"width":0,"height":0,"name":"","label":"Woonkamer","format":"{{msg.payload}}","layout":"row-spread","className":"","x":1930,"y":820,"wires":[]},{"id":"5a869be925c71afc","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":2,"width":0,"height":0,"name":"","label":"Lichtsensor","format":"{{msg.payload}}","layout":"row-spread","className":"","x":950,"y":880,"wires":[]},{"id":"a544716e34b0934b","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":4,"width":0,"height":0,"name":"","label":"Slaapkamer","format":"{{msg.payload}}","layout":"row-spread","className":"","x":2150,"y":980,"wires":[]},{"id":"bff78000d0158a48","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":6,"width":0,"height":0,"name":"","label":"2e Verdieping","format":"{{msg.payload}}","layout":"row-spread","className":"","x":1960,"y":1560,"wires":[]},{"id":"446e6035a22d2517","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":5,"width":0,"height":0,"name":"","label":"Gym","format":"{{msg.payload}}","layout":"row-spread","className":"","x":2090,"y":1320,"wires":[]},{"id":"90914236891c77c7","type":"ui_chart","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","group":"85e909c93386b7a6","order":0,"width":"14","height":"10","label":"Lichtsterkte","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"0","ymax":"100000","removeOlder":"8","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":950,"y":800,"wires":[[]]},{"id":"095985e3aba8f8bd","type":"ui_switch","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","label":"Aan/uit","tooltip":"","group":"11b8876a7b7e5539","order":1,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":120,"y":1260,"wires":[["82ba4aae8b8369ea"]]},{"id":"07fd601fb49189ca","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 150","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":650,"y":1260,"wires":[]},{"id":"82ba4aae8b8369ea","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Functie aan/uit","func":"var FunctionSwitch = {};\n\nFunctionSwitch = msg.payload\nglobal.set('TahomaSwitch',FunctionSwitch, \"file\");\n\nreturn [msg]\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1260,"wires":[["07fd601fb49189ca"]]},{"id":"c2c37f185ae8e4a4","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 151","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":530,"y":920,"wires":[]},{"id":"566546da77f190ca","type":"ui_chart","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","group":"85e909c93386b7a6","order":1,"width":"14","height":"10","label":"Woonkamer PV","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":true,"ymin":"10","ymax":"30","removeOlder":"24","removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":2420,"y":1060,"wires":[["bd9766838d44804b"]]},{"id":"21d96ab435737c02","type":"change","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_Slaapkamer","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2150,"y":1020,"wires":[["566546da77f190ca"]]},{"id":"77a2a99ae11a396e","type":"change","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_Woonkamer","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1930,"y":860,"wires":[["566546da77f190ca"]]},{"id":"bd9766838d44804b","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 155","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":2590,"y":1060,"wires":[]},{"id":"c53da0a8c39cac4d","type":"change","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_Gym","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":2110,"y":1360,"wires":[["566546da77f190ca"]]},{"id":"f0a764cccac8b5b0","type":"change","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"PV_2eVerdieping","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":1950,"y":1600,"wires":[["566546da77f190ca"]]},{"id":"6c5e0442f3b81ca6","type":"inject","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1620,"wires":[["7a23dba3918351b7"]]},{"id":"7a23dba3918351b7","type":"http request","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"API Version","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://10.0.0.161:8443/enduser-mobile-web/1/enduserAPI/apiVersion","tls":"930fdadf3d5bf745","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"bearer","senderr":false,"headers":[],"x":350,"y":1620,"wires":[["2e3d397b960dfa16"]]},{"id":"2e3d397b960dfa16","type":"json","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"","property":"payload","action":"","pretty":false,"x":570,"y":1620,"wires":[["cef03e389cc31311"]]},{"id":"cef03e389cc31311","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 136","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":770,"y":1620,"wires":[]},{"id":"930fdadf3d5bf745","type":"tls-config","name":"","cert":"","key":"","ca":"","certname":"","keyname":"","caname":"","servername":"","verifyservercert":false,"alpnprotocol":""},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"11b8876a7b7e5539","type":"ui_group","name":"Input","tab":"21daaeaaf5421973","order":1,"disp":true,"width":"12","collapse":false,"className":""},{"id":"cdd6bc3a70d5012e","type":"ui_group","name":"Waardes","tab":"21daaeaaf5421973","order":2,"disp":true,"width":"16","collapse":false,"className":""},{"id":"85e909c93386b7a6","type":"ui_group","name":"Chart","tab":"21daaeaaf5421973","order":3,"disp":true,"width":"28","collapse":false,"className":""},{"id":"21daaeaaf5421973","type":"ui_tab","name":"Zonneschermen","icon":"wi-wu-mostlysunny","order":14,"disabled":false,"hidden":false}] |
Ook hier dus een smoth node op de output van de lichtsensor, die ik rechtstreeks met de API ophaal.
Variabelen uit de eerder gepostte code:
Lichtsensor = meting vanuit de lichtsendor
Setpoint = ingesteld aantal lux waarbij de schermen open moeten
PV = gemeten temperatuur evohome per kamer. Begreep van @edterbak dat dat een gebruikelijke term is voor proces value
SP = ingestelde setpoint per kamer
DT = Waarde bovenop setpoint
Switch = SP + DT. Dus stel; het setpoint voor de slaapkamer is 19 graden, DT = 1, dan gaan de schermen open bij 20 graden.
OnOff = schakelaar die ik op het dash heb gezet om de functie aan of uit te kunnen zetten. Moet nog aan de slag om ze bij 'off' eenmalig allemaal in te klappen.
Dan de logica. Ik beoog:
- Als de gemeten lichtwaarde hoger is dan ingestelde lichtwaarde, en de temperatuur in de kamer hoger is dan het schakelpunt, dan schermen open.
- Als de gemeten lichtwaarde hoger is dan de ingestelde waarde en de kamertemperatuur daalt tot onder het SP, dan schermen dicht
- Als de gemeten lichtwaarde onder setpoint komt, dan ook schermen dicht.
Of die laatste goed met de 'else' wordt afgevangen is vraag twee.
Wil het sowieso nog enigszins om gooien zodat ik op het dashboard ook de stand van de schermen terug kan zien.
[ Voor 3% gewijzigd door MikeyMan op 03-03-2023 09:27 ]
Die dacht ik eerst afgevangen te hebben door een enkele if/else. Dat werkte op zich goed, alleen ging het geheel nogal vaak open en dicht.JW te R schreef op donderdag 2 maart 2023 @ 20:17:
@MikeyMan Ik ben bang dat ik je hiermee niet echt kan helpen.
Ik begrijp niet goed wat je probeert te bereiken. Wat wil je bijvoorbeeld doen als het donker is?
Ook zie ik niet hoe dit stukje Javascript in je flow past (ik heb even teruggekeken naar de flow die je een paar dagen geleden hebt gepost, maar ik denk dat die niet meer uptodate is).
Daarom ben ik nu aan het prutsen met een if, else if, else. Om een marge in te bouwen tussen open gaan en dicht gaan.
Das een keuze, maar inderdaad, wellicht handiger. Gaan we doen.Ik ga toch een poging wagen.
Die lichtsensor buiten beschouwing latend vermoed ik dat er nog iets niet goed gaat in je condities.
De eerste : (Woonkamer_PV >= (Switch)) moet m.i. zijn (Woonkamer_PV > (Switch))
Ik wilde juist die instelbare switch waarde gebruiken, zodat er nog iets in te stellen valt.De tweede if: (Woonkamer_PV < (Switch-0.5) moet m.i. zijn (Woonkamer_PV < Woonkamer_SP))
Heb ff een dashboardje geknutseld:
/f/image/a8IAU9hlbw9nnGG7yNOXpRIp.png?f=fotoalbum_large)
Heb daar nu inderdaad niks ingesteld, maar daar zit eigenlijk mijn grootste vraagteken. Dekt die laatste else de lading?en in de laatste else tak moet je niks met het scherm doen. Dan zit je ongeveer op de gewenste temperatuur.
Met smooth node op laatste drie waardes lijkt dat nu redelijk ok te gaan, maar dat moeten we even uitproberen.De DT moet denk ik groter zijn dan 0,5 graad, want de Honeywell node werkt niet nauwkeuriger dan 0,5 graad.
Ja, ik zou de waarde ook op kunnen pakken vanuit domoticz. Das zelfs op 0,01 graden nauwkeurig. En rondt dan ook niet af richting setpoint. Maar afhankelijk van de oude API (V1) en geeft geregeld foutmeldingen. Wilde juist rechtstreeks gebruik maken van de API. Maargoed, als dat niet naar wens werkt is dat zo omgezetOm die reden gebruik ik zelf de Honeywell integratie van Home Assistant, waarvan ik de metingen via MQTT doorgeef naar Node-Red. Omslachtig, maar het werkt op 0,1 graad nauwkeurig.
Al met al; was het een heel leertraject. Eerste keer dat ik uberhaupt iets werkend heb gekregen. Dus cut me some slack
Klopt. Vandaar mijn keuze om die niet door Node-Red te laten uitlezen.MikeyMan schreef op vrijdag 3 maart 2023 @ 09:01:
die evohome meting is echt drama. Rondt af richting setpoint
Het gaat er m.i. juist om dat je een DT instelt waarbinnen niks gebeurt. Nu is dat bereik altijd een halve graad.
[...]
Ik wilde juist die instelbare switch waarde gebruiken, zodat er nog iets in te stellen valt.
Refactoring is hier het toverwoord. En dat is eenvoudiger met een werkend systeem.De aansturing van de zonneschermen is nog harder uit de klauwen geescaleerd
Doen we, en gefeliciteerd!Al met al was het een heel leertraject. Eerste keer dat ik uberhaupt iets werkend heb gekregen. Dus cut me some slack
Wat betreft de beoogde werking: scherm open vanaf een bepaalde temperatuur kan in de zomer interessant worden ...
Hoe bedoel je dat? Gemiddeld genomen zal het er dan op neer komen dat ie volledig op de lichtsensor loopt, aangezien het dan altijd warm genoeg is.JW te R schreef op vrijdag 3 maart 2023 @ 19:21:
[...]
Wat betreft de beoogde werking: scherm open vanaf een bepaalde temperatuur kan in de zomer interessant worden ...
Maar goed, ik heb me er niet vergaand in verdiept, omdat ik niet alle dependencies van jouw flow geinstalleerd heb op mijn Node-Red systeem.
[ Voor 10% gewijzigd door JW te R op 06-03-2023 16:56 ]
Ah zo... Nouja, punt is dat het in de zomer natuurlijk binnen niet ver genoeg afkoelt om dat een factor te laten zijn... Verwacht dat ie dan alleen op het licht reageert.JW te R schreef op maandag 6 maart 2023 @ 16:51:
Voor zover ik je flow begrijp doe je bij voldoende licht het scherm open als het warmer wordt, en dicht als het kouder wordt, en ik kan me voorstellen dat je dat niet wilt op warme dagen.
Maar goed, ik heb me er niet vergaand in verdiept, omdat ik niet alle dependencies van jouw flow geinstalleerd heb op mijn Node-Red systeem.
Maargoed, in dat kader had ik vandeweek nog wel wat last van wind. Appeltje eitje zou je zeggen, ff wind meenemen in de schakeling... Maar begin nu een beetje in de war te raken.
Mijn gedachte, in tekst uitgeschreven:
Als:
Lichtsensor boven ingestelde waarde is
temperatuur boven ingestelde waarde is
wind lager is dan ingestelde waarde
stuur dan MQTT bericht voor scherm dicht
Anders als:
Lichtsensor boven ingestelde waarde is
Temperatuur beneden ingestelde waarde -1 is
stuur dan MQTT bericht voor scherm open
Anders
stuur MQTT bericht voor scherm dicht
Maar ik vraag me af of deze logica nu klopt zo.
Tweede als op -1 gezet ter voorkoming van open dicht gedrag, hoewel je dat niet helemaal voorkomt.
Ziet er dan zo uit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| if (Lichtsensor > Setpoint && Gym_PV > (Switch) && OnOff == true && Wind_PV < Wind_SP) { msg1.payload = { "command": "switchlight", "idx": 495, "switchcmd": "Off" }; //Off = Down msg2.payload = "Temp: " + Gym_PV + " - Switch@:" + Switchdec + " - Status: Neer" + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP; //msg2.payload = { "Licht": Lichtsensor, "PV": Gym_PV, "SP": Gym_SP, "Setpoint": Setpoint, 'DT': Gym_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg3.payload = Gym_PV; } else if (Lichtsensor > Setpoint && Gym_PV < (Switch-1) && OnOff == true) { msg1.payload = { "command": "switchlight", "idx": 495, "switchcmd": "On" }; //Off = Down msg2.payload = "Temp: " + Gym_PV + " - Switch@:" + Switchdec + " - Status: Op (1)" + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP; //msg2.payload = { "Licht": Lichtsensor, "PV": Gym_PV, "SP": Gym_SP, "Setpoint": Setpoint, 'DT': Gym_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg3.payload = Gym_PV; } else { msg1.payload = { "command": "switchlight", "idx": 495, "switchcmd": "On" }; //On = Up msg2.payload = "Temp: " + Gym_PV + " - Switch@:" + Switchdec + " - Status: Op (2)" + " - Wind_PV:" + Wind_PV + " Wind_SP:" + Wind_SP; //msg2.payload = { "Licht": Lichtsensor, "PV": Gym_PV, "SP": Gym_SP, "Setpoint": Setpoint, 'DT': Gym_DT, 'Switch@': Switch, 'OnOff': OnOff }; //test msg3.payload = Gym_PV; } return [msg1, msg2, msg3]; |
Ben druk aan het testen, maar heb het idee dat er iets niet helemaal goed gaat.
https://community.homey.a...tructuring-of-flows/65348
met deze flow:

Dit is een beetje hoe ik ook een Node Red flow voor me zie. Triggers links (7 stuks in het voorbeeld), en rechts daarvan condities gevolgd door acties, allemaal eenvoudig leesbaar en niet verstopt in javascript (al kom je daar soms niet omheen).
Misschien helpt dit om er op een andere manier naar te kijken en een oplossing te vinden voor je probleem.
Als je het trouwens voor 1 kamer/scherm werkend hebt, dan kun je dat natuurlijk vrij eenvoudig op de rest van de schermen ook toepassen.
Feel free to Buy me a coffee
Ik denk dat de enige uitdaging is om (bijvoorbeeld) bij een binnentemperatuur van >21 open te gaan en bij <20 weer in.
Overigens weet ik maar van twee schermen zeker of ze open of dicht zijn. De andere vier zijn helaas nog RTS schermen.
Ha, dat hoort bij het leerproces.Houdt wel in helemaal opnieuw beginnen. Zou toch met een if, then else wel moeten lukken.
En ik denk dat je het te ingewikkeld maakt..
Je werkt met verschillende grootheden, die je verschillend wilt wegen.
'scherm open omdat het hard waait' is belangrijker dan 'scherm dicht omdat het koud is'.
Dus de eerste vergelijking is 'if wind > x then scherm omhoog'. Licht en temperatuur hebben daar weinig mee te maken, en in je overige vergelijkingen kun je de wind negeren.
Nog nooit van RTS schermen gehoord dus daarmee kan ik je niet helpen.De andere vier zijn helaas nog RTS schermen.
<20 = 19,9 of lagerMikeyMan schreef op vrijdag 17 maart 2023 @ 13:54:
@musicpixel ja das ook nog een optie. Andere logica. Houdt wel in helemaal opnieuw beginnen. Zou toch met een if, then else wel moeten lukken.
Ik denk dat de enige uitdaging is om (bijvoorbeeld) bij een binnentemperatuur van >21 open te gaan en bij <20 weer in.
Overigens weet ik maar van twee schermen zeker of ze open of dicht zijn. De andere vier zijn helaas nog RTS schermen.
>21 = 21,1 of hoger
Dus van 20 tot 21 doet de automation niks denk ik zo
doel = temperatuur binnen laag te houden en dat is bv 18 graden of lager als ik het vluchtig lees ..
doe met het volgende wat je wilt .. het is bedoelt als "food for thought"
"actie tijd" / moment lijst
- ik wil niet dat hij elke 5 minuten open/dicht gaat, prettig is bv elk "uur"
- ik wil niet dat hij kapot waait door harde wind --> ruk wind of constante wind ?
- als de verwarming (binnen) aanstaat
--- ook als de verwarming uitstaat en binnen warmer is dan 18?
- als de sensor in de zon hangt (jou wens temp = niet de temp die de sensor meet) om de buiten temp te meten.
- als de zon schijnt (sluit je begin van de ochtend uit)
- wil je buiten zitten ? met druilerig weer beschermd door het doek ? of even uit de "Zachte" wind
- je hebt ook half open/helemaal open waar wind condities meer/minder invloed hebben
kortom een lijst met condities die we als mens "normaal" vinden maar de computer niet kan weten..
bv als ik savonds buiten zit en er is zachte wind vind ik het wel eens lekker om het zonnescherm open te laten.. tot 23:00 (zon is allang onder) .. dan moet niet een automation ingrijpen om dicht te doen. tenzij het te hard gaat waaien.
Dus een "user override" die alleen door ruk/harde wind overruled mag worden, maar 01:00 is het echt welletjes bv dan ga jezoiezo dicht.
ik kan met mijn RTL_433 windmeter(s) van buren ontvangen .. erg handig als input kan ook op lora dongels
Als je daarna een "som" kan maken waar opgestelde condities True/False zijn een actie gebeurt maak je het veel makkelijker in NR erna. los van de "overrulende" condities
probeer te progammeren met een negatieve (in dit geval is dat "gesloten") toestand als eind resultaat.
- ga dicht bij A B C
dan hoef je alleen te openen (apart) wanneer het te warm word .. want de negatieve overschrijven toch wel ..
Tja vanalles
Eerste if voor de situatie waarin er iets open moet. In alle andere gevallen dicht. Maar misschien valt het inderdaad nog wel een beetje uit elkaar te trekken.
[ Voor 23% gewijzigd door MikeyMan op 17-03-2023 15:32 ]
MikeyMan schreef op vrijdag 17 maart 2023 @ 15:31:
@vso dank, moet het even op me in laten werken. Volgens mij komt de huidige functie daar nu ook ongeveer op neer.
Eerste if voor de situatie waarin er iets open moet. In alle andere gevallen dicht. Maar misschien valt het inderdaad nog wel een beetje uit elkaar te trekken.
je hoeft niet uit elkaar te trekken, teminste houd alles "open" en "dicht" gegroepeerd.. en duidelijk over 3 maanden of een jaar dan ga je heel blij zijn met duidelijke flow en naamgevingen .. (en dus ook condities)
Tja vanalles
/f/image/4tzaZaIMKbSg2JraU9tzGDCR.png?f=fotoalbum_large)
Dit is toch wel echt volledig NodeRed vraag => verplaatst
[ Voor 6% gewijzigd door Septillion op 20-03-2023 12:41 ]
Ik heb een Unifi G4 deurbel en wil deze bij aanbellen een notificatie laten sturen naar Slack. Het onderstaande stappenplan heb ik gevolgd, echter is 'node-red-contrib-slack-WebHook' niet meer beschikbaar. Is er iemand die mij verder op weg kan helpen?
Wat heb ik al gedaan:
- Geprobeerd een connectie te maken met Unifi in node-red
- De webhook URL van Slack heb ik al, dit werkt als ik een curl uitvoer in terminal
/f/image/K3V9tRsd15xfvK2qJh99jABa.png?f=fotoalbum_large)
@Ruupjeh als je het nu apart doet in 2 flow(s) 1 flow voor de deurbel en 1 voor slack
De deurbel moet x doen (handstand / berichtje oid) als er aangebeld word, als dat werkt is die flow "compleet"
voor slack wil je via een druk op een knop dat er een bericht op een plek in slack verschijnt, dat kan via CLI of API van slack er zijn vele wegen naar Rome.
daarna combineer je de flow's
het opdelen, maakt debuggen makkelijker (wat werkt er wel/niet) betreft slack is het vaak een
http://<weburl>/?=<commando-string+ tekst+ zooi> dat je moet sturen als je de opbouw weet kan je die nabouwen met NR
[ Voor 19% gewijzigd door vso op 21-03-2023 10:56 ]
Tja vanalles
Liefste in een nieuwe flow zodat het lekker overzichtelijk blijft.
Ik zal de situatie beschrijven.
Ik heb een flow die de verlichting schakelt, dit gebeurd op basis van alarmsysteem/lichtsensor/wel of niet thuis.
Werkt als een zonnetje moet ik zeggen.
Nou is het zo dat in het trapgat een led strip hangt die bijvoorbeeld aangaat op 2% lichtsterkte.
Nu heb ik in het trapgat ook een bewegingssensor, die moet de led strip naar 10% brengen als je daar loopt.
Niet zo heel moeilijk om dit te maken, maar..... Nou zoek ik dus een soort functie die de vorige stand van die led stip nog weet. Oftewel was hij aan op 2% dan moet na beweging de stip weer op 2%, was hij uit dan moet hij weer uit na beweging.
Bestaat deze functie?
Gebruik je home assistant? Ik gebruik scene's on the fly.etienne001 schreef op woensdag 22 maart 2023 @ 21:41:
Ik zit mijzelf wellicht helemaal suf te piekeren hoe ik een flow moet maken cq moet aanpassen...
Liefste in een nieuwe flow zodat het lekker overzichtelijk blijft.
Ik zal de situatie beschrijven.
Ik heb een flow die de verlichting schakelt, dit gebeurd op basis van alarmsysteem/lichtsensor/wel of niet thuis.
Werkt als een zonnetje moet ik zeggen.
Nou is het zo dat in het trapgat een led strip hangt die bijvoorbeeld aangaat op 2% lichtsterkte.
Nu heb ik in het trapgat ook een bewegingssensor, die moet de led strip naar 10% brengen als je daar loopt.
Niet zo heel moeilijk om dit te maken, maar..... Nou zoek ik dus een soort functie die de vorige stand van die led stip nog weet. Oftewel was hij aan op 2% dan moet na beweging de stip weer op 2%, was hij uit dan moet hij weer uit na beweging.
Bestaat deze functie?
Bij het schakelen met de bewegingssensor de huidige waarde opslaan in een variabele en na beweging die variable gebruiken voor de ledstrip.etienne001 schreef op woensdag 22 maart 2023 @ 21:41:
Ik zit mijzelf wellicht helemaal suf te piekeren hoe ik een flow moet maken cq moet aanpassen...
Liefste in een nieuwe flow zodat het lekker overzichtelijk blijft.
Ik zal de situatie beschrijven.
Ik heb een flow die de verlichting schakelt, dit gebeurd op basis van alarmsysteem/lichtsensor/wel of niet thuis.
Werkt als een zonnetje moet ik zeggen.
Nou is het zo dat in het trapgat een led strip hangt die bijvoorbeeld aangaat op 2% lichtsterkte.
Nu heb ik in het trapgat ook een bewegingssensor, die moet de led strip naar 10% brengen als je daar loopt.
Niet zo heel moeilijk om dit te maken, maar..... Nou zoek ik dus een soort functie die de vorige stand van die led stip nog weet. Oftewel was hij aan op 2% dan moet na beweging de stip weer op 2%, was hij uit dan moet hij weer uit na beweging.
Bestaat deze functie?
is er ook zoiets voor node-red zonder veel gedoe ?
Ben er inmiddels uit. Met een call service > notify

[ Voor 16% gewijzigd door OcGuru op 25-03-2023 14:43 ]
Bl44t
(Let op! Ik ben een Node Red beginner!)
Ik probeer vanuit Node Red een van mijn Dahua "text overlays" te updaten met wat gegevens.
Tot nu doe ik dit buiten Node Red om via een gron job die steeds een curl commando uitvoert.
Het curl commando ziet er zo uit:
1
| "curl -u " + camUser + ":" + camPassword + " --anyauth -g http://10.0.0.9/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].Text=" + webcamString |
De webcamString bevat in dit geval de "text overlays" die ik wil updaten.
Iemand hier die misschien weet hoe ik dit werkende kan krijgen in Node Red?
In basis kun je gebruik maken van een inject node in combinatie met http request node.N0EL schreef op zondag 2 april 2023 @ 11:21:
Hoop dat iemand mij hier "wat" kan helpen?
(Let op! Ik ben een Node Red beginner!)
Ik probeer vanuit Node Red een van mijn Dahua "text overlays" te updaten met wat gegevens.
Tot nu doe ik dit buiten Node Red om via een gron job die steeds een curl commando uitvoert.
Het curl commando ziet er zo uit:
code:
1 "curl -u " + camUser + ":" + camPassword + " --anyauth -g http://10.0.0.9/cgi-bin/configManager.cgi?action=setConfig&VideoWidget[0].CustomTitle[1].Text=" + webcamString
De webcamString bevat in dit geval de "text overlays" die ik wil updaten.
Iemand hier die misschien weet hoe ik dit werkende kan krijgen in Node Red?
Bij de inject node kun je (onderin) configureren wanneer deze uitgevoerd moet worden. Bij de http request node configureer je de URL en username/password.
Ik heb een probleem met mijn ventilatie van het toilet en de badkamer.
Beiden maken gebruik van dezelfde ventilator.
gewenste situatie :
het licht in het toilet wordt aan gedaan, de ventilatie gaat aan.
het licht in het toilet wordt uit gedaan, de ventilatie draait 10 min na en gaat dan uit.
het licht in de badkamer wordt aan gedaan, de ventilatie gaat aan.
het licht in de badkamer wordt uit gedaan , de ventilatie draait 30 min na en gaat dan uit.
nu de problemen,
als men naar het toilet gaat en daarna ( dus binnen de 10 min ) naar de badkamer dan zal de ventilatie uit gaan na 10 min, dit is niet gewenst immers zou bij licht uit badkamer de ventilatie 30 min moeten na draaien.
evenals men in de badkamer is en tussentijd gaat er iemand naar het toilet gaat ook de ventilatie uit na 10 min, ook niet gewenst moet ja 30 min zijn.
hoe los ik dit op in Node-Red ?
groetjes Adriaan.
Een flowvariabele maken waarin de gewenste eindtijd van de ventilator komt te staan en deze steeds updaten als het licht wordt uitgedaan, dus:
Licht toilet uit -> nieuwe eindtijd = nu + 10 min, maar alleen als dat later is dan huidige eindtijd
Licht badkamer uit -> nieuwe eindtijd = nu + 30 min, maar alleen als dat later is dan huidige eindtijd
Elke x seconden -> nu >= gewenste eindtijd EN licht toilet+badkamer is uit, dan ventilator uit
Misschien mis ik nog iets, maar denk dat je hier wel mee verder kunt...
Zat ook nog te denken aan iets met trigger of delay node, en dan deze steeds updaten met een nieuwe msg.delay, maar heb zo'n vermoeden dat dat lastiger is.
[ Voor 21% gewijzigd door musicpixel op 02-04-2023 18:38 ]
Feel free to Buy me a coffee
Ik zou middels een flow variable de eindtijd van de ventilator bijhouden en via een inject node elke minuut controleren of de ventilator uitgezet moet worden.Carfreak schreef op zondag 2 april 2023 @ 15:59:
Dag Allemaal.
Ik heb een probleem met mijn ventilatie van het toilet en de badkamer.
Beiden maken gebruik van dezelfde ventilator.
gewenste situatie :
het licht in het toilet wordt aan gedaan, de ventilatie gaat aan.
het licht in het toilet wordt uit gedaan, de ventilatie draait 10 min na en gaat dan uit.
het licht in de badkamer wordt aan gedaan, de ventilatie gaat aan.
het licht in de badkamer wordt uit gedaan , de ventilatie draait 30 min na en gaat dan uit.
nu de problemen,
als men naar het toilet gaat en daarna ( dus binnen de 10 min ) naar de badkamer dan zal de ventilatie uit gaan na 10 min, dit is niet gewenst immers zou bij licht uit badkamer de ventilatie 30 min moeten na draaien.
evenals men in de badkamer is en tussentijd gaat er iemand naar het toilet gaat ook de ventilatie uit na 10 min, ook niet gewenst moet ja 30 min zijn.
hoe los ik dit op in Node-Red ?
groetjes Adriaan.
Pseudo:
- Bij de toilet routine zet je de eindtijd (flow variable) op huidige tijd + 10 minuten indien de huidige eindtijd (flow variable) niet in de toekomst ligt.
- Bij de badkamer flow zet je de eindtijd (flow variable) op huidige tijd + 30 minuten.
- Controleer elke minuut of de eindtijd (flow variable) is bereikt. Indien eindtijd < huidige tijd, schakel ventilator uit.
Use case: ik wil savonds gedimd licht hebben in badkamer en slaapkamer. De blockly zorgt er binnen bepaalde tijdsbepalingen voor dat het licht vanzelf dimt. Dat heb ik op zich nu ook voor elkaar in NodeRed. Maar waar ik het bij de blockly voor elkaar heb dat er manueel nog ingegrepen kan worden op de dimstand, blijft node red de ingestelde waarde pushen.
In de blockly is dat opgelost met de extra test op variabele. Heb al gepoogd dat met een global value te doen in node red, maar no luck. Iemand nog een idee?
de flow:
1
| [{"id":"3f0733d9e7c0a67a","type":"mqtt in","z":"02452070554fbb83","name":"Badkamerschakelaar","topic":"domoticz/out/Badkamerverlichting","qos":"0","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":220,"y":400,"wires":[["2d2e7afc4af8897d","5272983106a7b896"]]},{"id":"2d2e7afc4af8897d","type":"debug","z":"02452070554fbb83","name":"debug 166","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":470,"y":620,"wires":[]},{"id":"3b089794ed4331ab","type":"debug","z":"02452070554fbb83","name":"debug 167","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1030,"y":400,"wires":[]},{"id":"6a5a5f41ae81870f","type":"mqtt out","z":"02452070554fbb83","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1030,"y":360,"wires":[]},{"id":"31e7c26d76914180","type":"inject","z":"02452070554fbb83","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":540,"wires":[["5272983106a7b896"]]},{"id":"5272983106a7b896","type":"function","z":"02452070554fbb83","name":"function 21","func":"if (msg.payload.nvalue === 2) {\n var Sunrise = new Date(global.get('Sunrise', \"file\"));\n var Sunset = new Date(global.get('Sunset', \"file\"));\n\n var currentLevel = msg.payload.level;\n// var currentLevel = global.get('currentLevel', \"file\");\n \n var dimLevel;\n var dimLevelNight = 10;\n var dimLevelDay = 60;\n var dimLevelDusk = 30;\n var dimPeriod = 20;\n var now = new Date();\n \n\n var beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000));\n var afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000));\n\n var daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000));\n var daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000));\n\n if ((now >= afterSunset || now < beforeSunrise) && currentLevel !== dimLevelNight) {\n dimLevel = dimLevelNight;\n msg.payload.timeframe = 'Night';\n\n } else if ((now >= daytimeStart && now <= daytimeEnd) && currentLevel !== dimLevelDay) {\n dimLevel = dimLevelDay;\n msg.payload.timeframe = 'Day';\n\n } else if (currentLevel !== dimLevelDusk) {\n dimLevel = dimLevelDusk;\n msg.payload.timeframe = 'Dusk';\n }\n \n// global.set('currentLevel', dimLevel, 'file');\n\n msg.payload = {\n \"command\": \"switchlight\",\n \"idx\": 555,\n \"switchcmd\": \"Set Level\",\n \"level\": dimLevel\n };\n}\n\nreturn msg;\n\n\n\n/*\n\n\n\n// check if dimLevel has already been set\nvar dimLevelSet = global.get('dimLevelSet', 'file');\nvar nvalue = msg.payload.nvalue;\n\nif (!dimLevelSet && nvalue == 2) {\n var prev_nvalue = global.get('prev_nvalue', 'file');\n\n if (prev_nvalue == 0) {\n // set initial dimLevel based on time of day\n var dimLevel;\n var dimPeriod = 20;\n var now = new Date();\n\n var Sunrise = new Date(global.get('Sunrise', 'file'));\n var Sunset = new Date(global.get('Sunset', 'file'));\n\n var beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000));\n var afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000));\n\n var daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000));\n var daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000));\n\n if (now >= afterSunset || now < beforeSunrise) {\n dimLevel = 15;\n msg.payload.timeframe = 'Night';\n } else if (now >= daytimeStart && now <= daytimeEnd) {\n dimLevel = 100;\n msg.payload.timeframe = 'Daytime';\n } else {\n dimLevel = 30;\n msg.payload.timeframe = 'Dimmed';\n }\n\n // set dimLevel and mark as set\n msg.payload = {\n \"command\": \"switchlight\",\n \"idx\": 555,\n \"switchcmd\": \"Set Level\",\n \"level\": dimLevel\n };\n\n global.set('dimLevelSet', true, 'file');\n } else {\n msg.payload = null;\n }\n\n global.set('prev_nvalue', nvalue, 'file');\n} else {\n global.set('prev_nvalue', nvalue, 'file');\n msg.payload = null;\n}\n\n*/","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":400,"wires":[["3b089794ed4331ab","6a5a5f41ae81870f"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
en de blockly:
1
| <xml xmlns="http://www.w3.org/1999/xhtml"><block type="domoticzcontrols_ifelseif" id="K[A3{1J?)@7QT]$4bjOO" x="-1186" y="-1556"><mutation elseif="3"></mutation><value name="IF0"><block type="logic_operation" id="D?^*1LzG]T;wH7nfsP`*"><field name="OP">AND</field><value name="A"><block type="logic_operation" id="WpM7vpUzRj?p(otr1*O2"><field name="OP">OR</field><value name="A"><block type="logic_timeofday" id="Zw6dVEx+0MQ-di9m0Vkq"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="zDgJA||?@a`gLeek6@r1"><field name="TEXT">08:30</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="+M/l$LQE-/)nM6HU9V[="><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="HUqLa;WOH;TOdU]2vO|G"><field name="TEXT">20:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="b%A{l^`T*2x([R1oO-`|"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="jIacq9vo-:S77.jGMqz4"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="wq:N/AZa/0hk5Ig0hLgS"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="ok|Mw]BD;`jz2TL^W!nj"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="%W4sEf=oEp~l:!AyL`W4"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="?Ngv6GOm?[@EX%[3!|)k"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="pV(,xF7i76$:0S2_`(}9"><field name="NUM">12</field></block></value></block></value></block></value></block></value><statement name="DO0"><block type="logic_set" id="R;1%xWkv];TMse5^b/0$"><value name="A"><block type="switchvariablesAF" id="qqjo^n7[}[-`=giL[Hyu"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="XMGhkg3P**fl_4K=HX-^"><field name="NUM">12</field></block></value><next><block type="logic_set" id=";casN7s3+%YIuSwDY}H,"><value name="A"><block type="uservariablesAF" id="~,Qxha$Aa[{;Ae/w6aC,"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="TjQ[q4[9`$e.:5Rj2]Xd"><field name="NUM">12</field></block></value><next><block type="writetolog" id="Qf0.2M+u~ssbQr-T2`p0"><value name="writeToLog"><block type="text" id="-=U$U~(JlG#@gS8#_jKO"><field name="TEXT">Badkamer Blockly set level low</field></block></value></block></next></block></next></block></statement><value name="IF1"><block type="logic_operation" id="sT^;A!e=;/m:=:30IFHi"><field name="OP">AND</field><value name="A"><block type="logic_operation" id=".HE`X+%Mk5fB$RddUz`0"><field name="OP">AND</field><value name="A"><block type="logic_timeofday" id="MaD+!v~t%HDsfhHt.R5l"><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="/4ep=0Zvl`We15S{D9kf"><field name="TEXT">17:00</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="JB?vG`R]qY,(Yu-668.e"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="Jlv^4JOM@S9e;Mpe-`u["><field name="TEXT">20:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="cFp;`:f4vb;EVZCe1Kh+"><field name="OP">AND</field><value name="A"><block type="logic_compare" id=":#$Y=~GAiYD6j!742ZQz"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="VTV6cPJ_x(,limM=2U.a"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="/[HD9qTO31R:KbmmNfS3"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="7~u{$wgRPGZ%d:,:S^@n"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="`KiZG+epoPqp*/;K-wWA"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="Bh`9#!r3H.uK]q*)F}^a"><field name="NUM">40</field></block></value></block></value></block></value></block></value><statement name="DO1"><block type="logic_set" id="(]pa_ByZML0,|E3jz379"><value name="A"><block type="switchvariablesAF" id="9DE(8iQfqd?1Pi%060{u"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="?-(~WfxqkTm~l,g^oq=|"><field name="NUM">40</field></block></value><next><block type="logic_set" id="3:qa1sXFNop;9l$6%-[4"><value name="A"><block type="uservariablesAF" id="UFKuhMWwgKp5i88A]ojW"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="kLPiEJXmwW;8lsn=Ledl"><field name="NUM">40</field></block></value><next><block type="writetolog" id="hTN|6A~6Ko1X19rz=Mi2"><value name="writeToLog"><block type="text" id="UAI.mK/9?%?hLbE.Lu54"><field name="TEXT">Badkamer Blockly set level mid</field></block></value></block></next></block></next></block></statement><value name="IF2"><block type="logic_operation" id="9;v5By,qD_qK=8K6zQvV"><field name="OP">AND</field><value name="A"><block type="logic_operation" id="~yLZsW|M1CiIq7(y{OTS"><field name="OP">AND</field><value name="A"><block type="logic_timeofday" id="Oxn8qZ9)HsUo2Lt9A*kR"><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="0b;+;V8|WS[#`Z*h(V~F"><field name="TEXT">08:30</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="qKo]]G|GI|QdDpwg*VRZ"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="]h~aw{bbg%I!M}a:OBt["><field name="TEXT">17:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="5|H[/eM7y|i*4zG|wU=e"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="Al!2Ct8jGV+0F(|x/Mz_"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="+;F_4!bIXJF;);BKXH;Z"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="VgyJ$|Oe?.IY../dGhSW"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="ftb}TMX|_|N?[Hy#!1sj"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="UNXku](DN=ZW/~Cw2D1i"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="*^uk!Y-^@)Q]`5:jkhMr"><field name="NUM">75</field></block></value></block></value></block></value></block></value><statement name="DO2"><block type="logic_set" id="W%_~k)DX+!V+tIg0:XjH"><value name="A"><block type="switchvariablesAF" id="y!sAANR;gLWoXng(cV7$"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="(C|[aNRzMMBO!huHEw]G"><field name="NUM">75</field></block></value><next><block type="logic_set" id="WKvjU5(k@Nt(jW.32:ui"><value name="A"><block type="uservariablesAF" id="IPNo@Jf|Wr]7(/P94Ceg"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id=",eeK_f1@2V+mZKX/$nS5"><field name="NUM">75</field></block></value><next><block type="writetolog" id="v+kvq0f~]M0RVPegkC{B"><value name="writeToLog"><block type="text" id="[UU?x`irz3e3a@AeSX0_"><field name="TEXT">Badkamer Blockly set level high</field></block></value></block></next></block></next></block></statement><value name="IF3"><block type="logic_compare" id="L92-A`%+P/pyZmiT|b{]"><field name="OP">EQ</field><value name="A"><block type="switchvariablesAF" id="rjb.|w]r!+_=MOrFDe$T"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="k*Mhs73S}9H4A@7V3b@e"><field name="State">Off</field></block></value></block></value><statement name="DO3"><block type="logic_set" id="Ar~KaHq@]]oY(;0chjdl"><value name="A"><block type="uservariablesAF" id="rbHde16E~gMPsUujzZws"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="G@-T`,7QA`1,VT*8Fw^M"><field name="NUM">0</field></block></value><next><block type="writetolog" id="j.Hgs7SG)v@/d6UUZ7^:"><value name="writeToLog"><block type="text" id="cK7:*aS5q_2+A]w[PnP|"><field name="TEXT">Badkamer Blockly set level off</field></block></value></block></next></block></statement></block></xml> |
/f/image/Og6bSgJyuQTl5kqw55OJxEgH.png?f=fotoalbum_large)
[ Voor 60% gewijzigd door MikeyMan op 05-04-2023 09:51 ]
Ik heb een flow met Unifi, function en http request.
:fill(white):strip_exif()/f/image/psh2rl90R4DsKFTQ5oMh2qes.png?f=user_large)
Unifi is geconnect aan het IP + Port nummer van de G4 deurbel. Ik twijfel of dit correct is, moet deze gekoppeld worden aan de Unifi OS console bijvoorbeeld? Als ik de flow deploy, dan werkt deze wel.
:fill(white):strip_exif()/f/image/XQBawrkBRDUswKUgitXzubRz.png?f=user_large)
De function:
:fill(white):strip_exif()/f/image/24gS3TUOq1UcGjrxMCholGT9.png?f=user_large)
De HTTP Request voert een curl uit, deze werkt als ik hem direct uitvoer in terminal:
/f/image/VaeXDbC8Z4xSq4rnFUewtUqw.png?f=fotoalbum_large)
Is er iemand die wellicht wil meedenken hierin? Heb het idee dat we er bijna zijn..
Hoewel ik geen domoticz/blockly gebruik, wil ik best een poging wagen. Alleen zijn me een paar dingen, waaronder je use case, nog niet helemaal duidelijk:MikeyMan schreef op woensdag 5 april 2023 @ 09:39:
Dacht even een blockly om te zetten naar Node red flow. Dat ging iets minder vanzelfsprekend.
Use case: ik wil savonds gedimd licht hebben in badkamer en slaapkamer. De blockly zorgt er binnen bepaalde tijdsbepalingen voor dat het licht vanzelf dimt. Dat heb ik op zich nu ook voor elkaar in NodeRed. Maar waar ik het bij de blockly voor elkaar heb dat er manueel nog ingegrepen kan worden op de dimstand, blijft node red de ingestelde waarde pushen.
In de blockly is dat opgelost met de extra test op variabele. Heb al gepoogd dat met een global value te doen in node red, maar no luck. Iemand nog een idee?
de flow:
code:
1 [{"id":"3f0733d9e7c0a67a","type":"mqtt in","z":"02452070554fbb83","name":"Badkamerschakelaar","topic":"domoticz/out/Badkamerverlichting","qos":"0","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":220,"y":400,"wires":[["2d2e7afc4af8897d","5272983106a7b896"]]},{"id":"2d2e7afc4af8897d","type":"debug","z":"02452070554fbb83","name":"debug 166","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":470,"y":620,"wires":[]},{"id":"3b089794ed4331ab","type":"debug","z":"02452070554fbb83","name":"debug 167","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1030,"y":400,"wires":[]},{"id":"6a5a5f41ae81870f","type":"mqtt out","z":"02452070554fbb83","name":"","topic":"domoticz/in","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":1030,"y":360,"wires":[]},{"id":"31e7c26d76914180","type":"inject","z":"02452070554fbb83","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":540,"wires":[["5272983106a7b896"]]},{"id":"5272983106a7b896","type":"function","z":"02452070554fbb83","name":"function 21","func":"if (msg.payload.nvalue === 2) {\n var Sunrise = new Date(global.get('Sunrise', \"file\"));\n var Sunset = new Date(global.get('Sunset', \"file\"));\n\n var currentLevel = msg.payload.level;\n// var currentLevel = global.get('currentLevel', \"file\");\n \n var dimLevel;\n var dimLevelNight = 10;\n var dimLevelDay = 60;\n var dimLevelDusk = 30;\n var dimPeriod = 20;\n var now = new Date();\n \n\n var beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000));\n var afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000));\n\n var daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000));\n var daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000));\n\n if ((now >= afterSunset || now < beforeSunrise) && currentLevel !== dimLevelNight) {\n dimLevel = dimLevelNight;\n msg.payload.timeframe = 'Night';\n\n } else if ((now >= daytimeStart && now <= daytimeEnd) && currentLevel !== dimLevelDay) {\n dimLevel = dimLevelDay;\n msg.payload.timeframe = 'Day';\n\n } else if (currentLevel !== dimLevelDusk) {\n dimLevel = dimLevelDusk;\n msg.payload.timeframe = 'Dusk';\n }\n \n// global.set('currentLevel', dimLevel, 'file');\n\n msg.payload = {\n \"command\": \"switchlight\",\n \"idx\": 555,\n \"switchcmd\": \"Set Level\",\n \"level\": dimLevel\n };\n}\n\nreturn msg;\n\n\n\n/*\n\n\n\n// check if dimLevel has already been set\nvar dimLevelSet = global.get('dimLevelSet', 'file');\nvar nvalue = msg.payload.nvalue;\n\nif (!dimLevelSet && nvalue == 2) {\n var prev_nvalue = global.get('prev_nvalue', 'file');\n\n if (prev_nvalue == 0) {\n // set initial dimLevel based on time of day\n var dimLevel;\n var dimPeriod = 20;\n var now = new Date();\n\n var Sunrise = new Date(global.get('Sunrise', 'file'));\n var Sunset = new Date(global.get('Sunset', 'file'));\n\n var beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000));\n var afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000));\n\n var daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000));\n var daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000));\n\n if (now >= afterSunset || now < beforeSunrise) {\n dimLevel = 15;\n msg.payload.timeframe = 'Night';\n } else if (now >= daytimeStart && now <= daytimeEnd) {\n dimLevel = 100;\n msg.payload.timeframe = 'Daytime';\n } else {\n dimLevel = 30;\n msg.payload.timeframe = 'Dimmed';\n }\n\n // set dimLevel and mark as set\n msg.payload = {\n \"command\": \"switchlight\",\n \"idx\": 555,\n \"switchcmd\": \"Set Level\",\n \"level\": dimLevel\n };\n\n global.set('dimLevelSet', true, 'file');\n } else {\n msg.payload = null;\n }\n\n global.set('prev_nvalue', nvalue, 'file');\n} else {\n global.set('prev_nvalue', nvalue, 'file');\n msg.payload = null;\n}\n\n*/","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":400,"wires":[["3b089794ed4331ab","6a5a5f41ae81870f"]]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]
en de blockly:
code:
1 <xml xmlns="http://www.w3.org/1999/xhtml"><block type="domoticzcontrols_ifelseif" id="K[A3{1J?)@7QT]$4bjOO" x="-1186" y="-1556"><mutation elseif="3"></mutation><value name="IF0"><block type="logic_operation" id="D?^*1LzG]T;wH7nfsP`*"><field name="OP">AND</field><value name="A"><block type="logic_operation" id="WpM7vpUzRj?p(otr1*O2"><field name="OP">OR</field><value name="A"><block type="logic_timeofday" id="Zw6dVEx+0MQ-di9m0Vkq"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="zDgJA||?@a`gLeek6@r1"><field name="TEXT">08:30</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="+M/l$LQE-/)nM6HU9V[="><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="HUqLa;WOH;TOdU]2vO|G"><field name="TEXT">20:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="b%A{l^`T*2x([R1oO-`|"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="jIacq9vo-:S77.jGMqz4"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="wq:N/AZa/0hk5Ig0hLgS"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="ok|Mw]BD;`jz2TL^W!nj"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="%W4sEf=oEp~l:!AyL`W4"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="?Ngv6GOm?[@EX%[3!|)k"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="pV(,xF7i76$:0S2_`(}9"><field name="NUM">12</field></block></value></block></value></block></value></block></value><statement name="DO0"><block type="logic_set" id="R;1%xWkv];TMse5^b/0$"><value name="A"><block type="switchvariablesAF" id="qqjo^n7[}[-`=giL[Hyu"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="XMGhkg3P**fl_4K=HX-^"><field name="NUM">12</field></block></value><next><block type="logic_set" id=";casN7s3+%YIuSwDY}H,"><value name="A"><block type="uservariablesAF" id="~,Qxha$Aa[{;Ae/w6aC,"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="TjQ[q4[9`$e.:5Rj2]Xd"><field name="NUM">12</field></block></value><next><block type="writetolog" id="Qf0.2M+u~ssbQr-T2`p0"><value name="writeToLog"><block type="text" id="-=U$U~(JlG#@gS8#_jKO"><field name="TEXT">Badkamer Blockly set level low</field></block></value></block></next></block></next></block></statement><value name="IF1"><block type="logic_operation" id="sT^;A!e=;/m:=:30IFHi"><field name="OP">AND</field><value name="A"><block type="logic_operation" id=".HE`X+%Mk5fB$RddUz`0"><field name="OP">AND</field><value name="A"><block type="logic_timeofday" id="MaD+!v~t%HDsfhHt.R5l"><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="/4ep=0Zvl`We15S{D9kf"><field name="TEXT">17:00</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="JB?vG`R]qY,(Yu-668.e"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="Jlv^4JOM@S9e;Mpe-`u["><field name="TEXT">20:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="cFp;`:f4vb;EVZCe1Kh+"><field name="OP">AND</field><value name="A"><block type="logic_compare" id=":#$Y=~GAiYD6j!742ZQz"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="VTV6cPJ_x(,limM=2U.a"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="/[HD9qTO31R:KbmmNfS3"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="7~u{$wgRPGZ%d:,:S^@n"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="`KiZG+epoPqp*/;K-wWA"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="Bh`9#!r3H.uK]q*)F}^a"><field name="NUM">40</field></block></value></block></value></block></value></block></value><statement name="DO1"><block type="logic_set" id="(]pa_ByZML0,|E3jz379"><value name="A"><block type="switchvariablesAF" id="9DE(8iQfqd?1Pi%060{u"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="?-(~WfxqkTm~l,g^oq=|"><field name="NUM">40</field></block></value><next><block type="logic_set" id="3:qa1sXFNop;9l$6%-[4"><value name="A"><block type="uservariablesAF" id="UFKuhMWwgKp5i88A]ojW"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="kLPiEJXmwW;8lsn=Ledl"><field name="NUM">40</field></block></value><next><block type="writetolog" id="hTN|6A~6Ko1X19rz=Mi2"><value name="writeToLog"><block type="text" id="UAI.mK/9?%?hLbE.Lu54"><field name="TEXT">Badkamer Blockly set level mid</field></block></value></block></next></block></next></block></statement><value name="IF2"><block type="logic_operation" id="9;v5By,qD_qK=8K6zQvV"><field name="OP">AND</field><value name="A"><block type="logic_operation" id="~yLZsW|M1CiIq7(y{OTS"><field name="OP">AND</field><value name="A"><block type="logic_timeofday" id="Oxn8qZ9)HsUo2Lt9A*kR"><field name="OP">GTE</field><value name="Time"><block type="logic_timevalue" id="0b;+;V8|WS[#`Z*h(V~F"><field name="TEXT">08:30</field></block></value></block></value><value name="B"><block type="logic_timeofday" id="qKo]]G|GI|QdDpwg*VRZ"><field name="OP">LT</field><value name="Time"><block type="logic_timevalue" id="]h~aw{bbg%I!M}a:OBt["><field name="TEXT">17:00</field></block></value></block></value></block></value><value name="B"><block type="logic_operation" id="5|H[/eM7y|i*4zG|wU=e"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="Al!2Ct8jGV+0F(|x/Mz_"><field name="OP">NEQ</field><value name="A"><block type="switchvariablesAF" id="+;F_4!bIXJF;);BKXH;Z"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="VgyJ$|Oe?.IY../dGhSW"><field name="State">Off</field></block></value></block></value><value name="B"><block type="logic_compare" id="ftb}TMX|_|N?[Hy#!1sj"><field name="OP">NEQ</field><value name="A"><block type="uservariablesAF" id="UNXku](DN=ZW/~Cw2D1i"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="*^uk!Y-^@)Q]`5:jkhMr"><field name="NUM">75</field></block></value></block></value></block></value></block></value><statement name="DO2"><block type="logic_set" id="W%_~k)DX+!V+tIg0:XjH"><value name="A"><block type="switchvariablesAF" id="y!sAANR;gLWoXng(cV7$"><field name="Switch">211</field></block></value><value name="B"><block type="logic_setlevel" id="(C|[aNRzMMBO!huHEw]G"><field name="NUM">75</field></block></value><next><block type="logic_set" id="WKvjU5(k@Nt(jW.32:ui"><value name="A"><block type="uservariablesAF" id="IPNo@Jf|Wr]7(/P94Ceg"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id=",eeK_f1@2V+mZKX/$nS5"><field name="NUM">75</field></block></value><next><block type="writetolog" id="v+kvq0f~]M0RVPegkC{B"><value name="writeToLog"><block type="text" id="[UU?x`irz3e3a@AeSX0_"><field name="TEXT">Badkamer Blockly set level high</field></block></value></block></next></block></next></block></statement><value name="IF3"><block type="logic_compare" id="L92-A`%+P/pyZmiT|b{]"><field name="OP">EQ</field><value name="A"><block type="switchvariablesAF" id="rjb.|w]r!+_=MOrFDe$T"><field name="Switch">211</field></block></value><value name="B"><block type="logic_states" id="k*Mhs73S}9H4A@7V3b@e"><field name="State">Off</field></block></value></block></value><statement name="DO3"><block type="logic_set" id="Ar~KaHq@]]oY(;0chjdl"><value name="A"><block type="uservariablesAF" id="rbHde16E~gMPsUujzZws"><field name="Variable">8</field></block></value><value name="B"><block type="math_number" id="G@-T`,7QA`1,VT*8Fw^M"><field name="NUM">0</field></block></value><next><block type="writetolog" id="j.Hgs7SG)v@/d6UUZ7^:"><value name="writeToLog"><block type="text" id="cK7:*aS5q_2+A]w[PnP|"><field name="TEXT">Badkamer Blockly set level off</field></block></value></block></next></block></statement></block></xml>
[Afbeelding]
Zoals ik het tot nu begrijp:
Als je met de badkamerschakelaar het licht aan doet, dan moet het licht automatisch op de juiste dimstand aan gaan, gebaseerd op tijdstip van de dag. Dit tijdstip wordt bepaald door zonsopgang/-ondergang met een periode ervoor/na.
Na zonsondergang + periode = nacht, tot zonsopgang - periode
Tussen zonsopgang en zonsondergang = dag
En de 2 genoemde periodes voor zonsopgang en na zonsopgang = dusk?
Wat ik niet weet is:
Hoe je het dimlevel handmatig override, is dat met de schakelaar? of op een andere manier?
Moet het licht ook dimmen als dit al aan is op het moment dat sunrise/sunset bereikt wordt?
Wat voor gegevens komen er van de "Badkamerschakelaar" node binnen? Dus inhoud van debug 166.
Waar komen je sunrise en sunset vandaan? Ik zie dat ze uit een global komen, maar hoe worden die gezet? Dit is namelijk functionaliteit waar ook gewoon een node-red node voor is.
Kun je een poging doen om puur functioneel te beschrijven wat het moet doen? Dus: ik druk op knop x en dan moet het licht aan gaan op stand y.... etc.
Feel free to Buy me a coffee
Ik zou zelf ook nog kijken dat je een foto meestuurt, kun je gelijk zien wie er bij de deur staat
En ik zou nog een 'delay' node ertussen zetten (direct na het UniFi blokje bijv.) die je dan bij action instelt op 'rate limit' (1 msg/minuut) en 'drop intermediate messages'. Dan wordt je niet platgespamd als de bel zou blijven hangen of als er vervelende kinderen belletje lellen.
[ Voor 27% gewijzigd door ThinkPad op 06-04-2023 11:06 ]
Het werkt helaas dus nog niet, terwijl ik denk dat alles nu goed staat ingesteld. Had gehoopt dat hier misschien iemand aanwezig was die Unifi aan Node-Red had gekoppeld.ThinkPad schreef op donderdag 6 april 2023 @ 11:04:
@Ruupjeh Wat is nu precies je vraag, gezien je aangeeft dat het werkt?
Ik zou zelf ook nog kijken dat je een foto meestuurt, kun je gelijk zien wie er bij de deur staatIk doe dat door bij het triggeren van de deurbel een foto op te slaan van de IP-cam en deze als bijlage in het pushbericht (ik gebruik Pushover) mee te sturen. En ik heb nog een presence check (telefoons op wifi check via UniFi controller) erin zitten naar wie het bericht moet (normaal alleen naar diegene(n) die thuis is, anders naar ons beiden).
En ik zou nog een 'delay' node ertussen zetten (direct na het UniFi blokje bijv.) die je dan bij action instelt op 'rate limit' (1 msg/minuut) en 'drop intermediate messages'. Dan wordt je niet platgespamd als de bel zou blijven hangen of als er vervelende kinderen belletje lellen.
- Koppel de UniFi trigger eens los van je Slack-actie
- Hang aan het UniFi blokje een debug node en kijk of je daar de gewenste data binnenkrijgt als je de bel indrukt
- Zet een 'inject' node aan de Slack request en trigger hem handmatig > Krijg je bericht binnen?
Dan kun je vanuit daar verder werken en bijv. je payload omvormen indien nodig.
Dit stuk werkt -zijn het wellicht wat omslachtig- nu wel. Heb drie perioden gedefinieerd: Dag, nacht en schemer. Met drie verschillende dimwaardes. Had makkelijker gekund met twee perioden, maar als we toch bezig zijnmusicpixel schreef op donderdag 6 april 2023 @ 11:02:
[...]
Hoewel ik geen domoticz/blockly gebruik, wil ik best een poging wagen. Alleen zijn me een paar dingen, waaronder je use case, nog niet helemaal duidelijk:
Zoals ik het tot nu begrijp:
Als je met de badkamerschakelaar het licht aan doet, dan moet het licht automatisch op de juiste dimstand aan gaan, gebaseerd op tijdstip van de dag. Dit tijdstip wordt bepaald door zonsopgang/-ondergang met een periode ervoor/na.
Na zonsondergang + periode = nacht, tot zonsopgang - periode
Tussen zonsopgang en zonsondergang = dag
En de 2 genoemde periodes voor zonsopgang en na zonsopgang = dusk?
Ja, dit gaat handmatig via de schakelaar. Tis een pulsdrukker op een zwave dimmer. Wat ik vooral niet begrijp is; waarom gaat het met de blockly wel goed, en met de NodeRed flow niet.Wat ik niet weet is:
Hoe je het dimlevel handmatig override, is dat met de schakelaar? of op een andere manier?
Mag, moet niet. Denk wel netjes, maar das van later zorg.Moet het licht ook dimmen als dit al aan is op het moment dat sunrise/sunset bereikt wordt?
ben nu niet thuis, maar zal zsm die output ff posten.Wat voor gegevens komen er van de "Badkamerschakelaar" node binnen? Dus inhoud van debug 166.
Waar komen je sunrise en sunset vandaan? Ik zie dat ze uit een global komen, maar hoe worden die gezet? Dit is namelijk functionaliteit waar ook gewoon een node-red node voor is.
Heb nu sunset en sunrise vanuit OpenWeatherMaps API gepusht. Ook dat lijkt goed te gaan.
Zal eens kijken of dat direct uit node red te halen is. Misschien netter.
Ja, heel plat: overdag veel licht, in schemer iets minder licht en snachts weinig licht bij inschakelen verlichting.Kun je een poging doen om puur functioneel te beschrijven wat het moet doen? Dus: ik druk op knop x en dan moet het licht aan gaan op stand y.... etc.
De use case die daar bovenop komt is dat je 'snachts ook weleens wat extra licht nodig hebt, en dat lukte voorheen, met de extra variabele door de knop ingedrukt te houden. Als ik dat nu doe, schiet ie weer terug naar de waarde voor nacht.
Twee constateringen die er misschien mee te maken hebben:
- Ik zie niet direct verschil tussen inschakelen en dimlevel verhogen vanuit de schakelaar komen.
- Domoticz lijkt twee MQTT berichten te verzenden bij elke actie.
Als ik dit zo lees, dan is mijn eerste ingeving dat bericht 1 de "press" is en bericht 2 de "release", oftewel indrukken en loslaten. De tijd daartussen bepaalt dan of het indrukken of vasthouden is.Twee constateringen die er misschien mee te maken hebben:
- Ik zie niet direct verschil tussen inschakelen en dimlevel verhogen vanuit de schakelaar komen.
- Domoticz lijkt twee MQTT berichten te verzenden bij elke actie.
Er zijn schakelaars die deze vertaling intern al doen, en zo niet, kan het nog zo zijn dat domoticz of een "driver" dit doet. En anders moet je het dus zelf doen ;-)
Ben benieuwd naar de outputs van het eerste en tweede bericht.
Feel free to Buy me a coffee
Oh, daar had ik inderaad niet aan gedacht. Zal ik eens proberen.musicpixel schreef op donderdag 6 april 2023 @ 12:14:
@MikeyMan
[...]
Als ik dit zo lees, dan is mijn eerste ingeving dat bericht 1 de "press" is en bericht 2 de "release", oftewel indrukken en loslaten. De tijd daartussen bepaalt dan of het indrukken of vasthouden is.
Er zijn schakelaars die deze vertaling intern al doen, en zo niet, kan het nog zo zijn dat domoticz of een "driver" dit doet. En anders moet je het dus zelf doen ;-)
Ben benieuwd naar de outputs van het eerste en tweede bericht.
Kan inderdaad wel zo zijn dat dit voorheen anders afgehandeld werd. Ben namelijk ook van OpenZwave naar ZwaveJS gegaan.
Maar das makkelijk te testen door hem wat langer ingedrukt te houden. Zie hetzelfde gedrag overigens als ik de knop in domoticz indruk. Maar dat hoeft nog niets te zeggen.
In ieder geval een aanknopingspunt
edit: heb ze nog gevonden van gisteren:
bij uitschakelen bericht 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| { "Battery" : 255, "LastUpdate" : "2023-04-05 08:59:25", "Level" : 0, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "hwid" : "39", "id" : "zwavejs2mqtt_0xc928871b_7-38-1-currentValue", "idx" : 504, "name" : "Eettafel", "nvalue" : 0, "stype" : "Switch", "svalue1" : "0", "switchType" : "Dimmer", "unit" : 1 } |
bericht 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| { "Battery" : 255, "LastUpdate" : "2023-04-05 08:59:25", "Level" : 30, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "hwid" : "39", "id" : "zwavejs2mqtt_0xc928871b_7-38-1-currentValue", "idx" : 504, "name" : "Eettafel", "nvalue" : 0, "stype" : "Switch", "svalue1" : "0", "switchType" : "Dimmer", "unit" : 1 } |
Bij inschakelen bericht 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| { "Battery" : 255, "LastUpdate" : "2023-04-05 09:02:14", "Level" : 30, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "hwid" : "39", "id" : "zwavejs2mqtt_0xc928871b_7-38-1-currentValue", "idx" : 504, "name" : "Eettafel", "nvalue" : 2, "stype" : "Switch", "svalue1" : "30", "switchType" : "Dimmer", "unit" : 1 } |
bericht 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| { "Battery" : 255, "LastUpdate" : "2023-04-05 09:02:14", "Level" : 30, "RSSI" : 12, "description" : "", "dtype" : "Light/Switch", "hwid" : "39", "id" : "zwavejs2mqtt_0xc928871b_7-38-1-currentValue", "idx" : 504, "name" : "Eettafel", "nvalue" : 2, "stype" : "Switch", "svalue1" : "30", "switchType" : "Dimmer", "unit" : 1 } |
Wat ik me nu overigens ook bedenk... Ik gebruik nu de input vanuit domoticz...
Misschien beter de ZwaveJS output gebruiken. Zou verschil in kunnen zitten.
[ Voor 47% gewijzigd door MikeyMan op 06-04-2023 12:45 ]
De laatste 2 berichten zijn zelfs exact gelijk.
Het lijkt er op dat het de status voor en na het indrukken van de schakelaar is.
Ben benieuwd of de ZwaveJS een andere output laat zien.
Hoe zie je in domoticz eigenlijk het verschil tussen indrukken en vasthouden?
Feel free to Buy me a coffee
Niet volgens mij. Ingedrukt houden gaat de dimmer lopen. Maar dat wordt afgehandeld door de dimmer zelf.musicpixel schreef op donderdag 6 april 2023 @ 13:17:
@MikeyMan Hmmm veel verschil zit er niet in, alleen Level en nvalue.
De laatste 2 berichten zijn zelfs exact gelijk.
Het lijkt er op dat het de status voor en na het indrukken van de schakelaar is.
Ben benieuwd of de ZwaveJS een andere output laat zien.
Hoe zie je in domoticz eigenlijk het verschil tussen indrukken en vasthouden?
Maar ben ook benieuwd naar verschil in mqtt tussen domoticz en zwavejs.
Betreft een fibaro dimmer 2 overigens.
[ Voor 9% gewijzigd door MikeyMan op 06-04-2023 14:35 ]
:fill(white):strip_exif()/f/image/ASaLX34ddeVz8vlJfrZ6WbNN.png?f=user_large)
Maar ook hier zie ik niet heel erg veel onderscheid tussen dimmen en aan/uit anders dan de value die anders wordt. Wel maar één bericht per keer. Dat scheelt alvast.
[ Voor 24% gewijzigd door MikeyMan op 06-04-2023 22:11 ]
De dimmer stuurt waarschijnlijk van elke wijziging (aan, uit, dimlevel, zowel via knop als code) een bericht.
Om dit te testen wil ik je vragen om eens het volgende te maken en testen:
Een node red flow met ALLEEN de "Badkamerschakelaar" en "debug 166" nodes en de overige nodes dus losgekoppeld of gedisabled.
Ook je blocky uitgeschakeld als je dat nog niet gedaan had.
Er mag geen enkele code meer uitgevoerd worden bij het bedienen van de dimmer, zodat je de pure berichten van de dimmer kunt registreren.
Vervolgens de volgende dingen testen met de knop en de debug messages afvangen (en hier posten):
- aan zetten
- uit zetten
- dimmen (omhoog/omlaag), komen er meerdere berichten binnen? Of alleen eentje met de eind-dimwaarde?
- optioneel: ik meen dat er ook nog een dubbelklik mogelijk is als ik snel even de docs van de knop zag
Laat ook even een debug-output zien, waarbij je in de debug node niet "msg.payload" maar "complete msg object" kiest. Ben even benieuwd naar de complete structuur van het msg object.
[ Voor 7% gewijzigd door musicpixel op 07-04-2023 06:20 ]
Feel free to Buy me a coffee
Uit:
/f/image/FP9D9pXaCRhAUrsOCXdniMGM.png?f=fotoalbum_large)
aan:
/f/image/4vlf3AzMxdLpK1asEd32cjLB.png?f=fotoalbum_large)
En krijg je nog andere waarden (voor nvalue en svalue1 bijv) bij dimmen tov aan en uit?
Wat is eigenlijk de trigger die die blocky start?
Feel free to Buy me a coffee
Ja die nvalue is wel apart. Heb alleen nog aan/uit geschakeld.musicpixel schreef op vrijdag 7 april 2023 @ 10:48:
@MikeyMan Hmmm... valt me wel 1 ding op: vorige keer was bij aan zetten de nvalue 2, en nu is de nvalue 1. Of is die laatste een dubbelklik?
En krijg je nog andere waarden (voor nvalue en svalue1 bijv) bij dimmen tov aan en uit?
Wat is eigenlijk de trigger die die blocky start?
Zal de andere acties ook proberen. Ben ff weekendje weg. Volgende week verder
De blockly liep constant mee op de achtergrond.
[ Voor 3% gewijzigd door MikeyMan op 07-04-2023 10:55 ]

Heb een Nest Hub aangeschaft, en wou daar mijn Home Assistant energy dashboard naartoe casten:
:strip_exif()/f/image/h0Kk33wOB7U8bKQRkeUPWmRu.jpg?f=fotoalbum_large)
Nu wil ik niet iedere keer mijn telefoon pakken om met de HA app dat dashboard te casten. Dus heb de Google Smarthome integratie gebruikt om naar mijn Google home een on/off switch op de nest hub te hebben. Aan, begint ie mijn dashboards te casten, uit en hij stopt er weer mee.
Hele omweg voor een knopje, maar ik ben er blij mee:
:strip_exif()/f/image/x2YgrbH2J3TOMUTGdc2TIznQ.jpg?f=fotoalbum_large)
Binnekort maar eens wat meer met NodeRED doen
16 x JaSolar 335Wp | 5430Wp | GOODWE 4K-DT
Duurde even voordat ik weer kon gaan testen. Eerst de 'native' mqtt messages vanuit ZwaveJS.musicpixel schreef op vrijdag 7 april 2023 @ 10:48:
@MikeyMan Hmmm... valt me wel 1 ding op: vorige keer was bij aan zetten de nvalue 2, en nu is de nvalue 1. Of is die laatste een dubbelklik?
En krijg je nog andere waarden (voor nvalue en svalue1 bijv) bij dimmen tov aan en uit?
Wat is eigenlijk de trigger die die blocky start?
Die zien er zo uit:
:fill(white):strip_exif()/f/image/JFC4ZdxjkvRI1vlxC93bXIDo.png?f=user_large)
Helaas bevat deze alleen de output van de schakelaar. Deze wordt dan in de Value gezet.
Hier is on of off geen optie. Value kan tussen 0 en 99 zijn. Bij dimmen wordt de laatste waarde verstuurd.
Bedienen van de schakelaar levert 1 bericht op vanuit ZwaneJS
Als ik (zonder Node red functie) de schakelaar bedien in domoticz, wordt gebruik gemaakt van de 'set' parameter. Deze kan On/Off/percentage zijn. Dus vrees dat daar nog niet heel veel nuttigs uit te halen valt.
Domoticz levert altijd twee berichten op. Dit dmv de targetvalue, die met de hard wired schakelaar niet gebruikt wordt.
Misschien dat ik iets kan met de inschakeltijd. Pas dimlevel weer zetten na de laatste keer inschakelen ofzo... Even mee rommelen...
[ Voor 7% gewijzigd door MikeyMan op 12-04-2023 20:04 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| let newvalue = msg.payload.value; let oldvalue = global.get('Store.Oldvalue', "file"); if (oldvalue !== newvalue) { global.set('Store.Oldvalue', newvalue, "file"); if (oldvalue == 0) { newvalue = 60 msg.payload = newvalue; } else if (oldvalue !== 0) { newvalue = msg.payload.value; msg.payload = newvalue; } } return msg; |
Nu zonder domoticz ertussen.
Werkt in test goed. Maar resulteert in een loop zodra ik de waarde wegschrijf niet geheel onlogisch als ik erover nadenk. Eens kijken hoe dat te voorkomen is.
[ Voor 5% gewijzigd door MikeyMan op 13-04-2023 11:04 ]
De volgende stap:MikeyMan schreef op donderdag 13 april 2023 @ 10:59:
Ben een klein stapje verder denk ik
Als je 'return msg;' binnen het if statement brengt zal de functie niets doen als oldValue en newValue gelijk zijn, en daarmee is de loop doorbroken.
Of je gebruikt een rbe filter node, dan hoef je het niet eens uit te schrijven.
Thanks!JW te R schreef op donderdag 13 april 2023 @ 13:59:
[...]
De volgende stap:
Als je 'return msg;' binnen het if statement brengt zal de functie niets doen als oldValue en newValue gelijk zijn, en daarmee is de loop doorbroken.
Of je gebruikt een rbe filter node, dan hoef je het niet eens uit te schrijven.
Had ik zelf inmiddels ook bij elkaar geprutst
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 //Dimmer values let value = msg.payload.value; let newvalue = {} let oldvalue = global.get('Store.Oldvalue', "file"); var dimLevelNight = 10; var dimLevelDay = 60; var dimLevelDusk = 30; var dimPeriod = 30; var dimLevel = {}; //Time frames var Sunrise = new Date(global.get('Sunrise', "file")); var Sunset = new Date(global.get('Sunset', "file")); var now = new Date(); var beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000)); var afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000)); var daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000)); var daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000)); //Set dim level: if ((now >= afterSunset || now < beforeSunrise)) { dimLevel = dimLevelNight; // msg.payload.timeframe = 'Night'; } else if ((now >= daytimeStart && now <= daytimeEnd)) { dimLevel = dimLevelDay; // msg.payload.timeframe = 'Day'; } else { dimLevel = dimLevelDusk; // msg.payload.timeframe = 'Dusk'; } //Function if (oldvalue !== value) { global.set('Store.Oldvalue', value, "file"); if (oldvalue == 0) { newvalue = dimLevel msg.payload = newvalue; // msg.payload = { "old value": oldvalue, "new value": newvalue }; // Test payload return msg; } else if (oldvalue !== 0) { newvalue = msg.payload.value; msg.payload = newvalue; // msg.payload = { "old value": oldvalue, "new value": newvalue }; // Test payload return msg; } } else if (oldvalue == newvalue) { return null; }
1
| [{"id":"496286b068576e81","type":"function","z":"02452070554fbb83","name":"function 21","func":"//Dimmer values\nlet value = msg.payload.value;\nlet newvalue = {}\nlet oldvalue = global.get('Store.Oldvalue', \"file\");\nvar dimLevelNight = 10;\nvar dimLevelDay = 60;\nvar dimLevelDusk = 30;\nvar dimPeriod = 30;\nvar dimLevel = {};\n\n//Time frames\nvar Sunrise = new Date(global.get('Sunrise', \"file\"));\nvar Sunset = new Date(global.get('Sunset', \"file\"));\nvar now = new Date();\n\nvar beforeSunrise = new Date(Sunrise.getTime() - (dimPeriod * 60 * 1000));\nvar afterSunset = new Date(Sunset.getTime() + (dimPeriod * 60 * 1000));\n\nvar daytimeStart = new Date(beforeSunrise.getTime() + (dimPeriod * 60 * 1000));\nvar daytimeEnd = new Date(afterSunset.getTime() - (dimPeriod * 60 * 1000));\n\n//Set dim level:\nif ((now >= afterSunset || now < beforeSunrise)) {\n dimLevel = dimLevelNight;\n// msg.payload.timeframe = 'Night';\n} \n\nelse if ((now >= daytimeStart && now <= daytimeEnd)) {\n dimLevel = dimLevelDay;\n// msg.payload.timeframe = 'Day';\n} \n\nelse \n{\n dimLevel = dimLevelDusk;\n// msg.payload.timeframe = 'Dusk';\n}\n\n\n//Function\nif (oldvalue !== value) {\n global.set('Store.Oldvalue', value, \"file\");\n if (oldvalue == 0)\n {\n newvalue = dimLevel\n msg.payload = newvalue;\n// msg.payload = { \"old value\": oldvalue, \"new value\": newvalue }; // Test payload\n\n \n return msg;\n \n }\n else if (oldvalue !== 0)\n {\n newvalue = msg.payload.value;\n msg.payload = newvalue;\n// msg.payload = { \"old value\": oldvalue, \"new value\": newvalue }; // Test payload\n\n\n return msg;\n }\n }\n\n\n else if (oldvalue == newvalue)\n {\n return null; \n }\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":630,"y":580,"wires":[["fbe6da029b6e2a8a","c456afd3f4c2be09"]]},{"id":"fbe6da029b6e2a8a","type":"debug","z":"02452070554fbb83","name":"debug 174","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":910,"y":660,"wires":[]},{"id":"0d3b3e9237b6776d","type":"mqtt in","z":"02452070554fbb83","name":"Badkamerschakelaar ZwaveJS","topic":"zwave/18/38/1/currentValue","qos":"0","datatype":"auto-detect","broker":"92e5b2c.00a8b5","nl":false,"rap":true,"rh":0,"inputs":0,"x":250,"y":580,"wires":[["496286b068576e81","598fbf626744c129"]]},{"id":"598fbf626744c129","type":"debug","z":"02452070554fbb83","name":"debug 175","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":630,"y":660,"wires":[]},{"id":"c084b06b1fc89de2","type":"inject","z":"02452070554fbb83","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":660,"wires":[["496286b068576e81"]]},{"id":"c456afd3f4c2be09","type":"mqtt out","z":"02452070554fbb83","name":"","topic":"zwave/18/38/1/targetValue/set","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"92e5b2c.00a8b5","x":970,"y":580,"wires":[]},{"id":"92e5b2c.00a8b5","type":"mqtt-broker","name":"MQTT (NAS)","broker":"10.0.0.4","port":"1883","clientid":"Node_Red_Client","autoConnect":true,"usetls":false,"compatmode":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}] |
Kan vast nog mooier, maar het werkt.
Omzetten naar Domoticz input, maakt er overigens weer een zooitje van.
edit: filter node zou het zo te zien ook oplossen.
[ Voor 47% gewijzigd door MikeyMan op 13-04-2023 14:31 ]
Ik heb een Function Node gemaakt die wordt gevoed door een All Events Node. Ik filter op 2 variabelen om zo het juiste bericht af te kunnen vangen.
Tijdens het deployen van Node-Red krijg ik in de debug log de volgende melding die verwijst naar de Function Node:“TypeError: Cannot read properties of undefined (reading ‘device_id’)”, which refers to the “Funciton Node”.
Iemand een idee waarom ik deze melding krijg?
Function Node Code
1
2
3
4
5
6
7
8
9
10
11
| var p1 = msg.payload.event_type; var p2 = msg.payload.event.device_id; if (p1 == "zha_event" && p2 == "089da0ea7e55279c0a0fc2cd6a8b4304") { msg.payload = true; return [msg, null]; } |
Payload:
:fill(white):strip_exif()/f/image/IFWlTfHchy1ppSEmzeg01JPi.png?f=user_large)
Erorr:
:fill(white):strip_exif()/f/image/YIOeiEKzTAQGOwMTzyaH1JrV.png?f=user_large)
Voor NodeRed is een eigen topic => verplaatst
[ Voor 2% gewijzigd door Septillion op 28-04-2023 16:59 ]
Maar HA maakt er zelf 20:00:00 van. Terwijl ik deze wil vergelijken met 20:00.(node red) Hoe kan ik makkelijk van deze secondens af komen?
Bl44t
Kun je delen wat je al hebt?OcGuru schreef op vrijdag 28 april 2023 @ 20:09:
Ik heb in HA een helper om een bepaalde tijd in de stellen. Bv 20:00.
Maar HA maakt er zelf 20:00:00 van. Terwijl ik deze wil vergelijken met 20:00.(node red) Hoe kan ik makkelijk van deze secondens af komen?
Feel free to Buy me a coffee
Ik heb een erg raar probleem, en kom er alleen helaas niet uit.
We proberen een automatisering te maken met HomeAssistant en Node red voor de VW ID.4 van een collega.
Hiervoor proberen we een button aan te sturen.
Als we deze aansturen met inject = true, dan zien we de button van status verranderen.
Eerste true gaat status naar on, tweede naar off, en zo gaat het goed door. (toggle)
Wanneer we het zelfde proberen met een automatisering dan krijgen we IEDERE keer een call-service attempted without connection to the server. Via debug zien we een exact gelijke msg.payload string naar de knop gaan. ("true")
Iemand een idee wat we verkeerd doen?
Weet niet meteen wat je verkeerd doet, maar heb je al geprobeerd om in de debug node de output op "complete msg object" te zetten ipv msg.payload? Misschien zie je dan meer.Obelixxx schreef op maandag 1 mei 2023 @ 10:16:
Hoi Allemaal,
Ik heb een erg raar probleem, en kom er alleen helaas niet uit.
We proberen een automatisering te maken met HomeAssistant en Node red voor de VW ID.4 van een collega.
Hiervoor proberen we een button aan te sturen.
Als we deze aansturen met inject = true, dan zien we de button van status verranderen.
Eerste true gaat status naar on, tweede naar off, en zo gaat het goed door. (toggle)
Wanneer we het zelfde proberen met een automatisering dan krijgen we IEDERE keer een call-service attempted without connection to the server. Via debug zien we een exact gelijke msg.payload string naar de knop gaan. ("true")
Iemand een idee wat we verkeerd doen?
Feel free to Buy me a coffee
Maar loop een beetje vast in mijn gedachtegang merk ik.
Als inputs heb ik:
- Windsnelheid (nu nog van online aanbieder)
- Licht (vanuit tahoma api)
- Kamertemperatuur (vanuit Evohome Api)
Op dit moment heb ik dit allemaal in een enkele functie gepropt. Het werkt op zich best aardig, behalve dat ik nu liever het openen en sluiten van de zonwering bij een ander aantal lux zou willen regelen. Dus toch maar aan de slag gegaan met uit elkaar trekken.
Per input een functie die de losse tests doet geeft hierbij inderdaad wat meer flexibiliteit.
heb nu deze flow:
1
| [{"id":"ac5c855a4203b94a","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Sunscreen Light","func":"let SetpointDown = global.get('Tahoma.Light_Down', \"file\");\nlet SetpointUp = global.get('Tahoma.Light_Up', \"file\");\n\nif (msg.payload < SetpointUp)\n{\n msg.payload = \"Up\";\n return msg;\n}\n\nelse if (msg.payload >= SetpointDown)\n{\n msg.payload = \"Down\"\n return msg;\n}\n\n\nelse\n{\n msg.payload = \"Hold\" \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1980,"y":1120,"wires":[["ddde0956f5a04cb9","a3b06caac89f4822","06eabc507ba89fdc"]]},{"id":"ddde0956f5a04cb9","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug licht","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2310,"y":1120,"wires":[]},{"id":"a3b06caac89f4822","type":"ui_text","z":"743a62898f598be4","g":"c8d703f331c6071d","group":"cdd6bc3a70d5012e","order":1,"width":0,"height":0,"name":"","label":"Licht","format":"{{msg.payload}}","layout":"row-spread","className":"","x":2290,"y":1160,"wires":[]},{"id":"06eabc507ba89fdc","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Function gym test","func":"//var Wind = global.get('Tahoma.Wind_Screens', \"file\");\nvar Wind = msg.wind;\nvar Temp = global.get('Tahoma.Temp_Gym', 'file');\n\nif (msg.payload == 'Down' && Wind == 'Down' && Temp == 'Down')\n{\nmsg.payload = 'Down';\n}\n\nelse if (msg.payload == 'Up' || Wind == 'Up' || Temp == 'Up')\n{\nmsg.payload = 'Up' + Wind; \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2390,"y":1240,"wires":[["5a8dc3d7c7823340"]]},{"id":"5a8dc3d7c7823340","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 183","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2670,"y":1240,"wires":[]},{"id":"c23caaad5005c3ce","type":"link in","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"Link in Wind","links":["f0556cd2fb75c2e1"],"x":1825,"y":1380,"wires":[["536325eae80dc1af","09c152d5c4f3b9f4"]]},{"id":"536325eae80dc1af","type":"function","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"function Wind Test","func":"var msg1 = {};\nvar msg2 = {};\nvar msg3 = {};\n\nvar windWoonkamer = global.get('Wind.Woonkamer', \"file\");\nvar windScreens = global.get('Wind.Screens', \"file\");\nvar windZipscreens = global.get('Wind.Zipscreens', \"file\");\n\nvar tahomaWind_Woonkamer = {};\nvar tahomaWind_Screens = {};\nvar tahomaWind_Zipscreens = {};\n\nif (msg.payload <= windWoonkamer)\n{\n msg1.wind = 'Down';\n global.set('Tahoma.Wind_Woonkamer',\"Down\", \"file\");\n}\n\nelse\n{\n msg1.wind = 'Up';\n global.set('Tahoma.Wind_Woonkamer', \"Up\", \"file\");\n}\n\nif (msg.payload <= windScreens)\n{\n msg2.wind = 'Down';\n global.set('Tahoma.Wind_Screens', \"Down\", \"file\");\n}\n\nelse \n{\n msg2.wind = 'Up';\n global.set('Tahoma.Wind_Screens', \"Up\", \"file\");\n}\n\nif (msg.payload <= windScreens)\n{\n msg3.wind = 'Down';\n global.set('Tahoma.Wind_Zipscreens', \"Down\", \"file\");\n}\n\nelse\n{\n msg3.wind = 'Up';\n global.set('Tahoma.Wind_Zipscreens', \"Up\", \"file\");\n}\n\nreturn [msg1,msg2,msg3];","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1990,"y":1380,"wires":[["9bc60edb91af0dbd"],["1258b9d18c21d2f4","06eabc507ba89fdc"],["f4a88f5837c3ee58"]]},{"id":"9bc60edb91af0dbd","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind woonkamer","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2270,"y":1320,"wires":[]},{"id":"09c152d5c4f3b9f4","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug 185","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1970,"y":1320,"wires":[]},{"id":"1258b9d18c21d2f4","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind screens","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2260,"y":1380,"wires":[]},{"id":"f4a88f5837c3ee58","type":"debug","z":"743a62898f598be4","g":"c8d703f331c6071d","name":"debug wind zipscreens","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2260,"y":1440,"wires":[]},{"id":"cdd6bc3a70d5012e","type":"ui_group","name":"Current State","tab":"21daaeaaf5421973","order":3,"disp":true,"width":"12","collapse":false,"className":""},{"id":"21daaeaaf5421973","type":"ui_tab","name":"Zonneschermen","icon":"wi-wu-mostlysunny","order":14,"disabled":false,"hidden":false}] |
Met als uiteindelijke functie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| //var Wind = global.get('Tahoma.Wind_Screens', "file"); var Wind = msg.wind; var Temp = global.get('Tahoma.Temp_Gym', 'file'); if (msg.payload == 'Down' && Wind == 'Down' && Temp == 'Down') { msg.payload = 'Down'; } else if (msg.payload == 'Up' || Wind == 'Up' || Temp == 'Up') { msg.payload = 'Up' + Wind; } return msg; |
Hiermee is het op zich ook prima werkend te krijgen.
Enige waar ik nu tegenaan loop is dat de lichtsensor de enige trigger is. Die loopt elke vijf minuten.
Maar; hoe gebruik je nu twee inputs als trigger voor een functienode? Zou namelijk graag de windsnelheid onafhankelijk willen laten triggeren. Echter; als ik deze beide aan de functienode zet, krijg ik een asynchrone trigger met onvolledige info.
Nog niet veel
Heb nu een dropdown helper in HA gemaakt met de gewenste uitschakeltijden. Dus 20:00, 22:00, 23:00 enz.
Met een change node schrijf ik deze naar een global variable
Idem met de actuele tijd.
Daarna weer een inject node met beide variable naar een switch node die beide vergelijkt. Zijn beide gelijk aan elkaar gaat de buitenlamp uit.
Kan vast veel simpeler maar het werkt
Bl44t