Doubledom45 / HA-2024.3-RFPLAYER

đŸ’„Test RFPLAYER EN HA 2024.3 Seulement pour TESTEUR ⛔
MIT License
0 stars 1 forks source link

Sensors X2D: multiple sensors par detecteur information au sujet de l'etat non presente ? #1

Closed jaroslawp closed 3 months ago

jaroslawp commented 3 months ago

La nouvelle version d'integration produit 5 sensors pour chaque detecteur X2D: x2d_2679630080typ, x2d_2679630080d0, x2d_2679630080d1, x2d_2679630080d2, x2d_2679630080d3 la ou ancienne version de GCE Electronics produisait un seul sensor: x2d_2679630080 Est-ce que le 'typ' 'd0' 'd1' 'd2' 'd3' ne devrait pas etre plus tot les attributes d'un seul sensor ?

En plus - bien que la doc (https://github.com/Doubledom45/TEST-RFPLAYER/blob/main/Information/rfplayer_api_v1.8.pdf, page 31, 5.2.2.18 InfosType 11) mentionne que l'information est a recuperer dans les flags d0,d1,d2,d3,d4, etc ... ceci ne semble pas etre le cas des sensor X2D DeltaDore Tyxal MicroCOBX:

Ce detecteur peut envoyer 3 messages:

.. mais les informations ne se trouvent pas dans les flags (d1 ou d4) mais dans les champs 'qualifier' et 'qualifierMeaning : { flags }': donc implementation actuelle ne me donne pas d'information au sujet de l'etat du detecteur... (dans la version de GCE Elctronics : https://github.com/gce-electronics/HA_RFPlayer/blob/main/custom_components/rfplayer/rflib/rfpparser.py#L108 ceci etait pris en compte)

Message assoc/test:

2024-03-17 10:30:13.763 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-93", "floorNoise": "-100", "rfQuality": "2", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "16", "qualifierMeaning": { "flags": ["TEST/ASSOC"]}, "d0": "64528", "d1": "177", "d2": "0", "d3": "0"}}}

Message ouverture:

2024-03-17 10:30:56.395 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-93", "floorNoise": "-104", "rfQuality": "2", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "2", "qualifierMeaning": { "flags": ["Alarm"]}, "d0": "509", "d1": "0", "d2": "0", "d3": "0"}}}

Message fermeture:

2024-03-17 10:31:01.995 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-82", "floorNoise": "-103", "rfQuality": "5", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "0", "qualifierMeaning": { "flags": []}, "d0": "16893", "d1": "0", "d2": "0", "d3": "0"}}}
Doubledom45 commented 3 months ago

Tu veux dire que tu voudrais récupérer que le qualifier ou la partie flags ou seulement le d0 ( il y a du d1)? Mais seulement pour ce type X2D Il faut voir comment le différencier ?

jaroslawp commented 3 months ago

Le 'd0' ne donne pas trop d;information permettant de definir l'etat du sensor ('TamperFlag') .. ca fluctue entre les valeurs ~ 16000 , ~ 500 et 0 (sans savoir que ceci veut dire .... et quels sont les valeurs exactes attandues...). Je pense que optimal serait de recuperer le 'qualifier' (et peut etre aussi 'qualifier flags') en plus de flags 'd' - sans differencier le type de sensor X2D et sans changer ce qui est recupere a present.

Pour la question est-ce que ca devrait etre plustot en attributes d'un seul sensor ou presente comme sensors a part je pense que c;est ton choix comme le developeur de l'integration..

Doubledom45 commented 3 months ago

Regarde comment est fait la déclaration des senseurs dans la partie du fichier infotypes.py def infoType_11_decode pour le x2d

jaroslawp commented 3 months ago

Merci pour info, une simple modification:

--- rflib/infotypes.py.org
+++ rflib/infotypes.py
@@ -341,6 +341,7 @@
     fields_found["subType"]=infos.get("subTypeMeaning")
     if fields_found["subType"] == None or fields_found["subType"] == "" : fields_found["subType"]=infos.get("subType")
     fields_found["qualifier"]=infos["qualifier"]
+    fields_found["flags"]=''

     elements={'functionMeaning':'','stateMeaning':'','modeMeaning':'','d0':'','d1':'','d2':'','d3':''}
     for measure,value in infos.items():
@@ -350,6 +351,7 @@
                 fields_found[measure+'_unit']= elements[measure]

     if 'flags' in infos['qualifierMeaning']:
+        fields_found['flags']=",".join(infos['qualifierMeaning']['flags'])
         for flag in infos['qualifierMeaning']['flags']:
             fields_found[flag]=1

--- rflib/rfpparser.py.org
+++ rflib/rfpparser.py
@@ -44,6 +44,8 @@
     "fnc":"functionMeaning",
     "sta":"stateMeaning",
     "mod":"modeMeaning",
+    "qua":"qualifier",
+    "fla":"flags",
     "d0":"d0",
     "d1":"d1",
     "d2":"d2",

me permet d'obtenir l'etat du detecteur dans home assistant .. le seul bemol: maintenant ca genere 7 entites par detecteur ...ca serait probablement mieux de generer une entite avec 7 attributs ? (mais ca serait une grosse modification du code affectant autres protocoles aussi ...). [ pour le champ 'flags' -> je ne sais pas si il peut y avoir des valeurs multiples - mes detecteurs y rapportent toujours une seule .. donc pour automatismes dans hassio je vais utliiser la valeur numerique du 'qualifier' ]

Doubledom45 commented 3 months ago

+ fields_found["flags"]='' ne doit pas servir car on remet Ă  vide la totale au dĂ©but par fields_found = {} AprĂ©s il faut que tu me montres un Packet pour que je test , avec le Packet : ZIA33{ "frame" :{"header": { Il faut voir ce que tu veux remonter, on peut tester le subTypeMeaning== Detector/Sensor, pour avoir seulement ce qui peut ĂȘtre intĂ©ressant ! Mais a vĂ©rifier pour autre X2D ?

PS et voir fields_found[flag]=1 si tu récupÚres directement la valeur ?

Doubledom45 commented 3 months ago

Modification seulement dans rflib/infotypes.py

    if 'flags' in infos['qualifierMeaning']:
        for flag in infos['qualifierMeaning']['flags']:
> +         fields_found["command"]=flag
            fields_found[flag]= 1

    fields_found["id"]=infos["id"]

Ou si test du Detector/Sensor peut-ĂȘtre plus sĂ»r ?

    if 'flags' in infos['qualifierMeaning']:
        for flag in infos['qualifierMeaning']['flags']:
> +         if fields_found["subType"] == "Detector/Sensor" : fields_found["command"]=flag
            fields_found[flag]= 1

Tu auras le cmd qui remonte l'info, c'est sĂ»r que peut-ĂȘtre trop d'info avec les dx !

X2D 2662852864cmd     Alarm
X2D 2662852864        d0509
X2D 2662852864d1      0
X2D 2662852864d2      0
X2D 2662852864d3      0
X2D 2662852864typ     Detector/Sensor

Pour n'avoir que ceux que l'on veut voir:

dans la déclaration de l'info Type 11, on déclare elements avec les sensors qu'on a besoin !

def infoType_11_decode(infos:list,allowEmptyID:bool=False) -> list:
    if infotypes_debug: log.debug("Decode InfoType 11 : %d",infos)
    fields_found = {}

    fields_found["subType"]=infos.get("subTypeMeaning")
    if fields_found["subType"] == None or fields_found["subType"] == "" : fields_found["subType"]=infos.get("subType")
    fields_found["qualifier"]=infos["qualifier"]

    if 'flags' in infos['qualifierMeaning']:
        for flag in infos['qualifierMeaning']['flags']:
            if fields_found["subType"] == "Detector/Sensor" : fields_found["command"]=flag
            fields_found[flag]=1
            elements={'d0':'','d1':''}
    else:
        elements={'functionMeaning':'','stateMeaning':'','modeMeaning':'','d0':'','d1':'','d2':'','d3':''}
    for measure,value in infos.items():
        if measure in elements:
            fields_found[measure] = value
            if elements[measure] != '':
                fields_found[measure+'_unit']= elements[measure]

    fields_found["id"]=infos["id"]

    if fields_found["id"]!="0" or allowEmptyID:
        return fields_found

image👉image

jaroslawp commented 3 months ago

Oui, ceci va fonctionner aussi bien sur (dans le cas de fermeture du detecteur le XXXXcmd va etre vide : "") mais peut-etre il serait mieux d'utiliser: fields_found["status"]=flag au lieu de fields_found["command"]=flag (donc obtenir XXXXsta pas XXXXcmd comme ce qui est rapporte c'est un statut ? - en meme temps ceci serait homogene avec ce que une Starbox utilsant InfoType_10 rapporte -> son mode actuel de fonctionnement est dans XXXXsta) Bien que dans mon cas les champs 'd2' et 'd3' rapportent toujours '0' peut-etre ca pourrrait etre utile pour autres types de detecteurs X2D donc faudrait pas les eliminer ?

def infoType_11_decode(infos:list,allowEmptyID:bool=False) -> list:
    if infotypes_debug: log.debug("Decode InfoType 11 : %d",infos)
    fields_found = {}

    fields_found["subType"]=infos.get("subTypeMeaning")
    if fields_found["subType"] == None or fields_found["subType"] == "" : fields_found["subType"]=infos.get("subType")
    fields_found["qualifier"]=infos["qualifier"]

    if 'flags' in infos['qualifierMeaning']:
        for flag in infos['qualifierMeaning']['flags']:
            if fields_found["subType"] == "Detector/Sensor" : fields_found["status"]=flag
            fields_found[flag]=1

     elements={'functionMeaning':'','stateMeaning':'','modeMeaning':'','d0':'','d1':'','d2':'','d3':''}
    for measure,value in infos.items():
        if measure in elements:
            fields_found[measure] = value
            if elements[measure] != '':
                fields_found[measure+'_unit']= elements[measure]

    fields_found["id"]=infos["id"]

    if fields_found["id"]!="0" or allowEmptyID:
        return fields_found

(plus le mapping: "qua":"qualifier", dans rfpparser.py: comme ceci on peut utliser directement la valeur numerique: laquelle etait converti en texte dans ancienne version de l'integration -> DTC_STATUS_LOOKUP - c'est qui n;'st plus le cas? )

Doubledom45 commented 3 months ago

Slt. Pour le qualifier, je ne vois pas trop l'interet car il est déjà traduit dans le "qualifierMeaning": { "flags": ["TEST/ASSOC"] ou ["Alarm"] ou []} Ce qui correspond au bit comme dans la doc suivant le subtype ! Avec les valeurs des dx associé ?

qualifier SubType=0 D0 : Tamper Flag, D1: Alarm Flag, D2: Low Batt Flag, D3: - , D4: Test/Assoc D5 : Domestic frame D7:6 : X2D variant

SubType=1 On : 1 Off : 2 Stop : 3

Message assoc/test:

2024-03-17 10:30:13.763 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-93", "floorNoise": "-100", "rfQuality": "2", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "16", "qualifierMeaning": { "flags": ["TEST/ASSOC"]}, "d0": "64528", "d1": "177", "d2": "0", "d3": "0"}}}

ICI Qualifier =16 en binaire 00010000 donc bit 4 => D4: Test/Assoc

Message ouverture:

2024-03-17 10:30:56.395 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-93", "floorNoise": "-104", "rfQuality": "2", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "2", "qualifierMeaning": { "flags": ["Alarm"]}, "d0": "509", "d1": "0", "d2": "0", "d3": "0"}}}

ICI Qualifier =2 en binaire 00000010 donc bit 1 => D1: Alarm Flag

Message fermeture:

2024-03-17 10:31:01.995 DEBUG (MainThread) [custom_components.rfplayer.rflib.rfpparser] Packet : ZIA33{ "frame" :{"header": {"frameType": "0", "cluster": "0", "dataFlag": "1", "rfLevel": "-82", "floorNoise": "-103", "rfQuality": "5", "protocol": "8", "protocolMeaning": "X2D", "infoType": "11", "frequency": "868350"},"infos": {"subType": "0", "subTypeMeaning": "Detector/Sensor", "id": "2662852864", "qualifier": "0", "qualifierMeaning": { "flags": []}, "d0": "16893", "d1": "0", "d2": "0", "d3": "0"}}}

ICI Qualifier =0 en binaire 00000000 donc aucun bit Ă  1 => ""

jaroslawp commented 3 months ago

Oui, un de deux - qualifier ou qualifierMeaning sera suffisant pour determiner l'etat du detecteur.

Doubledom45 commented 3 months ago

(plus le mapping: "qua":"qualifier", dans rfpparser.py:

Si je fais cela , le qualifier va remonter automatiquement dans chaque entité qui en ont un ? donc encore un de plus ! image Alors qu'il faudrait faire un test sur ce qualifier pour remonter un stat ou cmd avec la bonne valeur traduite, donc ici le flag !

jaroslawp commented 3 months ago

Oui, en effet. La valeur etait traduite dans l'ancienne version de l'integration ? Mais si c;est un probleme pour les autres protocoles juste remonter le fla sera suffisant: image

Doubledom45 commented 3 months ago

Slt.. J'ai fais une mise Ă  jour:

Ajout retour divers Ajout :

  • retour PING
  • retour EDISIOFRAME en cours de dĂ©codage
  • PossibilitĂ© de DIM en % [ en cours]
  • j'ai ajoutĂ© aussi le flag [ sur autre avant]

imageimage

image

jaroslawp commented 3 months ago

Merci, ca marche pour moi ! (bon, toujours le petit probleme de initialisation - https://github.com/Doubledom45/TEST-RFPLAYER/issues/4 - je vois que tu as ajoute une copie d'initialisation dans connection_made() - mais juste le fait que init_commands() se termine pour moi avec exception python resulte en 'initialization failed')