MCZ Maestro et Jeedom

Bonjour, je n’arrive pas à trouver la valeur de la commande info pour connaitre la puissance en mode manuel.

J’ai réussi à récupérer les infos du poèle, mais je bloque sur l’envoi de commandes.

Je tente avec mqtt.publish, le poèle bipe mais rien ne change:

topic: SUBmcz
payload: {37,2}

Tu pourrais me dire comment tu as fait stp ?

Merci à toi

J’ai pas vraiment creuser pour l’instant pour gérer les puissances, ventilations et températures mais je te mets un exemple pour le marche/arrêt du poêle.

Dans configuration.yaml :

switch:
  - platform: mqtt
    unique_id: poeleonoff
    name: "Marche / Arret Poele"
    command_topic: "SUBmcz"
    payload_on: "34,1"
    payload_off: "34,40"
    state_on: "ON"
    state_off: "OFF"
    optimistic: false
    qos: 0
    retain: true

y’a surement moyen de faire mieux…

1 « J'aime »

Merci :slight_smile: je vais regarder, si je trouve d’autres moyens, je les indiquerai ici

Bonjour @Manouille

Moi aussi je suis en train d’essai connecter le poêle avec HA.
Je veux utiliser le plugin generic_thermostat pour ça et tous marche sauf demander la température.

Mon config:

# Switches
switch:
  - platform: mqtt
    unique_id: MCZ_POWER
    name: "MCZ Power"
    command_topic: "SUBmcz"
    qos: 0
    retain: true
    payload_on: "34,1"
    payload_off: "34,40"
    state_on: "ON"
    state_off: "OFF"

# Temperatuursensors
sensor:
  - platform: mqtt
    name: "Temperatuur Veranda"
    state_topic: "PUBmcz"
    unit_of_measurement: '°C'
    value_template: "{{ value_json['Température ambiante'] | is_defined }}"

#Thermostaat per ruimte
climate:
  - platform: generic_thermostat
    name: Kachel Veranda
    heater: switch.mcz_power
    target_sensor: sensor.temperatuur_veranda
    min_temp: 15
    max_temp: 25
    target_temp: 21
    cold_tolerance: 2
    hot_tolerance: 1
    initial_hvac_mode: "off"
    precision: 0.5

En Homebridge ça marche avec ce code mais je ne sais pas comment le traduire pour connecter avec HA.

                "setTargetTemperature": {
                    "topic": "SUBmcz",
                    "apply": "return \"42,\"+message;"
                }

Mes excuses pour le Français terrible…

1 « J'aime »

Je ne vais pas pouvoir t’aider, j’utilise HA depuis quelques mois seulement et je ne maitrise pas encore tout.
De plis, je ne gère pas les mises en marche et le thermostat de mon poêle avec HA. J’utilise la sonde wifi du poêle et le mode Thermostato.

Got it!

- id: '1605023600910'
  alias: Temperatuur Kachel Veranda
  description: ''
  trigger:
  - platform: state
    entity_id: climate.kachel_veranda
    attribute: temperature
  condition: []
  action:
  - service: mqtt.publish
    data:
      topic: SUBmcz
      retain: 'false'
      payload: 42,{{states.climate.kachel_veranda.attributes.temperature}}
  mode: single

Nice, good job dud !!!

Est ce que quelqu’un aurait déjà snifé la trame « Chronotermostato » dans l’appli maestro ?

Bonjour à tous,

je suis équipé d’un poêle Brisach Isola, qui est en fait un MCZ rebadgé(même groupe).
j’utilisait jusqu’à présent l’app Brisach, mais je suis dernièrement passé sur l’app MCZ Maestro qui fonctionne très bien.(et mieux que l’app brisach)

Seul soucis: il semblerait qu’il n’y ait pas de contrôle local possible → Obliger d’utiliser le remote control.(pas de control local disponible sur l’app brisach non plus)
Lorsque je connecte un raspi sur l’AP du poele, il obtient l’IP suivante : 192.168.1.2 et la passerelle 192.168.1.255

