Page 1 of 1

[python] Meross MSG100 Cloud

Posted: Monday 02 November 2020 10:24
by frenchyyii
Hi, sorry because it's in french and not clean but it works.
If it can help someone (HellStorm666 ??)
(copy from my easydomoticz topic)

Bonjour, n'étant pas un fan des tutos celui ci pourra juste dépanner ceux qui chercheraient quelques réponses à l'intégration de la passerelle MEROSS MSG100, module qui permet de gérer ouverture/fermeture d'une porte de garage, de portail ou autre avec retour d'état. N'ayant besoin que du retour d'état pour le moment ce sera la seule partie dont je parlerai pour le moment.

Après avoir cherché ce qui pourrait fonctionner, je me suis basé sur la librairie python de Alberto Geniola (merci à lui et merci à sa réactivité)
https://github.com/albertogeniola/MerossIot

Le fonctionnement passer par du mqtt et du python puisque c'est ce qu'utilise Alberto Geniola. Voilà juste un petit peu d'adaptation à faire.
Je reprends juste et adapte un message d'ici de Ph.A qui lui traite des prises
https://easydomoticz.com/forum/viewtopi ... 022#p89022

Avant tout créez un dummy virtuel type interrupteur et modifiez le pour le passer en Blinds, Notez son ID pour le script plus tard.

Allez déjà installation des composantes si pas déjà fait
- python3.7 (reprise d'un message de Ph.A et ajouts)

Code: Select all

sudo apt update
sudo apt install -y python3.7
sudo apt-get install build-essential python3-dev libffi-dev
sudo apt install -y python3-gribapi
sudo apt install -y python3-eccodes
sudo apt install -y python3-distutils
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user
on vérifie que /home/pi/.local/bin se trouve dans la variable PATH avec la commande

Code: Select all

echo $PATH
Si elle n'est pas présente :

Code: Select all

nano .profile
export PATH=$HOME/.local/bin:$PATH
source ~/.profile
Installation de Meross-Iot (actuellement dernière release fonctionnelle et release mini nécessaire)

Code: Select all

pip install meross_iot==0.4.0.6
Si non présentes installez les librairies python nécessaires à l'utilisation du script
"import asyncio
import os
import json
import requests
import urllib.request"

Rendez-vous dans votre directory python par defaut pour pi (utilisez specifiquement ce directory si vous pouvez gerer les scripte time en python, il faudra alors renommer le script à venir "meross.py" en "script_time_meross.py")

Code: Select all

cd /home/pi/domoticz/scripts/python/
sudo nano meross.py
ou meross_gate.py par ex si vous utilisez autre chose que le gate openener
ou avec n'importe quel editeur
Attention ce n'est pas le même que Ph.A, tant au niveau des imports que dans la structure puisqu'il cela concerte un Gate opener !!!! y a les en plus ajouts requests et la modif Gate Opener (dev.is_open devenant dev.get_is_open)etc...)
Creez le script suivant et pensez à bien mettre vos user et pass de meross ainsi que ip:port et ID de domoticz

Code: Select all

import asyncio
import os
import json
import requests
import urllib.request

from meross_iot.controller.mixins.garage import GarageOpenerMixin
from meross_iot.http_api import MerossHttpClient
from meross_iot.manager import MerossManager

EMAIL = "votre_email_du_compte_meross"  
PASSWORD = "votre_pass_du_compte_meross"


async def main():
    # Setup the HTTP client API from user-password
    http_api_client = await MerossHttpClient.async_from_user_password(email=EMAIL, password=PASSWORD)

    # Setup and start the device manager
    manager = MerossManager(http_client=http_api_client)
    await manager.async_init()

    # Retrieve all the devices that implement the garage-door opening mixin
    await manager.async_device_discovery()
    openers = manager.find_devices(device_class=GarageOpenerMixin)

    if len(openers) < 1:
        print("No garage opener found...")
    else:
        dev = openers[0]

        # Update device status: this is needed only the very first time we play with this device (or if the
        #  connection goes down)
        await dev.async_update()

        # Check current door status
        open_status = dev.get_is_open()
        if open_status:
            print(f"Door {dev.name} is open") 
            requete='http://ip_domoticz:port/json.htm?type=command&param=switchlight&idx=ID_de_votre_switch&switchcmd=Off'
            urllib.request.urlopen(requete)
        else:
            print(f"Door {dev.name} is closed")
            requete='http://ip_domoticz:port/json.htm?type=command&param=switchlight&idx=ID_de_votre_switch&switchcmd=On'
            urllib.request.urlopen(requete)

        # To open the door, uncomment the following:
        #print(f"Opening door {dev.name}...")
        #await dev.open(channel=0)
        #print("Door opened!")
        #
        # Wait a bit before closing it again
        #await asyncio.sleep(5)
        #
        #print(f"Closing door {dev.name}...")
        #await dev.close()
        # print(f"Door closed!")

    # Close the manager and logout from http_api
    manager.close()
    await http_api_client.async_logout()

