[Plugin] Xiaomi Air Purifier 3H & 3C

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Deufo
Messages : 280
Inscription : 26 févr. 2019, 16:25

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par Deufo »

Ah oui, favorite level est pour le 3H.
Il y a un paramètre dans la librairie qui n'est pas utilisé par le plugin, c'est favorite_rpm, il pourrait faire ce que tu as besoin, je regarde pour tester et l'ajouter.
Deufo
Messages : 280
Inscription : 26 févr. 2019, 16:25

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par Deufo »

Alors, avec le 3H, je peux le piloter via favorite_rpm mais pas le relire donc c'est compliqué par rapport à la structure du plugin, de toute façon, c'est redondant avec le favorite_level dans le fonctionnement (15 niveaux).
Je l'ai donc ajouté uniquement pour le 3C.
Pour tester, il faut prendre le code ici : https://github.com/SylvainPer/DomoticzX ... /plugin.py

Merci pour le retour.
ErwaN_89
Messages : 12
Inscription : 19 oct. 2019, 17:56

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par ErwaN_89 »

Merci Deufo pour ton retour.

Mon retour rapide sur le plugin.
Voici mes ajouts au code pour la variation de vitesse pour le model 3C

C'est sensiblement le même mais je ne dépasse pas au dessus d'une valeur de 2100 pour la vitesse du ventilateur car cela ne fonctionne pas (alors que l'api affirme l'inverse)

N'étant pas un expert python, j'ai fait ça rapidement et je pense que ça peut être amélioré ;-)

Dispo pour en discuter.

Code : Tout sélectionner


def MapStatusToRpm(self, unit, status):
        try:
            value = None
            text = None
            if "map_status_value" in unit.keys():
                mapStatusValue = unit["map_status_value"]
                if mapStatusValue == None:
                    value = status
                elif type(mapStatusValue) is int:
                    value = mapStatusValue
                else:
                    value = mapStatusValue(self, unit, status)
            else:
                value = status

            if "map_status_text" in unit.keys():
                mapStatusText = unit["map_status_text"]
                if mapStatusText == None:
                    status = max(0,min(100, (status-300)/ 18 ))
                    text = str(status)
                elif type(mapStatusText) is str:
                    text = mapStatusText
                elif type(mapStatusText) is dict:
                    text = unit["map_status_text"][status]
                else:
                    text = mapStatusText(self, unit, status)
            else:
                status = max(0,min(100, (status-300) / 18 ))
                text = status
        except Exception as updateError :
            Domoticz.Error("MapEnumStatus: " + repr(updateError))
            
             return {
            "value": value,
            "text": text
        }

 def MapLevelToRpm(self, unit, command, level):
        field = unit["bindingStatusField"]
        status_old = getattr(self.status, field)
        status_new = level

        mapLevelStatus = unit["map_level_status"]
        if mapLevelStatus != None:
            status_new = mapLevelStatus(self, unit, level)
            if status_new == status_old:
                Domoticz.Log("The command is consistent with the status:" + str(command))
                return None

        method = unit["map_level_method"]
        method = rgetattr(self, method)
        param = level

        param = round( param * 18 + 300,-1)

        mapLevelParam = unit["map_level_param"]
        if mapLevelParam != None:
            param = mapLevelParam(self, unit, param)

        try :
            result = method(param)

            Domoticz.Log("Method call result:" + str(result))
            Domoticz.Log("ERWAN2:" + str(param))
            if (result[0]['code'] == 0):
                return param

        except Exception as updateError :
            Domoticz.Error("MapLevelToRpm: " + repr(updateError))


        return None
        
        Ajouter à  __UNITS_C = 
        
        [...]
        
         {
            "_Name": "AirPurifier_Favorite_RPM",
            "_Unit": __UNIT_FAVORITE_LEVEL,
            "_TypeName": "Dimmer",
            # Selector Switch / Dimmer
            #"_Switchtype": 7,
            "_Image": 7,
            "_Options": None,
            "bindingStatusField": "favorite_rpm",
            "mapStatus": MapStatusToRpm,
            "map_status_value": 2,
            "map_status_text": None,
            "mapCommand": MapLevelToRpm,
            "map_level_status": None,
            "map_level_method": "miio.set_favorite_rpm",
            "map_level_param": None
        }
Deufo
Messages : 280
Inscription : 26 févr. 2019, 16:25

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par Deufo »

Peux-tu me dire ce que ça fait exactement pour une consigne entre 2100 et 2300 ?
Un message d'erreur ? rien ?
L'information AirPurifier_Motor_speed donne quoi ?
Merci.

J'ai fait le test sur mon 3H, je peux monter à 2200 sans souci, j'ai un code -4005 au dessus.
ErwaN_89
Messages : 12
Inscription : 19 oct. 2019, 17:56

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par ErwaN_89 »

J'ai remplacé ma valeur 18 par 19 (pour faire un max de 2200)
- ça fonctionne bien avec un retour AirPurifier_Motor_speed pour 100% de 2198rpm

Avec la valeur de 20 (donc un max de 2300) pas de réponse et pas de message d'erreur de l'api comme il y a lorsqu'on envoie une valeur inf a 300 et sup à 2300 ou modulo de 10 non null ;-)

Voici ma formule pour obtenir le ratio : ( (2200-300) / 100 )* "le pourcentage que l'utilisateur souhaite" + 300 )
Deufo
Messages : 280
Inscription : 26 févr. 2019, 16:25

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par Deufo »

Ok, merci pour le retour.
Je vais mettre le calcul à jour, il faut garder des multiples de 10, je vais laisser 20 en facteur et mettre un max à 2200, les 5 derniers pourcents seront sans effet mais rien de grave.
ErwaN_89
Messages : 12
Inscription : 19 oct. 2019, 17:56

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par ErwaN_89 »

Re, le problème du "sans effet" c'est imaginons qu'un utilisateur souhaite passer de 0% à 100%. Il ne se passera donc, rien, mais son élément sera bien à 100%. ça lèvera une incohérence ici. ;-)
Deufo
Messages : 280
Inscription : 26 févr. 2019, 16:25

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par Deufo »

Non, c'est juste que de 95 à 100%, ça sera bridé à 2200, personne ne s'en rendra compte.
ErwaN_89
Messages : 12
Inscription : 19 oct. 2019, 17:56

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par ErwaN_89 »

Parfait alors ! "La cause avance ;-) "
Maintenant, on peut lancer le débat de l'utilité / performance du produit :twisted:
fkz
Messages : 1
Inscription : 06 juin 2021, 22:12

Re: [Plugin] Xiaomi Air Purifier 3H & 3C

Message par fkz »

Bonjour!
Le plugin fonctionne. Je n'aime pas mon journal d'erreurs :
Erreur : (Purificateur d'air Xiaomi) ​​UpdateStatus : DeviceError ({'code' : -9999, 'message' : 'user ack timeout'})
Je veux l'éliminer ! Que faire?
Répondre