The Internet of Things (IoT) unleashes great opportunities to improve our way of living and working through a seamless and highly dynamic cooperation among heterogeneous Things including both computer-based systems and physical objects. However, properly dealing with the design, development, deployment and runtime management of this breathing network of Things means to provide solutions for a multitude of challenges. Among them, we focus on: supporting complexity and heterogeneity management, supporting collaborative development, maximising reusability of design artefacts, and providing self-adaptation of IoT systems. In this paper we propose Model-Driven Engineering (MDE) as a key-enabler for solving these challenges and supporting the lifecycle of IoT systems, from their design to runtime management. More specifically, we: (i) introduce MDE4IoT, a Model-Driven Engineering Framework supporting the modelling of Things and self-adaptation of Emergent Configurations of connected systems in the IoT; and (ii) show how MDE in general, and MDE4IoT in particular, can help in tackling the above mentioned challenges by providing the Smart Street Lights case that we use throughout the paper as concrete case.