if __name__ == '__main__':
    # On Windows + Python 3.8, you should uncomment the following
    # asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()
Un petit

Code: Select all

sudo chmod +x meross.py
histoire de rendre executable

A ce stade normalement vous pouvez je pense déjà tester

Code: Select all

python3.7 meross.py
Logiquement ça devrait soit fonctionner soit vous dire ce qui déconne (je mets ces explications de mémoire)

Execution auto du script:
2 solutions:
- soit vous avez compilé et pouvez/savez utililer les script time .... c'est à vous
- soit il va falloir executer regulierement via un cron ou autre
pour tester au plus simple, et vu que je galère dans les cron python, je repique la fin de Ph.A (en mode pi et sous /scripts/python/)
Création du script sh qui va bien

Code: Select all

sudo nano /home/pi/domoticz/scripts/python/meross.sh

Code: Select all

#!/bin/bash
sudo -H -u pi /usr/bin/python3 /home/pi/domoticz/scripts/python/meross.py $1 $2
Je lui donne les droits +x via un

Code: Select all

sudo chmod +x /home/moi/domoticz/scripts/meross.sh
Un petit cron comme vous avez l'habitude de le faire (en sudo si vous bossez ainsi)

Code: Select all

crontab -e
et si par ex vous voulez executer toutes les minutes rajoutez le cron

Code: Select all

*/1 * * * * sh /home/pi/domoticz/scripts/python/meross.sh &
Voilà, je l'ai dit les tutos ce n'est pas mon truc et je n'ai pas trop le temps. Ca vous donnera déjà une base et au pire on modifiera/rectifiera et dépannera si il y a moyen. Et puis il faut aussi chercher à adapter hein :D Perso je n'y connais rien en code, je bidouille juste et je cherche.

Re: [python] Meross MSG100 Cloud

Posted: Monday 02 November 2020 10:25
by frenchyyii
Evolution du soir toujours à l'arrache mais ça fonctionne, ouverture et fermeture de la porte de garage via domoticz.
Ca outrepasse le code PIN donc attention à la sécurité.

En fait je vous conseille de créer deux autres dummies et ce coup ci en mode bouton poussoir afin que la lecture de l'état de la partie précédente ne perturbe pas les ordres.
Ca devrait ressembler à
Capture d’écran 2020-11-01 192856.png
Capture d’écran 2020-11-01 192856.png (42.7 KiB) Viewed 1015 times
Donc dummy, interrupteurs.... que l'on modifie en bouton push-on,
Premier dummy "Ouverture garage"
Délai d'extinction 1
à action on: script:///home/pi/domoticz/scripts/python/meross_gate_open.sh

idem avec un push-on "Fermeture Garage"
script:///home/pi/domoticz/scripts/python/meross_gate_close.sh

Coté scripts dans le même directory copiez et modifiez le sh que vous avez crée précédemment en première partie qui gérait l'état de la porte.
meross_gate_open.sh aura alors la forme

Code: Select all

#!/bin/bash
sudo -H -u pi /usr/bin/python3 /home/pi/domoticz/scripts/python/meross_gate_open.py $1 $2
on fait pareil avec un meross_gate_close.sh

Code: Select all

#!/bin/bash
sudo -H -u pi /usr/bin/python3 /home/pi/domoticz/scripts/python/meross_gate_close.py $1 $2
On passe aux pythons... reprenez et copiez le python meross.py (perso je vais remodifier en l'appelant meross_status.py)
Un premier sera nommé meross_gate_open.py, le second meross_gate_close.py
Modifiez les lignes 47 à 57 comme tel:

Code: Select all

   # To open the door, uncomment the following:
        print(f"Opening door {dev.name}...")
        await dev.async_open(channel=0)
        print("Door opening!")
        #
        # Wait a bit before closing it again
        await asyncio.sleep(5)
        #
        #print(f"Closing door {dev.name}...")
        #await dev.async_close()
        # print(f"Door closing!")
Pour meross_gate_close.py

Code: Select all

        # To open the door, uncomment the following:
        #print(f"Opening door {dev.name}...")
        #await dev.async_open(channel=0)
        #print("Door opened!")
        #
        # Wait a bit before closing it again
        await asyncio.sleep(5)
        #
        print(f"Closing door {dev.name}...")
        await dev.async_close()
        print(f"Door closed!")
allez on rend tout ça exécutable

Code: Select all

sudo chmod +x meross_gate_open.py
sudo chmod +x meross_gate_close.py
sudo chmod +x meross_gate_open.sh
sudo chmod +x meross_gate_close.sh
Et c'est parti....