[{"id":"2eafb628.a36bea","type":"subflow","name":"Solar Forecast","info":"Local 3 aspect solar forecast with hardwired location and panels\n\nInputs: timestamp for when\nOutputs: total solar forecast in watts","in":[{"x":40,"y":80,"wires":[{"id":"ff5da0d5.990c5"},{"id":"27f25a3b.4c4516"},{"id":"746a5496.4ce3cc"}]}],"out":[{"x":760,"y":80,"wires":[{"id":"2dace739.51fd38","port":0}]}]},{"id":"a4eeebe7.14b008","type":"solar power forecast","z":"2eafb628.a36bea","name":"Solar Forecast SE","lat":"51.6116","lon":"-0.1919","tilt":"35","orientation":"140","altitude":"75","area":"1.44","number":"6","efficiency":"17.4","x":350,"y":40,"wires":[["2dace739.51fd38"]]},{"id":"ce74b479.670c38","type":"solar power forecast","z":"2eafb628.a36bea","name":"Solar Forecast SW","lat":"51.6116","lon":"-0.1919","tilt":"35","orientation":"230","altitude":"75","area":"1.44","number":"7","efficiency":"17.4","x":350,"y":80,"wires":[["2dace739.51fd38"]]},{"id":"105e2d8b.961b52","type":"solar power forecast","z":"2eafb628.a36bea","name":"Solar Forecast NW","lat":"51.6116","lon":"-0.1919","tilt":"35","orientation":"320","altitude":"75","area":"1.44","number":"6","efficiency":"17.4","x":350,"y":120,"wires":[["2dace739.51fd38"]]},{"id":"ff5da0d5.990c5","type":"template","z":"2eafb628.a36bea","name":"solar_se","field":"topic","fieldType":"msg","format":"text","syntax":"plain","template":"solar_se","x":180,"y":40,"wires":[["a4eeebe7.14b008"]]},{"id":"27f25a3b.4c4516","type":"template","z":"2eafb628.a36bea","name":"solar_sw","field":"topic","fieldType":"msg","format":"text","syntax":"plain","template":"solar_sw","x":180,"y":80,"wires":[["ce74b479.670c38"]]},{"id":"746a5496.4ce3cc","type":"template","z":"2eafb628.a36bea","name":"solar_nw","field":"topic","fieldType":"msg","format":"text","syntax":"plain","template":"solar_nw","x":180,"y":120,"wires":[["105e2d8b.961b52"]]},{"id":"2dace739.51fd38","type":"function","z":"2eafb628.a36bea","name":"Calculate Solar Forecast","func":"var aspect = msg.topic;\nvar delta = msg.delta_hours;\nvar solar = msg.payload.powerforecast;\nvar ts = msg.payload.timestamp;\n\ncontext.set(delta + aspect, solar);\ncontext.set(delta + aspect + \"_ts\", ts);\n\nmsg.topic = msg.mqtt_topic;\ndelete msg.mqtt_topic;\n\nif (context.get(delta + \"solar_se\") !== null &&\n context.get(delta + \"solar_sw\") !== null &&\n context.get(delta + \"solar_nw\") !== null &&\n context.get(delta + \"solar_se_ts\") === context.get(delta + \"solar_sw_ts\") &&\n context.get(delta + \"solar_se_ts\") === context.get(delta + \"solar_nw_ts\")) {\n msg.payload = context.get(delta + \"solar_se\") +\n context.get(delta + \"solar_sw\") +\n context.get(delta + \"solar_nw\");\n // msg.payload = msg.max * (1 - global.get(\"cloud_cover\"));\n} else {\n msg = null;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":590,"y":80,"wires":[[]]},{"id":"a871e31c.5f5c7","type":"mqtt-broker","z":"","broker":"emonpi","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""},{"id":"13af0c9.cf932f3","type":"forecastio","z":"7ee3af60.c01de","forecastio":"","name":"Forecastio Weather","lon":"-0.1919","lat":"51.6116","date":"","time":"","mode":"message","units":"uk2","x":580,"y":120,"wires":[["451f513d.5662a"]]},{"id":"d0f57173.0fec2","type":"inject","z":"7ee3af60.c01de","name":"Every 5 Minutes","topic":"","payload":"","payloadType":"date","repeat":"300","crontab":"","once":true,"x":120,"y":200,"wires":[["31c6dff8.21d84","eee69152.883c5"]]},{"id":"451f513d.5662a","type":"function","z":"7ee3af60.c01de","name":"ForecastIO Processing","func":"//\n\nvar cloud_cover = 1.0 - (msg.data.currently.cloudCover || 0.0);\nglobal.set(\"cloud_cover\", cloud_cover);\nvar msg1 = { topic: 'emon/nodered/cloudcover', payload: cloud_cover };\n\nvar hourly = msg.data.hourly.data;\n\nvar clouds_3hours = 1.0 - (hourly[3].cloudCover || 0.0);\nglobal.set(\"clouds_3hours\", clouds_3hours);\nvar msg2 = { topic: 'emon/nodered/cloudcover_3hours', payload: clouds_3hours };\n\nvar clouds_6hours = 1.0 - (hourly[6].cloudCover || 0.0);\nglobal.set(\"clouds_6hours\", clouds_6hours);\nvar msg3 = { topic: 'emon/nodered/cloudcover_6hours', payload: clouds_6hours };\n\nvar sunrise = msg.data.daily.data[0].sunriseTime;\nvar sunset = msg.data.daily.data[0].sunsetTime;\n\nglobal.set(\"sunrise\", sunrise);\nglobal.set(\"sunset\", sunset);\nglobal.set(\"midday\", sunrise + ((sunset - sunrise) / 2));\n\nreturn [ msg1, msg2, msg3 ];","outputs":"3","noerr":0,"x":850,"y":120,"wires":[["ceac7207.f097d"],["ceac7207.f097d"],["ceac7207.f097d"]]},{"id":"31c6dff8.21d84","type":"function","z":"7ee3af60.c01de","name":"payload to time","func":"msg.time = new Date();\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":120,"wires":[["13af0c9.cf932f3"]]},{"id":"ceac7207.f097d","type":"mqtt out","z":"7ee3af60.c01de","name":"to MQTT","topic":"","qos":"","retain":"","broker":"a871e31c.5f5c7","x":1240,"y":180,"wires":[]},{"id":"47965e4c.9d37e","type":"debug","z":"7ee3af60.c01de","name":"Solar Forecast","active":true,"console":"false","complete":"true","x":1260,"y":320,"wires":[]},{"id":"eee69152.883c5","type":"delay","z":"7ee3af60.c01de","name":"","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":350,"y":320,"wires":[["45cf2a7e.c9f374"]]},{"id":"c8ec1fda.5f58b","type":"subflow:2eafb628.a36bea","z":"7ee3af60.c01de","name":"Solar Forecast +0 Hours","x":850,"y":280,"wires":[["47965e4c.9d37e","ceac7207.f097d"]]},{"id":"2285274c.3bdad8","type":"subflow:2eafb628.a36bea","z":"7ee3af60.c01de","name":"Solar Forecast +3 Hours","x":850,"y":320,"wires":[["47965e4c.9d37e","ceac7207.f097d"]]},{"id":"45cf2a7e.c9f374","type":"function","z":"7ee3af60.c01de","name":"Solar Forecasts Trigger","func":"var ts = msg.payload;\n\nvar msg1 = { payload: ts, delta_hours: 0, mqtt_topic: 'emon/nodered/solarforecast_current' };\nvar msg2 = { payload: ts + 3 * 3600 * 1000, delta_hours: 3, mqtt_topic: 'emon/nodered/solarforecast_3hours' };\nvar msg3 = { payload: ts + 6 * 3600 * 1000, delta_hours: 6, mqtt_topic: 'emon/nodered/solarforecast_6hours' };\n\nreturn [ msg1, msg2, msg3 ];","outputs":"3","noerr":0,"x":570,"y":320,"wires":[["c8ec1fda.5f58b"],["2285274c.3bdad8"],["c69d199c.71c858"]]},{"id":"c69d199c.71c858","type":"subflow:2eafb628.a36bea","z":"7ee3af60.c01de","name":"Solar Forecast +6 Hours","x":850,"y":360,"wires":[["47965e4c.9d37e","ceac7207.f097d"]]}]