Interfaçage avec Home I/O

Un script Python peut interagir avec un composant logiciel écrit dans un autre langage de programmation.

Home I/0 est un logiciel de simulation d'une maison intelligente. Il a été conçu pour initier les élèves, du collège à l'université, à l'automatisation, la domotique, les transferts de chaleur, etc. Il a été développé avec Unity3D et le langage de programmation C#.

Chaque objet de la maison (lumière, store, porte de garage, chauffage, climatisation, etc) est pilotable en :

Capture d'écran du logiciel Home I/O

Le module pythonnet

Ce module permet d'interagir de façon simple avec le .NET Common Language Runtime (CLR) en charge de l'exécution des programmes écrits en C#.

Un module vient compléter le jeu d'instructions de base du langage Python. Il doit donc être installé avant d'être utilisé. La commande sous Windows est la suivante :

python.exe -m pip install pythonnet

Et sous Linux ou macOS

python3 -m pip install pythonnet

Attention !

Cette commande doit être exécutée en mode administrateur. Sous Windows, dans le menu Démarrer, clic droit sur l'application "invite de commandes" et choisir "exécuter en tant qu'administrateur".

Après avoir téléchargé le SDK de Home I/O compatible avec votre version de Python, vous pouvez tester le script ci-dessous.

import sys
import time
import clr

# Chargement de la bibliothèque Home I/O 
clr.AddReference('EngineIO')

from EngineIO import *

print("Home I/O & Python are such good friends thanks to pythonnet!")

# Création d'une variable associée à la lampe d'adresse 0
# (cf. nomenclature : https://docs.realgames.co/homeio/fr/memory-addresses/)
livingRoomLight = MemoryMap.Instance.GetBit(0, MemoryType.Output)

for i in range(5):
    # Modification de l'état de la lampe
    livingRoomLight.Value = not livingRoomLight.Value

    # Affichage de l'état de la lampe.
    print("Light is on? " + str(livingRoomLight.Value))

    # La méthode Update() écrit l'état de lampe (propriété value) dans l'objet MemoryMap
    MemoryMap.Instance.Update()
    
    # Attente d'une seconde
    time.sleep(1)

# Libération des ressources allouées
MemoryMap.Instance.Dispose()

print("Bye!")