Page 2 sur 4
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 04 juin 2021, 15:32
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.
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 04 juin 2021, 16:23
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.
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 18:53
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
}
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 19:11
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.
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 19:25
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 )
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 19:56
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.
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 20:25
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.

Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 20:36
par Deufo
Non, c'est juste que de 95 à 100%, ça sera bridé à 2200, personne ne s'en rendra compte.
Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 05 juin 2021, 20:54
par ErwaN_89
Parfait alors ! "La cause avance

"
Maintenant, on peut lancer le débat de l'utilité / performance du produit

Re: [Plugin] Xiaomi Air Purifier 3H & 3C
Publié : 06 juin 2021, 22:15
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?