Just had a few moments to rough-out this simple flow for you... it is untested (so may not work)
[{"id":"d6c1f08ec046990c","type":"tab","label":"check two inputs","disabled":false,"info":"","env":[]},{"id":"7fa0e1ad4e60fcac","type":"mqtt in","z":"d6c1f08ec046990c","name":"soluko-temp-0","topic":"shellies/shellyuni-soluko/ext_temperature/0","qos":"0","datatype":"auto","broker":"c724c4775dbcf9f9","nl":false,"rap":true,"rh":0,"inputs":0,"x":110,"y":160,"wires":[["54ce7c75f9fd7fd4"]]},{"id":"7581eac314df62cc","type":"mqtt in","z":"d6c1f08ec046990c","name":"OUTSIDE-temp","topic":"esp/esp8266-1/temp-0","qos":"0","datatype":"auto-detect","broker":"c724c4775dbcf9f9","nl":false,"rap":true,"rh":0,"inputs":0,"x":120,"y":240,"wires":[["bf61d0013767ea57"]]},{"id":"01cc420a4833ccfb","type":"http request","z":"d6c1f08ec046990c","name":"Soluko Lüfter an","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://192.168.0.25/relay/0?turn=on","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":770,"y":140,"wires":[[]]},{"id":"54ce7c75f9fd7fd4","type":"change","z":"d6c1f08ec046990c","name":"","rules":[{"t":"set","p":"Tcol","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":160,"wires":[["484b63dca9a3c78a"]]},{"id":"bf61d0013767ea57","type":"change","z":"d6c1f08ec046990c","name":"","rules":[{"t":"set","p":"Tout","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":240,"wires":[["484b63dca9a3c78a"]]},{"id":"484b63dca9a3c78a","type":"function","z":"d6c1f08ec046990c","name":"Check temperatures","func":"let Tcol = flow.get(\"Tcol\");\nlet Tout = flow.get(\"Tout\");\n\nif ( (Tout < 15) && (Tcol > 30) ) {\n msg.payload = \"fan_ON\";\n node.status({fill:\"red\",shape:\"ring\",text:\"Fan is ON\"});\n}\nelse {\n msg.payload = \"fan_OFF\";\n node.status({fill:\"green\",shape:\"ring\",text:\"Fan is OFF\"});\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":200,"wires":[["fea9d456b1cae154"]]},{"id":"ed8d9688046c671f","type":"comment","z":"d6c1f08ec046990c","name":"Store Tcol and Tout in some flow variables","info":"","x":400,"y":120,"wires":[]},{"id":"fea9d456b1cae154","type":"debug","z":"d6c1f08ec046990c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":750,"y":200,"wires":[]},{"id":"c724c4775dbcf9f9","type":"mqtt-broker","name":"hb-sauger","broker":"192.168.0.181","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""}]
There are many ways the logical operation can be implemented. In my simple flow I save Tcol and Tout in a couple of flow variables. These variables are used in the 'function' node to compare the values. I've only written the ON condition check as I believe all other conditions result in the fan being OFF.
You will need to adjust the msg.payload output format to match the command to operate the Shelly Plug.
You may need to adjust the flow to handle the initial condition when only one input has been received from the MQTT node. For example, put some default values in the function node as below.
let Tcol = flow.get("Tcol") || 0; // Insert a suitable default value
let Tout = flow.get("Tout") || 0; // Insert a suitable default value
if ( (Tout < 15) && (Tcol > 30) ) {
msg.payload = "on";
node.status({fill:"red",shape:"ring",text:"Fan is ON"});
}
else {
msg.payload = "off";
node.status({fill:"green",shape:"ring",text:"Fan is OFF"});
}
return msg;