En faisant un nmap sur toute la plage 192.168.1.1/ -255 , seul 192.168.1.1 est ouvert port 80 (page web me permettant de rentrer les infos pour connecter le poele au wifi). Aucun port 81 d’ouvert.
Aucune réponse au ping sur 192.168.120.1

Il semblerait donc réellement qu’il ne puisse pas être connecté en local.

Est-ce que quelqu’un s’est déja penché sur la question du remote control ?
Je peux fournir des dumps des échanges avec les serveurs mcz.

J’avoue que j’aimerais particulièrement pouvoir domotiser ce poêle, son fonctionnement actuel ne me convenant pas et souhaitant avoir une intégration + poussée entre mon chauffage principal (poele) et mon chauffage secondaire de confort (les convecteurs electriques).
La piste du thermostat externe par contact sec n’est malheureusement pas réellement adaptée à un poele à granulé, bien que parfait pour l’électrique.

Merci,
Nicolas

1 « J'aime »

Bonjour,

J’ai renseigné une mauvaise valeur, et maintenant, je ne peux plus m’en servir… Il me marque dans "etat du poêle : [« Code inconnu : »,« 38 »]

Savez-vous comment je peux faire pour le réinitialiser ?

J’ai débranché et rebrancher le poêle, sans résultat.

D’avance merci.

Si tu passes par le brocker mqtt, l’info est peut-etre en « retain » dans le topic SUBmcz du broker Mqtt.
Connectes-toi avec MQTT Explorer et supprime cette info.

Hello,

Grace au post de @EtienneME, j’ai réussi à faire fonctionner l’envoi / réception de commande depuis les serveurs MCZ (nécéssaire pour les poêles Brisach). Merci aussi à @Anthony pour ce programme bien utile !

Je peux bien entendu partager le code avec ceux qui auraient besoin, mais avant ca une petite question:
Il semblerait que le programme envoie une commande vers le WS toutes les secondes. Cela est un comportement normal ? Pas de risques d’être considéré comme un « spammeur » par les serveurs brisach ?

Merci d’avance,
Nicolas

Edit: Du coup, j’ai mis une récupération toutes les 15 secondes (envoi de la commande C|RecuperoInfo) mais envoi instantané pour les commandes du poele.
Ca fonctionne au top depuis maintenant 12h. A suivre sur la durée.
Le code n’est pas très propre, mais je peux le partager avec ceux qui auraient besoin !

Je pense que tu peux même monter à 30 secondes si c’est pour de la lecture. C’est super si tu as pu communiquer avec les serveurs Mcz, tu peux partager ton code, c’est toujours interressant et instructif :wink:

il y a une raz sur github ? que se passe-t-il

Hello,

Voici le code! Surement possible de l’améliorer, c’est de la bidouille ! J’ai passé la récup à 30 sec, c’est top.
Once again, merci à @Anthony et @EtienneME .

Ca marche bien chez moi, stable et rapide. En cas de déconnection du wifi, j’avais des soucis à la reco (le message « join » n’était pas envoyé). Ca devrait normalement être bon, à voir à la prochaine déco.

#!/usr/bin/python3
#coding: utf-8

import paho.mqtt.client as mqtt
import time
import sys
import os
import json
import logging
import datetime
from logging.handlers import RotatingFileHandler
import websocket
try:
	import thread
except ImportError:
	import _thread as thread

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
file_handler = RotatingFileHandler('activity1.log', 'a', 1000000, 1)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
logger.addHandler(stream_handler)

