Cette semaine, nous avons réalisé un petit programme qui affiche sur un Yocto-MaxiDisplay la production actuelle des panneaux photovoltaïques du bâtiment. Pour ce faire, nous avons écrit un petit script Python qui récupère les informations de production depuis la passerelle Envoy S Metered du bâtiment.
Quand un bâtiment est équipé de panneaux solaires, la meilleure solution pour rentabiliser l’infrastructure est d'optimiser l'utilisation des appareils électriques pour profiter au maximum de l'électricité produite par les panneaux. Par exemple, en lançant la machine à laver la vaisselle en pleine journée plutôt que le soir. Pour cette raison, nous avons écrit un petit programme en Python qui affiche dans la cuisine la production solaire actuelle ainsi que la consommation actuelle de la maison.
La passerelle Envoy S Metered
Lînstallation solaire du bâtiment utilise des micro-onduleurs de la marque Enphase qui sont reliés à une passerelle Enphase Envoy S Metered. Cette passerelle est capable de mesurer la production actuelle de tous les panneaux solaires, mais aussi la consommation électrique actuelle du bâtiment.
Comme beaucoup d’installations actuelles, cette passerelle est connectée au réseau local et peut publier ses données sur un service de Cloud (en l'occurrence https://enlighten.enphaseenergy.com/). Mais, ce qui est moins connu, c'est qu'il est possible d'obtenir toutes ces informations en local en se connectant directement à la passerelle. Il existe même un package Python qui permet d'obtenir directement ces informations.
Le Yocto-MaxiDisplay
Pour l'affichage, nous avons utilisé un Yocto-MaxiDisplay branché sur un YoctoHub-Wireless-n. En fait, on a réutilisé l'infrastructure que nous avions mise en place il y a 9 ans qui permettait d'afficher les rendez-vous de la journée dans la cuisine.
L'application
Nous avons écrit cette application en Python, car il s'agit d'un langage facile à utiliser et qui est cross-plateforme, mais surtout, car nous avons trouvé une librairie qui nous permettait d'interfacer facilement avec notre passerelle Enphase. Cette librairie est disponible sur GitHub mais aussi directement depuis PyPI ce qui facilite son installation.
Nous avons donc commencé par installer cette libraire ainsi que la librairie Yoctopuce.
pip install Enphase-API pip install yoctopuce
Pour le code, nous nous sommes très fortement inspiré du code d'exemple de la librairie Enphase-API. L'application est divisée en trois grosse parties.
La première est l'établissement de la connexion et l'authentification avec la passerelle Envoy S Metered, la deuxième est la récupération des informations de production et de consommation du bâtiment, et enfin la troisième est l'affichage de ces deux informations sur le Yocto-MaxiDisplay.
Dans cet article, nous allons détailler uniquement l'interaction de l'application avec le Yocto-MaxiDisplay, mais les sources complètes de l'application sont disponibles sous GitHub avec nos autres programmes d'exemples. Comme nous l'avons dit, le code qui interagit avec la passerelle est très fortement inspiré des exemples de la librairie Enphase-API et est bien documenté mais, si vous avez des questions, n'hésitez pas à nous contacter.
Au démarrage, on commence par établir la connexion avec le YoctoHub sur lequel le Yocto-MaxiDisplay est branché pour récupérer un objet YDisplay qui nous permet d'interagir avec l'écran.
res = YAPI.RegisterHub(config['yoctopuce_url'], errmsg)
if res != YAPI:SUCCESS:
print('Unable to connect to %s (%s)'
% (config['yoctopuce_url'], errmsg.value))
sys.exit(1)
disp = YDisplay.FirstDisplay()
if disp is None:
print('No module connected')
sys.exit(1)
Ensuite, on réinitialise le contenu de l'écran et on sauvegarde les dimensions de l'écran. On récupère aussi un pointeur sur le layer 0 de l'écran qui nous permet de faire du double buffering et ainsi d'éviter le clignotement lors de la mise à jour du contenu de l'écran.
w = disp.get_displayWidth()
h = disp.get_displayHeight()
l0 = disp.get_displayLayer(0)
Puis, on entre dans la boucle principale de l'application qui, dans un premier temps, récupère les données de production électrique et de consommation électrique du bâtiment. Ensuite, elle affiche sur la première ligne la différence, c'est-à-dire le surplus d'énergie produite par les panneaux solaires. Sur la deuxième ligne, on affiche la production solaire.
production, consumption = get_solar_stats(gateway)
delta = production - consumption
l0.clear()
l0.selectFont('Large.yfm')
l0.drawText(w / 2, h / 3, YDisplayLayer.ALIGN.CENTER,
format_watts(delta))
l0.selectFont('Medium.yfm')
l0.drawText(w / 2, h * 2 / 3, YDisplayLayer.ALIGN.CENTER,
"(" + format_watts(production) + ")")
disp.swapLayerContent(0, 1)
YAPI.Sleep(5000, errmsg)
Notez l'appel à disp.swapLayerContent qui permute le contenu du layer 0 (bottom) avec le layer 1 (top) qui nous permet de faire du double buffering. Comme le layer 1 est placé au-dessus du layer 0, il n'y a pas de risque que le Yocto-MaxiDisplay rafraîchisse l'écran OLED avec un contenu incomplet (ce qui serait le cas entre l'appel à clear et les appels à drawText).
Au final, le coeur de notre application ressemble à ça.
with open('config.json', mode='r', encoding='utf-8') as json_file:
config = json.load(json_file)
gateway = get_secure_gateway_session(config)
errmsg = YRefParam()
res = YAPI.RegisterHub(config['yoctopuce_url'], errmsg)
if res < 0:
print('Unable to connect to %s (%s)'
% (config['yoctopuce_url'], errmsg.value))
sys.exit(1)
disp = YDisplay.FirstDisplay()
if disp is None:
print('No module connected')
sys.exit(1)
disp.resetAll()
w = disp.get_displayWidth()
h = disp.get_displayHeight()
l0 = disp.get_displayLayer(0)
while disp.isOnline():
production, consumption = get_solar_stats(gateway)
delta = production - consumption
l0.clear()
l0.selectFont('Large.yfm')
l0.drawText(w / 2, h / 3, YDisplayLayer.ALIGN.CENTER,
format_watts(delta))
l0.selectFont('Medium.yfm')
l0.drawText(w / 2, h * 2 / 3, YDisplayLayer.ALIGN.CENTER,
"(" + format_watts(production) + ")")
disp.swapLayerContent(0, 1)
YAPI.Sleep(5000, errmsg)
Nous avons ensuite installé ce petit script sur un Raspberry Pi et nous avons configuré le Raspberry Pi pour qu'il démarre ce script au boot et voilà.
Le Yocto-MaxiDisplay est intégré dans les meubles de la cuisine
Pour conclure
En utilisant la passerelle Enphase et le Yocto-MaxiDisplay, notre script Python permet d'afficher en temps réel la production solaire et la consommation électrique dans la cuisine. Cette solution nous permet de savoir depuis la cuisine si cela vaut la peine de lancer le lave-vaisselle, ou si au contraire il vaut mieux attendre un moment plus ensoleillé.