[{"id":"zaptec_solar_v2","type":"tab","label":"Zaptec Solar Smart Charging V2","disabled":false,"info":"Professionele zonne-overschot laadflow voor Audi A6 + Zaptec"},{"id":"get_export","type":"api-current-state","z":"zaptec_solar_v2","name":"Teruglevering / Export","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","entity_id":"sensor.electricity_meter_energieproductie","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"export","propertyType":"msg","value":"string","valueType":"entityState"}],"for":"","forType":"num","x":160,"y":220,"wires":[["3d21d9a061d64465"]]},{"id":"get_ev_power","type":"api-current-state","z":"zaptec_solar_v2","name":"Laadvermogen","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","entity_id":"sensor.mdk_zaptec_laadvermogen","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"evpower","propertyType":"msg","value":"string","valueType":"entityState"}],"for":"","forType":"num","x":140,"y":300,"wires":[["fb7addf5efcb3a1c"]]},{"id":"smart_logic","type":"function","z":"zaptec_solar_v2","name":"Smart Solar Logic","func":"\n// Maximaal wattage van het net halen\nconst allowedImport = 250;\n\n// Tijdelijk 3 fasen laden uitgeschakeld\n// Nu pas naar 3 fasen schakelen bij 10.000 watt overschot (Wat niet snel gebeurt)\n// Mocht je wel willen schakelen, dan aanpassen naar 4000\n// const PHASE_UP = 4000;\n\nconst PHASE_UP = 10000;\nconst PHASE_DOWN = 3200;\n\nconst START_THRESHOLD = 1400;\nconst STOP_THRESHOLD = 1000;\n\nconst PHASE_COOLDOWN = 300000;\n\n// Sensors\n\nlet wattage = 0;\nlet solar = Number(msg.export || 0);\nlet house = Number(msg.house || 0);\nlet ev = Number(msg.evpower || 0);\nlet minAmps = Number(msg.min_amps || 6);\nlet boost_laden = msg.boost_laden === \"on\";\n\nlet lastMinAmps = context.get('lastMinAmps');\n\nif (lastMinAmps !== undefined && lastMinAmps !== minAmps) {\n    context.set('avg', []);\n}\n\ncontext.set('lastMinAmps', minAmps);\n\nlet wasBoost = context.get('wasBoost') || false;\n\nif (!boost_laden && wasBoost) {\n    context.set('avg', []);\n    context.set('phaseMode', 1);\n}\n\ncontext.set('wasBoost', boost_laden);\n\n// EV corrigeren omdat deze meestal al in house zit\nlet available = solar - house + ev + allowedImport;\n\n// Smoothing\nlet avg = context.get('avg') || [];\navg.push(available);\n\n// 8x15 = Dus je smoothing kijkt ~120 seconden terug.\n\nif (avg.length > 8) {\n    avg.shift();\n}\n\nlet smooth = avg.reduce((a,b)=>a+b,0) / avg.length;\n\ncontext.set('avg', avg);\n\nlet phaseMode = context.get('phaseMode') || 1;\n\nlet lastPhaseChange = context.get('lastPhaseChange') || 0;\n\nlet now = Date.now();\n\nif ((now - lastPhaseChange) > PHASE_COOLDOWN) {\n\n    if (phaseMode === 1 && smooth > PHASE_UP) {\n        phaseMode = 3;\n        context.set('lastPhaseChange', now);\n    }\n\n    if (phaseMode === 3 && smooth < PHASE_DOWN) {\n        phaseMode = 1;\n        context.set('lastPhaseChange', now);\n    }\n}\n\ncontext.set('phaseMode', phaseMode);\n\n// Amp calculation\nlet amps = 0;\n\nif (phaseMode === 1) {\n    amps = Math.floor(smooth / 230);\n} else {\n    amps = Math.floor(smooth / (230 * 3));\n}\n\n// Nooit lager dan ingestelde minimale laadstroom,\n// zolang charging actief is\nif (amps < minAmps) {\n    amps = minAmps;\n}\n\nif (amps > 16) amps = 16;\n\n// Charging logic\nlet charging = context.get('charging') || false;\n\nif (!charging && smooth > START_THRESHOLD) {\n    charging = true;\n}\n\nif (charging && smooth < STOP_THRESHOLD) {\n    charging = true;\n    amps = minAmps;\n}\n\ncontext.set('charging', charging);\n\n// Anti flapper amps\nlet lastAmps = context.get('lastAmps');\n\n// Eerste run: altijd doorlaten\nif (lastAmps === undefined) {\n    context.set('lastAmps', amps);\n} else {\n    // Wanneer verschil kleiner dan 1A is: vorige waarde houden\n    if (Math.abs(amps - lastAmps) < 1) {\n        amps = lastAmps;\n    }\n\n    context.set('lastAmps', amps);\n}\n\n\nif (boost_laden) {\n\n    charging = true;\n    phaseMode = 3;\n    context.set('phaseMode', 3);\n    amps = 16;\n\n    msg.phaseMode = phaseMode;\n    msg.amps = amps;\n    msg.available = smooth;\n    msg.charging = charging;\n\n    node.status({\n        fill: \"blue\",\n        shape: \"dot\",\n        text: `BOOST | 3F | 16A`\n    });\n\n    return [msg, msg];\n}\n\n// Outputs\nmsg.phaseMode = phaseMode;\nmsg.amps = amps;\nmsg.available = smooth;\nmsg.charging = charging;\n\nwattage = Math.floor(phaseMode * (230 * amps));\n\n// Status\nnode.status({\n    fill: smooth > 0 ? \"green\" : \"blue\",\n    shape: \"dot\",\n    text: `${smooth.toFixed(0)}W beschikbaar | ${wattage}W laden [${phaseMode}F | ${amps}A]`\n});\n\nreturn [msg, msg];","outputs":2,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":380,"wires":[["202f99ac431d9bc4"],["charge_switch"]]},{"id":"force_1phase","type":"api-call-service","z":"zaptec_solar_v2","name":"Naar 1 fase","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["number.grote_boel_15_terugschakelen_van_drie_naar_een_fase"],"labelId":[],"data":"{\"value\":32}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"number","service":"set_value","x":850,"y":380,"wires":[[]]},{"id":"auto_3phase","type":"api-call-service","z":"zaptec_solar_v2","name":"Auto / 3 fase","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["number.grote_boel_15_terugschakelen_van_drie_naar_een_fase"],"labelId":[],"data":"{\"value\":8}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"number","service":"set_value","x":850,"y":440,"wires":[[]]},{"id":"charge_switch","type":"switch","z":"zaptec_solar_v2","name":"Laden aan/uit","property":"amps","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"gte","v":"6","vt":"num"}],"repair":false,"outputs":2,"x":400,"y":540,"wires":[["35b9e3739bcc4628"],["97dc0f759b912a15","ae1cfb3f50a54513"]]},{"id":"set_current","type":"api-call-service","z":"zaptec_solar_v2","name":"Set laadstroom","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["number.mdk_zaptec_max_stroom"],"labelId":[],"data":"{    \"value\": {{amps}}}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"number","service":"set_value","x":1320,"y":600,"wires":[[]]},{"id":"resume_charging","type":"api-call-service","z":"zaptec_solar_v2","d":true,"name":"Hervat laden","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"button.press","floorId":[],"areaId":[],"deviceId":[],"entityId":["button.mdk_zaptec_hervat_het_opladen"],"labelId":[],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"button","service":"press","x":1310,"y":700,"wires":[[]]},{"id":"stop_charging","type":"api-call-service","z":"zaptec_solar_v2","d":true,"name":"Stop laden","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"button.press","floorId":[],"areaId":[],"deviceId":[],"entityId":["button.mdk_zaptec_stop_het_opladen"],"labelId":[],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"button","service":"press","x":1070,"y":520,"wires":[[]]},{"id":"3d21d9a061d64465","type":"api-current-state","z":"zaptec_solar_v2","name":"Huisverbruik","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","entity_id":"sensor.electricity_meter_energieverbruik","state_type":"num","blockInputOverrides":false,"outputProperties":[{"property":"house","propertyType":"msg","value":"string","valueType":"entityState"}],"for":"","forType":"num","x":370,"y":220,"wires":[["get_ev_power"]]},{"id":"202f99ac431d9bc4","type":"function","z":"zaptec_solar_v2","name":"Fase echt gewijzigd?","func":"let lastPhaseSent = context.get('lastPhaseSent');\n\nif (lastPhaseSent === msg.phaseMode) {\n    return [null, null];\n}\n\ncontext.set('lastPhaseSent', msg.phaseMode);\n\nif (msg.phaseMode === 1) {\n    return [msg, null];\n}\n\nreturn [null, msg];","outputs":2,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":380,"wires":[["339bf5cdfff47404"],["f087e47b4cf14fd8"]]},{"id":"a898ab96092d7443","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"rate","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"30","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1120,"y":600,"wires":[["set_current"]]},{"id":"fb7addf5efcb3a1c","type":"api-current-state","z":"zaptec_solar_v2","name":"EV boost laden (overriden van zonneladen en max. gaan laden)","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","entity_id":"input_boolean.ev_boost_laden","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"boost_laden","propertyType":"msg","value":"string","valueType":"entityState"}],"for":"","forType":"num","x":490,"y":300,"wires":[["badf44a7efab95fd"]]},{"id":"a900a2e91ff0ece4","type":"function","z":"zaptec_solar_v2","name":"Laadstroom gewijzigd?","func":"let lastSentAmps = context.get('lastSentAmps');\n\nif (lastSentAmps === undefined) {\n    context.set('lastSentAmps', msg.amps);\n    return msg;\n}\n\nif (lastSentAmps === msg.amps) {\n    return null;\n}\n\ncontext.set('lastSentAmps', msg.amps);\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":600,"wires":[["a898ab96092d7443"]]},{"id":"inject_20s","type":"inject","z":"zaptec_solar_v2","name":"Elke 15 seconden","props":[],"repeat":"15","crontab":"","once":true,"onceDelay":"10","topic":"","x":150,"y":40,"wires":[["5e532fdd9cc4d196"]]},{"id":"5e532fdd9cc4d196","type":"api-current-state","z":"zaptec_solar_v2","name":"Zaptec opladermodus ophalen","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","halt_if_compare":"is","entity_id":"sensor.mdk_zaptec_opladermodus","state_type":"str","blockInputOverrides":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"string","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"","forType":"num","forUnits":"seconds","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":450,"y":40,"wires":[["ebe6f93e4eb4b907"]]},{"id":"ebe6f93e4eb4b907","type":"switch","z":"zaptec_solar_v2","name":"Zaptec aan het laden (connected_charging) / gepauseerd of klaar (connected_finished)?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"connected_charging","vt":"str"},{"t":"eq","v":"connected_finished","vt":"str"}],"checkall":"false","repair":false,"outputs":2,"x":630,"y":120,"wires":[["819dc506c8cb835c"],["819dc506c8cb835c"]]},{"id":"819dc506c8cb835c","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1060,"y":120,"wires":[["get_export"]]},{"id":"9f4795089769eb45","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"delay","timeout":"3","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":940,"y":700,"wires":[["b7dd7b75d9247188"]]},{"id":"b7dd7b75d9247188","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"rate","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1120,"y":700,"wires":[["resume_charging"]]},{"id":"339bf5cdfff47404","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"rate","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":660,"y":380,"wires":[["force_1phase"]]},{"id":"f087e47b4cf14fd8","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"rate","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":660,"y":440,"wires":[["auto_3phase"]]},{"id":"33dadb6c1dd1962d","type":"delay","z":"zaptec_solar_v2","name":"","pauseType":"rate","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"2","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":860,"y":520,"wires":[["stop_charging"]]},{"id":"97dc0f759b912a15","type":"switch","z":"zaptec_solar_v2","name":"Zaptec NIET aan het laden?","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"connected_charging","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":660,"y":700,"wires":[["c7b775ff9be6c844"]]},{"id":"35b9e3739bcc4628","type":"switch","z":"zaptec_solar_v2","name":"Zaptec aan het laden?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"connected_charging","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":640,"y":520,"wires":[["33dadb6c1dd1962d"]]},{"id":"c7b775ff9be6c844","type":"switch","z":"zaptec_solar_v2","name":"Zaptec nog niet klaar?","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"connected_finished","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":840,"y":780,"wires":[["9f4795089769eb45"]]},{"id":"da53e5ef79be224a","type":"comment","z":"zaptec_solar_v2","name":"Let op: 'Zaptec nog niet klaar?' is pauze OF klaar. Laden start nu niet opnieuw als deze gepauzeerd is.","info":"","x":1090,"y":820,"wires":[]},{"id":"badf44a7efab95fd","type":"api-current-state","z":"zaptec_solar_v2","name":"EV minimale laadstroom","server":"409a01db.87cba","version":3,"outputs":1,"halt_if":"","halt_if_type":"str","entity_id":"input_number.ev_minimale_laadstroom","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"min_amps","propertyType":"msg","value":"number","valueType":"entityState"}],"for":"","forType":"num","x":890,"y":300,"wires":[["smart_logic"]]},{"id":"e34f7888ec8d7fa1","type":"inject","z":"zaptec_solar_v2","name":"Om 3:00 uur","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"00 03 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":840,"wires":[["359f72cb3dd114ee","26a58d18796f6db9","40cd83fed42027f0"]]},{"id":"359f72cb3dd114ee","type":"api-call-service","z":"zaptec_solar_v2","name":"EV Boost uitzetten","server":"173abe6.f950042","version":7,"debugenabled":false,"action":"input_boolean.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_boolean.ev_boost_laden"],"labelId":[],"data":"","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_boolean","service":"turn_off","x":430,"y":840,"wires":[[]]},{"id":"26a58d18796f6db9","type":"api-call-service","z":"zaptec_solar_v2","name":"EV Minimale laadstroom naar 6A zetten","server":"173abe6.f950042","version":7,"debugenabled":false,"action":"input_number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["input_number.ev_minimale_laadstroom"],"labelId":[],"data":"{    \"value\": 6}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"input_number","service":"set_value","x":500,"y":900,"wires":[[]]},{"id":"c1d10e2a350df82a","type":"comment","z":"zaptec_solar_v2","name":"Resetten van EV Boost en EV min. laadstroom","info":"","x":250,"y":780,"wires":[]},{"id":"40cd83fed42027f0","type":"api-call-service","z":"zaptec_solar_v2","name":"Naar 1 fase","server":"409a01db.87cba","version":7,"debugenabled":false,"action":"number.set_value","floorId":[],"areaId":[],"deviceId":[],"entityId":["number.grote_boel_15_terugschakelen_van_drie_naar_een_fase"],"labelId":[],"data":"{\"value\":32}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"blockInputOverrides":false,"domain":"number","service":"set_value","x":410,"y":960,"wires":[[]]},{"id":"ae1cfb3f50a54513","type":"switch","z":"zaptec_solar_v2","name":"Zaptec aan het laden?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"connected_charging","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":640,"y":600,"wires":[["a900a2e91ff0ece4"]]},{"id":"53231ad1c2f7875b","type":"comment","z":"zaptec_solar_v2","name":"Je zou dit block eventueel kunnen verwijderen","info":"","x":910,"y":860,"wires":[]},{"id":"409a01db.87cba","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":[],"connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false},{"id":"173abe6.f950042","type":"server","name":"Home Assistant","addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"","statusSeparator":"","enableGlobalContextStore":false},{"id":"b40b33b9e59accd3","type":"global-config","env":[],"modules":{"node-red-contrib-home-assistant-websocket":"0.80.3"}}]