class PileFifo(object):
    def __init__(self,maxpile=None):
        self.pile=[]
        self.maxpile = maxpile

    def empile(self,element,idx=0):
        if (self.maxpile!=None) and (len(self.pile)==self.maxpile):
            raise ValueError ("erreur: tentative d'empiler dans une pile pleine")
        self.pile.insert(idx,element)
 
    def depile(self,idx=-1):
        if len(self.pile)==0:
            raise ValueError ("erreur: tentative de depiler une pile vide")
        if idx<-len(self.pile) or idx>=len(self.pile):
            raise ValueError ("erreur: element de pile à depiler n'existe pas")
        return self.pile.pop(idx)
 
    def element(self,idx=-1):
        if idx<-len(self.pile) or idx>=len(self.pile):
            raise ValueError ("erreur: element de pile à lire n'existe pas")
        return self.pile[idx]
 
    def copiepile(self,imin=0,imax=None):
        if imax==None:
            imax=len(self.pile)
        if imin<0 or imax>len(self.pile) or imin>=imax:
            raise ValueError ("erreur: mauvais indice(s) pour l'extraction par copiepile")
        return list(self.pile[imin:imax])
 
    def pilevide(self):
        return len(self.pile)==0
 
    def pilepleine(self):
        return self.maxpile!=None and len(self.pile)==self.maxpile
 
    def taille(self):
        return len(self.pile)

Message_MQTT=PileFifo()
Message_WS=PileFifo()

# SIO CONNECT TO MCZ MAESTRO
from pprint import pprint
import socketio

sio = socketio.Client(logger=True, engineio_logger=True)
MCZ_device_serial = "vorenumdeserie"
MCZ_device_MAC = "votremac"
MCZ_App_URL = "http://app.mcz.it:9000"

_INTERVALLE = 1
_TEMPS_SESSION = 60

# MQTT
from _config_ import _MQTT_ip
from _config_ import _MQTT_port
from _config_ import _MQTT_TOPIC_SUB
from _config_ import _MQTT_TOPIC_PUB

from _config_ import _MQTT_authentication
from _config_ import _MQTT_user
from _config_ import _MQTT_pass

MQTT_MAESTRO = {}

logger.info('Lancement du deamon')
logger.info('Anthony L. 2019')
logger.info('Niveau de LOG : DEBUG')


def on_connect_mqtt(client, userdata, flags, rc):
	logger.info("Connecté au broker MQTT avec le code : " + str(rc))

def on_message_mqtt(client, userdata, message):
	logger.info('Message MQTT reçu : ' + str(message.payload.decode()))
	cmd = message.payload.decode().split(",")
	if cmd[0] == "42":
		cmd[1]=(int(cmd[1])*2)
	Message_MQTT.empile("C|WriteParametri|"+cmd[0]+"|"+str(cmd[1]))
	logger.info('Contenu Pile Message_MQTT : ' + str(Message_MQTT.copiepile()))
	send()

def secTOdhms(nb_sec):
	qm,s=divmod(nb_sec,60)
	qh,m=divmod(qm,60)
	d,h=divmod(qh,24)
	return "%d:%d:%d:%d" %(d,h,m,s)

@sio.event
def connect():
	pprint("Connected")
	pprint("SID is : {}".format(sio.sid))
	sio.emit(
	    "join",
	    {
	        "serialNumber": MCZ_device_serial,
	        "macAddress": MCZ_device_MAC,
	        "type": "Android-App",
	    },
	)
	sio.emit(
	    "chiedo",
	    {
	        "serialNumber": MCZ_device_serial,
	        "macAddress": MCZ_device_MAC,
	        "tipoChiamata": 0,
	        "richiesta": "RecuperoParametri",
	    },
	)
	sio.emit(
	    "chiedo",
	    {
	        "serialNumber": MCZ_device_serial,
	        "macAddress": MCZ_device_MAC,
	        "tipoChiamata": 1,
	        "richiesta": "C|RecuperoInfo",
	    },
	)

@sio.event
def disconnect():
	pprint("Disconnected")

@sio.event
def rispondo(response):
	pprint("Received 'rispondo' message")
	datas = response["stringaRicevuta"].split("|")
	from _data_ import RecuperoInfo
	for i in range(0,len(datas)):
			for j in range(0,len(RecuperoInfo)):
				if i == RecuperoInfo[j][0]:
					if len(RecuperoInfo[j]) > 2:
						for k in range(0,len(RecuperoInfo[j][2])):
							if int(datas[i],16) == RecuperoInfo[j][2][k][0]:
								MQTT_MAESTRO[RecuperoInfo[j][1]] = RecuperoInfo[j][2][k][1]
								break
							else:
								MQTT_MAESTRO[RecuperoInfo[j][1]] = ('Code inconnu :', str(int(datas[i],16)))
					else:
						if i == 6 or i == 26 or i == 28:
							MQTT_MAESTRO[RecuperoInfo[j][1]] = float(int(datas[i], 16))/2
						
						elif i >= 37 and i <=42:
							MQTT_MAESTRO[RecuperoInfo[j][1]] = secTOdhms(int(datas[i],16))
						else:
							MQTT_MAESTRO[RecuperoInfo[j][1]] = int(datas[i],16)
	logger.info('Publication sur le topic MQTT ' + str(_MQTT_TOPIC_PUB) + ' le message suivant : ' + str(json.dumps(MQTT_MAESTRO)))
	client.publish(_MQTT_TOPIC_PUB, json.dumps(MQTT_MAESTRO),1)

sio.connect(MCZ_App_URL)

logger.info('Connection en cours au broker MQTT (IP:'+_MQTT_ip + ' PORT:'+str(_MQTT_port)+')')
client = mqtt.Client()
if _MQTT_authentication == True:
	client.username_pw_set(username=_MQTT_user,password=_MQTT_pass)
client.on_connect = on_connect_mqtt
client.on_message = on_message_mqtt
client.connect(_MQTT_ip, _MQTT_port)
client.loop_start()
logger.info('Souscription au topic ' + str(_MQTT_TOPIC_SUB) + ' avec un Qos=1')
client.subscribe(_MQTT_TOPIC_SUB, qos=1)


def receive(*args):
	while True:
		time.sleep(30)
		logger.info("Envoi de la commande pour rafraichir les donnees")
		sio.emit(
		    "chiedo",
		    {
		        "serialNumber": MCZ_device_serial,
		        "macAddress": MCZ_device_MAC,
		        "tipoChiamata": 1,
		        "richiesta": "C|RecuperoInfo",
		    },
		)
			

def send():
	def run(*args):
		
		time.sleep(_INTERVALLE)
		if Message_MQTT.pilevide():
			Message_MQTT.empile("C|RecuperoInfo")
		cmd = Message_MQTT.depile()
		logger.info("Envoi de la commande : " + str(cmd))
		sio.emit(
		    "chiedo",
		    {
		        "serialNumber": MCZ_device_serial,
		        "macAddress": MCZ_device_MAC,
		        "tipoChiamata": 1,
		        "richiesta": cmd,
		    },
		)
			
	thread.start_new_thread(run, ())



Bonjour,

Merci pour cette info.
Cependant, lorsque je lance le programme, je reçois le message d’erreur:
ModuleNotFoundError: No module named ‹ socketio ›
Pourriez-vous m’aider?
Merci d’avance

Bonjour est-ce quelqu’un a les codes pour faire tourner la vis sans fin 120secondes comme dans l appli maestro mcz merci.

Voici mon module de gestion de pellet.
Il permet de rentrer dans son stock des sacs de pellet à différent prix, du coup il calcul un cout unitaire moyen pondéré pour la sortie en consommation.
Il suffit de cliquer sur Sac Consomme lorsque l’on met un sac dans le poele, et on clique 2 fois lorsque l’on met 2 sacs. La prochaine évolution sera de mettre un ESP sur le poele avec un bouton poussoir, il suffira d’appuyer sur le bouton poussoir pour mettre à jour le stock…

Tu peux aussi le faire sur ecopellets.fr - Ressources et information concernant ecopellets Resources and Information. et le plugin script