Format payload incorrect

Bonjour,
Je suis en train d’essayer de faire fonctionner une interface CAN-MQTT sur la base de code:
nopnop2002/esp-idf-can2mqtt: CANbus to mqtt bridge using esp32 (github.com)
Le Topic arrive bien sur le broker, mais aussi bien MQTT Explorer que JMQTT en temps réel affiche une payload incorrecte.


En essayant avec Mosquitto-sub sur un laptop, en utilisant le code suivant:

mosquitto_sub -h 10.0.0.25 -p 1883 -t '/BMS/#' -F %X -d

je récupère bien la payload attendue:

En echangeant avec le developpeur, il m’indique de choisir le format unsigned int pour les valeurs reçues…mais je ne sais pas comment modifier celà dans JEEDOM.

Pour info, je récupère la trame CAN d’un BMS gérant des batteries lithium qui m’indique le SOC du pack de batteries. Il s’agit uniquement des 2 premiers bytes codés en Hex, soit 49 sur le message capturé à l’ecran qui correspond à 73% de SOC

Merci d’avance pour votre aide!

Hello @ericgrand,

C’est parfaitement normal que tu reçoives des choses différentes entre cette commande et MQTT Explorer / jMQTT, car tu utilises le commutateur -F %X qui formate les données reçues en binaires en hexadécimal (cf man page de mosquitto_sub).

Que reçois-tu dans jMQTT ? Tu as des logs ?
Normalement je passe tout ce qui n’est pas décodable en UTF8 en base64.

Bad

Pour info

Vu, merci.

@ericgrand, le dev semble vouloir rester sur des payloads binaire, jMQTT ne l’acceptera pas tel quel…
Peux-tu me donner des logs en debug de ce que tu reçois dans jMQTT (logs jMQTT, jMQTT_tonbroker et jMQTTd) ?

Cette autre code qui fait globalement la même chose, mais dispose de « convert-mode » :

Qu’en dis-tu ? Je te laisse essayer le code de cette autre repository, si tu n’as pas besoin de faire du MQTT → CAN, et/ou en discuter avec le dev.

Bad

Merci pour le support rapide, j’apprecie beaucoup!
Concernant les logs, les 2 premiers sont vides, JMQTTd contient les infos suivantes pour l’equipement créé depuis le monitoring en temps réel:

3899|[2023-11-26 18:58:21,894][INFO] Client462       Brk462Th        on_message() : Message received (topic="/BMS/SOC", payload="I", QoS=1, retain=False)
3900|[2023-11-26 18:58:21,895][DEBUG] JMsg.Snd        Brk462Th        send_async() : Enqued the message in 0.004768ms (qToJ size 1): {'cmd': 'messageIn', 'id': '462', 'topic': '/BMS/SOC', 'payload': 'I\x01\x00\x00\x00\x06\x00\x00', 'qos': 1, 'retain': False}
3901|[2023-11-26 18:58:21,941][DEBUG] JMsg.Snd        SockOut           _loopSnd() : Sending 1 messages (0 left in queue)

Concernant l’autre code, c’est la source utilisée par le developpeur de celui que j’utilise.
Malheureusement, mon absence de compétences en code m’empêche de transposer ce code vers quelque chose de fonctionnel, utilisable facilement sur un arduino ou un ESP32…

Je vais voir si j’arrive à comprendre comment tout celà fonctionne et si j’arrive à adapter celà.
En toute rigueur, je n’ai pour l’instant besoin que de transférer des données CAN vers JEEDOM.
Celà paraissait la solution parfaite, mais je n’ai pas capté les subtilités associées concernant le format du message…

Merci pour ton retour.

On voit bien dans les logs que le daemon jMQTT reçoit et transmet le message.
Ce message contenant des caractères non affichables, c’est normal que tu n’ais pas l’impression de recevoir le bon message.

Je fini un truc, puis essayer un truc tordu et je te dis :sunglasses:
Tu es dans quelle version de Jeedom et jMQTT ?

Bad

Ok, j’ai fait un truc sale, mais ça marche :sunglasses:

Setup :

La commande info utilise la « Formule de calcul » suivante bin2hex(#value#) :
image

Et quand je send tes data :

BIIIIIMMMM !
Si je passe la commande info en Numérique, ça ne marche pas vraiment, c’est tronqué à 30.

Mais je me disais que tu aimerais plutôt la valeur décodée correspondant à cet unsigned integer ?
Donc j’ai essayé avec la formule current(unpack("Q",#value#)) pour unpack un uint64 et récup la première (et unique) valeur du tableau retourné par unpack() avec current(), mais le Core se vautre sur l’array intermédiaire.

Trop long à lire
0000|[884030] PHP Warning:  strpos() expects parameter 1 to be string, array given in /var/www/html/core/class/scenarioExpression.class.php on line 1343
0001|[884053] PHP Stack trace:
0002|[884059] PHP   1. {main}() /var/www/html/plugins/jMQTT/core/php/callback.php:0
0003|[884068] PHP   2. jMQTTComFromDaemon::msgIn($id = '359', $topic = 'topic116244/raw', $payload = 'I\\001\\000\\000\\000\\006\\000\\020', $qos = 0, $retain = FALSE) /var/www/html/plugins/jMQTT/core/php/callback.php:117
0004|[884076] PHP   3. jMQTT->brokerMessageCallback($msgTopic = 'topic116244/raw', $msgValue = 'I\\001\\000\\000\\000\\006\\000\\020', $msgQos = 0, $msgRetain = FALSE) /var/www/html/plugins/jMQTT/core/class/jMQTTComFromDaemon.class.php:384
0005|[884080] PHP   4. jMQTTCmd->updateCmdValue($value = 'I\\001\\000\\000\\000\\006\\000\\020') /var/www/html/plugins/jMQTT/core/class/jMQTT.class.php:2072
0006|[884109] PHP   5. jMQTT->checkAndUpdateCmd($_logicalId = class jMQTTCmd { private $_preSaveInformations = NULL; protected $id = '9145'; protected $logicalId = ''; protected $generic_type = ''; protected $eqType = 'jMQTT'; protected $name = 'rec'; protected $order = '0'; protected $type = 'info'; protected $subType = 'string'; protected $eqLogic_id = '467'; protected $isHistorized = '0'; protected $unite = ''; protected $configuration = ['topic' => 'topic116244/raw', 'jsonPath' => '', 'minValue' => '', 'maxValue' => '', 'timeline::enable' => '0', 'timeline::folder' => '', 'influx::enable' => '0', 'influx::namecmd' => '', 'influx::nameEq' => '', 'influx::nameVal' => '', 'interact::auto::disable' => '0', 'calculValueOffset' => 'current(unpack("Q",#value#))', 'jeedomCheckCmdOperator' => '==', 'jeedomCheckCmdTest' => '', 'jeedomCheckCmdTime' => '', 'historyPurge' => '', 'denyValues' => '', 'returnStateValue' => '', 'returnStateTime' => '', 'repeatEventManagement' => 'never', 'jeedomPushUrl' => '', 'alert::messageReturnBack' => '0', 'actionCheckCmd' => [...], 'jeedomPreExecCmd' => [...], 'jeedomPostExecCmd' => [...], 'historizeRound' => '', 'historizeMode' => 'avg']; protected $template = '{"dashboard":"core::default","mobile":"core::default"}'; protected $display = '{"invertBinary":"0","showNameOndashboard":"1","showNameOnmobile":"1","showIconAndNamedashboard":"0","showIconAndNamemobile":"0","forceReturnLineBefore":"0","forceReturnLineAfter":"0","parameters":[],"showStatsOnmobile":0,"showStatsOndashboard":0}'; protected $value = ''; protected $isVisible = '1'; protected $alert = '{"warningif":"","warningduring":"","dangerif":"","dangerduring":""}'; protected $_collectDate = '2023-11-26 23:06:20'; protected $_valueDate = '2023-11-26 23:06:20'; protected $_eqLogic = class jMQTT { private $_preSaveInformations = NULL; private $_preRemoveInformations = NULL; private $_broker = NULL; private $_statusCmd = NULL; private $_connectedCmd = NULL; protected $id = '467'; protected $name = 'Topic 116244'; protected $logicalId = ''; protected $generic_type = NULL; protected $object_id = '3'; protected $eqType_name = 'jMQTT'; protected $isVisible = '0'; protected $isEnable = '1'; protected $configuration = '{"type":"eqpt","eqLogic":"359","createtime":"2023-11-26 22:28:33","auto_add_cmd":"0","auto_add_topic":"topic116244\\\\/#","Qos":"","battery_type":"","battery_cmd":"","availability_cmd":"","commentaire":"","icone":"","updatetime":"2023-11-26 22:30:03"}'; protected $timeout = NULL; protected $category = '{"heating":"0","security":"0","energy":"0","light":"0","opening":"0","automatism":"0","multimedia":"0","default":"0"}'; protected $display = '{"backGraph::info":0}'; protected $order = '9999'; protected $comment = NULL; protected $tags = NULL; protected $_debug = FALSE; protected $_object = NULL; protected $_needRefreshWidget = FALSE; protected $_timeoutUpdated = FALSE; protected $_batteryUpdated = FALSE; protected $_changed = FALSE; protected $_cmds = [...] }; protected $_needRefreshWidget = NULL; protected $_needRefreshAlert = NULL; protected $_changed = FALSE }, $_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_updateTime = *uninitialized*) /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php:129
0007|[884125] PHP   6. jMQTTCmd->formatValue($_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_quote = *uninitialized*) /var/www/html/core/class/eqLogic.class.php:664
0008|[884130] PHP   7. jeedom::evaluateExpression($_input = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = *uninitialized*) /var/www/html/core/class/cmd.class.php:1010
0009|[884134] PHP   8. scenarioExpression::setTags($_expression = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = NULL, $_quote = TRUE, $_nbCall = *uninitialized*) /var/www/html/core/class/jeedom.class.php:1383
0010|[884139] PHP   9. scenarioExpression::setTags($_expression = 'unpack("Q","I\\001\\000\\000\\000\\006\\000\\020")', $_scenario = NULL, $_quote = TRUE, $_nbCall = 0) /var/www/html/core/class/scenarioExpression.class.php:1297
0011|[884143] PHP  10. strpos($haystack = [1 => 1152928101676613961], $needle = ' ') /var/www/html/core/class/scenarioExpression.class.php:1343
0012|[884150] PHP Warning:  trim() expects parameter 1 to be string, array given in /var/www/html/core/class/scenarioExpression.class.php on line 1344
0013|[884153] PHP Stack trace:
0014|[884156] PHP   1. {main}() /var/www/html/plugins/jMQTT/core/php/callback.php:0
0015|[884160] PHP   2. jMQTTComFromDaemon::msgIn($id = '359', $topic = 'topic116244/raw', $payload = 'I\\001\\000\\000\\000\\006\\000\\020', $qos = 0, $retain = FALSE) /var/www/html/plugins/jMQTT/core/php/callback.php:117
0016|[884164] PHP   3. jMQTT->brokerMessageCallback($msgTopic = 'topic116244/raw', $msgValue = 'I\\001\\000\\000\\000\\006\\000\\020', $msgQos = 0, $msgRetain = FALSE) /var/www/html/plugins/jMQTT/core/class/jMQTTComFromDaemon.class.php:384
0017|[884168] PHP   4. jMQTTCmd->updateCmdValue($value = 'I\\001\\000\\000\\000\\006\\000\\020') /var/www/html/plugins/jMQTT/core/class/jMQTT.class.php:2072
0018|[884187] PHP   5. jMQTT->checkAndUpdateCmd($_logicalId = class jMQTTCmd { private $_preSaveInformations = NULL; protected $id = '9145'; protected $logicalId = ''; protected $generic_type = ''; protected $eqType = 'jMQTT'; protected $name = 'rec'; protected $order = '0'; protected $type = 'info'; protected $subType = 'string'; protected $eqLogic_id = '467'; protected $isHistorized = '0'; protected $unite = ''; protected $configuration = ['topic' => 'topic116244/raw', 'jsonPath' => '', 'minValue' => '', 'maxValue' => '', 'timeline::enable' => '0', 'timeline::folder' => '', 'influx::enable' => '0', 'influx::namecmd' => '', 'influx::nameEq' => '', 'influx::nameVal' => '', 'interact::auto::disable' => '0', 'calculValueOffset' => 'current(unpack("Q",#value#))', 'jeedomCheckCmdOperator' => '==', 'jeedomCheckCmdTest' => '', 'jeedomCheckCmdTime' => '', 'historyPurge' => '', 'denyValues' => '', 'returnStateValue' => '', 'returnStateTime' => '', 'repeatEventManagement' => 'never', 'jeedomPushUrl' => '', 'alert::messageReturnBack' => '0', 'actionCheckCmd' => [...], 'jeedomPreExecCmd' => [...], 'jeedomPostExecCmd' => [...], 'historizeRound' => '', 'historizeMode' => 'avg']; protected $template = '{"dashboard":"core::default","mobile":"core::default"}'; protected $display = '{"invertBinary":"0","showNameOndashboard":"1","showNameOnmobile":"1","showIconAndNamedashboard":"0","showIconAndNamemobile":"0","forceReturnLineBefore":"0","forceReturnLineAfter":"0","parameters":[],"showStatsOnmobile":0,"showStatsOndashboard":0}'; protected $value = ''; protected $isVisible = '1'; protected $alert = '{"warningif":"","warningduring":"","dangerif":"","dangerduring":""}'; protected $_collectDate = '2023-11-26 23:06:20'; protected $_valueDate = '2023-11-26 23:06:20'; protected $_eqLogic = class jMQTT { private $_preSaveInformations = NULL; private $_preRemoveInformations = NULL; private $_broker = NULL; private $_statusCmd = NULL; private $_connectedCmd = NULL; protected $id = '467'; protected $name = 'Topic 116244'; protected $logicalId = ''; protected $generic_type = NULL; protected $object_id = '3'; protected $eqType_name = 'jMQTT'; protected $isVisible = '0'; protected $isEnable = '1'; protected $configuration = '{"type":"eqpt","eqLogic":"359","createtime":"2023-11-26 22:28:33","auto_add_cmd":"0","auto_add_topic":"topic116244\\\\/#","Qos":"","battery_type":"","battery_cmd":"","availability_cmd":"","commentaire":"","icone":"","updatetime":"2023-11-26 22:30:03"}'; protected $timeout = NULL; protected $category = '{"heating":"0","security":"0","energy":"0","light":"0","opening":"0","automatism":"0","multimedia":"0","default":"0"}'; protected $display = '{"backGraph::info":0}'; protected $order = '9999'; protected $comment = NULL; protected $tags = NULL; protected $_debug = FALSE; protected $_object = NULL; protected $_needRefreshWidget = FALSE; protected $_timeoutUpdated = FALSE; protected $_batteryUpdated = FALSE; protected $_changed = FALSE; protected $_cmds = [...] }; protected $_needRefreshWidget = NULL; protected $_needRefreshAlert = NULL; protected $_changed = FALSE }, $_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_updateTime = *uninitialized*) /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php:129
0019|[884200] PHP   6. jMQTTCmd->formatValue($_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_quote = *uninitialized*) /var/www/html/core/class/eqLogic.class.php:664
0020|[884205] PHP   7. jeedom::evaluateExpression($_input = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = *uninitialized*) /var/www/html/core/class/cmd.class.php:1010
0021|[884209] PHP   8. scenarioExpression::setTags($_expression = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = NULL, $_quote = TRUE, $_nbCall = *uninitialized*) /var/www/html/core/class/jeedom.class.php:1383
0022|[884213] PHP   9. scenarioExpression::setTags($_expression = 'unpack("Q","I\\001\\000\\000\\000\\006\\000\\020")', $_scenario = NULL, $_quote = TRUE, $_nbCall = 0) /var/www/html/core/class/scenarioExpression.class.php:1297
0023|[884216] PHP  10. trim($str = [1 => 1152928101676613961], $character_mask = '"') /var/www/html/core/class/scenarioExpression.class.php:1344
0024|[884326] PHP Warning:  current() expects parameter 1 to be array, string given in /var/www/html/core/class/scenarioExpression.class.php on line 1340
0025|[884332] PHP Stack trace:
0026|[884341] PHP   1. {main}() /var/www/html/plugins/jMQTT/core/php/callback.php:0
0027|[884346] PHP   2. jMQTTComFromDaemon::msgIn($id = '359', $topic = 'topic116244/raw', $payload = 'I\\001\\000\\000\\000\\006\\000\\020', $qos = 0, $retain = FALSE) /var/www/html/plugins/jMQTT/core/php/callback.php:117
0028|[884351] PHP   3. jMQTT->brokerMessageCallback($msgTopic = 'topic116244/raw', $msgValue = 'I\\001\\000\\000\\000\\006\\000\\020', $msgQos = 0, $msgRetain = FALSE) /var/www/html/plugins/jMQTT/core/class/jMQTTComFromDaemon.class.php:384
0029|[884355] PHP   4. jMQTTCmd->updateCmdValue($value = 'I\\001\\000\\000\\000\\006\\000\\020') /var/www/html/plugins/jMQTT/core/class/jMQTT.class.php:2072
0030|[884375] PHP   5. jMQTT->checkAndUpdateCmd($_logicalId = class jMQTTCmd { private $_preSaveInformations = NULL; protected $id = '9145'; protected $logicalId = ''; protected $generic_type = ''; protected $eqType = 'jMQTT'; protected $name = 'rec'; protected $order = '0'; protected $type = 'info'; protected $subType = 'string'; protected $eqLogic_id = '467'; protected $isHistorized = '0'; protected $unite = ''; protected $configuration = ['topic' => 'topic116244/raw', 'jsonPath' => '', 'minValue' => '', 'maxValue' => '', 'timeline::enable' => '0', 'timeline::folder' => '', 'influx::enable' => '0', 'influx::namecmd' => '', 'influx::nameEq' => '', 'influx::nameVal' => '', 'interact::auto::disable' => '0', 'calculValueOffset' => 'current(unpack("Q",#value#))', 'jeedomCheckCmdOperator' => '==', 'jeedomCheckCmdTest' => '', 'jeedomCheckCmdTime' => '', 'historyPurge' => '', 'denyValues' => '', 'returnStateValue' => '', 'returnStateTime' => '', 'repeatEventManagement' => 'never', 'jeedomPushUrl' => '', 'alert::messageReturnBack' => '0', 'actionCheckCmd' => [...], 'jeedomPreExecCmd' => [...], 'jeedomPostExecCmd' => [...], 'historizeRound' => '', 'historizeMode' => 'avg']; protected $template = '{"dashboard":"core::default","mobile":"core::default"}'; protected $display = '{"invertBinary":"0","showNameOndashboard":"1","showNameOnmobile":"1","showIconAndNamedashboard":"0","showIconAndNamemobile":"0","forceReturnLineBefore":"0","forceReturnLineAfter":"0","parameters":[],"showStatsOnmobile":0,"showStatsOndashboard":0}'; protected $value = ''; protected $isVisible = '1'; protected $alert = '{"warningif":"","warningduring":"","dangerif":"","dangerduring":""}'; protected $_collectDate = '2023-11-26 23:06:20'; protected $_valueDate = '2023-11-26 23:06:20'; protected $_eqLogic = class jMQTT { private $_preSaveInformations = NULL; private $_preRemoveInformations = NULL; private $_broker = NULL; private $_statusCmd = NULL; private $_connectedCmd = NULL; protected $id = '467'; protected $name = 'Topic 116244'; protected $logicalId = ''; protected $generic_type = NULL; protected $object_id = '3'; protected $eqType_name = 'jMQTT'; protected $isVisible = '0'; protected $isEnable = '1'; protected $configuration = '{"type":"eqpt","eqLogic":"359","createtime":"2023-11-26 22:28:33","auto_add_cmd":"0","auto_add_topic":"topic116244\\\\/#","Qos":"","battery_type":"","battery_cmd":"","availability_cmd":"","commentaire":"","icone":"","updatetime":"2023-11-26 22:30:03"}'; protected $timeout = NULL; protected $category = '{"heating":"0","security":"0","energy":"0","light":"0","opening":"0","automatism":"0","multimedia":"0","default":"0"}'; protected $display = '{"backGraph::info":0}'; protected $order = '9999'; protected $comment = NULL; protected $tags = NULL; protected $_debug = FALSE; protected $_object = NULL; protected $_needRefreshWidget = FALSE; protected $_timeoutUpdated = FALSE; protected $_batteryUpdated = FALSE; protected $_changed = FALSE; protected $_cmds = [...] }; protected $_needRefreshWidget = NULL; protected $_needRefreshAlert = NULL; protected $_changed = FALSE }, $_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_updateTime = *uninitialized*) /var/www/html/plugins/jMQTT/core/class/jMQTTCmd.class.php:129
0031|[884388] PHP   6. jMQTTCmd->formatValue($_value = 'I\\001\\000\\000\\000\\006\\000\\020', $_quote = *uninitialized*) /var/www/html/core/class/eqLogic.class.php:664
0032|[884393] PHP   7. jeedom::evaluateExpression($_input = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = *uninitialized*) /var/www/html/core/class/cmd.class.php:1010
0033|[884397] PHP   8. scenarioExpression::setTags($_expression = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = NULL, $_quote = TRUE, $_nbCall = *uninitialized*) /var/www/html/core/class/jeedom.class.php:1383
0034|[884400] PHP   9. scenarioExpression::setTags($_expression = 'current("")', $_scenario = NULL, $_quote = TRUE, $_nbCall = 1) /var/www/html/core/class/scenarioExpression.class.php:1305
0035|[884403] PHP  10. current($arg = '') /var/www/html/core/class/scenarioExpression.class.php:1340

On voit bien que jeedom::evaluateExpression() reçoit bien la formule, mais se plante dessus :

0008|[884130] PHP   7. jeedom::evaluateExpression($_input = 'current(unpack("Q","I\\001\\000\\000\\000\\006\\000\\020"))', $_scenario = *uninitialized*) /var/www/html/core/class/cmd.class.php:1010

Breffff, vu que je n’étais pas à une saleté près, j’ai fait une fonction perso qui fait ce qu’on veut :
image
Je l’ai collée en « Formule de calcul » :
image
Et BIIIIMMMM v’la un entier :

Bon, reste à être sur de ce que tu veux recevoir (taille, big/little endian) et jouer avec unpack.

C’est sale, mais ça marche, enjoy !

P.S. : N’hésite pas à utiliser php -a en ligne de commande pour tester sans passer par MQTT :
image

Bad

1 « J'aime »

Merci pour tout le temps passé! Il va me falloir reprendre celà au calme devant le PC à la maison, je ne suis pas sur de comprendre grand chose!
Pour répondre à tes questions:
-Jeedom est en version 4.3.20
-JMQTT est en version du 16/11/2023
-je cherche à récupérer les 2 premiers bytes (49) qui correspondent à la valeur du SOC (etat de charge) de la batterie renvoyé par le BMS. Ici 49 correspond donc à 73%.

Le BMS renvoie un paquet de trames sur le reseau CAN, mais pour l’instant je me contente de cette valeur! L’étape suivante sera le pilotage d’un chargeur via le CAN pour ajuster l’intensité au surplus de production photovoltaique.
Je suis en parallèle en train d’essayer d’écrire un petit programme pour gérer celà directement au niveau de l’ESP32, avec l’aide de Chat GPT pour le code…autant dire que je ne suis pas rendu! :grin:

Je pense que je vais monter un Jeedom sur une VM pour faire tous les essais, avant d’aller tripatouiller dans celui qui gère la maison…Pas envie de me faire pourrir par Madame parce que le chauffage ne s’est pas déclenché! :rofl:

Merci pour les réponses (pour info, mes tests sont faits en Jeedom v4.4 alpha).

49 en hexa, c’est un seul byte, donc le unpack qu’il te faut est current(unpack("c","I\x01...")) :
image

Bad

Quand je dis que je suis une quiche!
Je passe certainement à coté de quelque chose, mais comment fais tu pour faire une fonction perso (binToUInt64)?

Je me réponds…Un peu de recherche ne fait pas de mal, j’ai trouvé des tutos, donc je vais essayer avant de t’embeter plus!

Une question: j’ai bien créé la fonction PHP, mais je n’ai pas le champ calcul et arrondi en configuration « info » et « autre »…il faut passer en numérique et je retombe sur ton commentaire précédent, la valeur est tronquée…

Peux-tu mettre des captures d’écran stp ?

En selectionnant type info/numérique


En selectionnant type info/autre

Comme dit, j’ai testé sur mon Jeedom de dev (v4.4).
Il y a des changements à ce niveau là entre la v4.3 et la v4.4…

Je ne sais pas si/quand tu seras OK pour utiliser la v4.4, mais ça semble être la version à utiliser pour répondre à ton cas d’usage.

Ok, merci, je vais regarder ce qu’il en est de passer en V4.4.
Je te remercie car grâce à toi je suis passé de zéro connaissance en php à un petit quelque chose!

1 « J'aime »

Alors, quelques infos:
-j’ai monté une VM en V4.4 et on retrouve bien la possibilité de mettre une formule lorsque le type est sur « autre ».
-j’ai donc installé jMQTT seulement, cnnecté au broker et le log me montre bien la trame remontée, à savoir à cet instant:

'N\x0e\x00\x00\x00\x06\x00\x00'

J’ai rajouté dans le fichier /data/php/user.function.class.php une fonction « test »:

class userFunction {

	public static function test($_bin = '') {
		return current(unpack("c", $_bin));
	}

La valeur retournée est 48, ce qui n’est pas cohérent.
Si je teste cette fonction dans une sandbox php en ligne, en remplaçant $_bin ^par la valeur du payload, à savoir:

var_dump(unpack("c","N\x0e\x00\x00\x00\x06\x00\x00"));

J’obtiens bien:

array(1) {
  [1]=>
  int(78)
}

Il y a donc un bug dans la fonction…

Hello,
j’ai un peu survolé le Post :wink:,

Je me demande si la valeur qui est retourné ($_bin) dans la fonction test n’est pas double-quoté.
Ex : '"N\x0e\x00\x00\x00\x06\x00\x00"'
Il faudrait peut-être nettoyer la variable avant :

public static function test($_bin = '') {
    $_bin = trim(trim($_bin, '\''), '"');
    return current(unpack("c", $_bin));
}

Hello,

Alors en fait, je suis dessus depuis >3h…

Le Core décide, de temps en temps, d’entourer la valeur reçue avec des doubles quotes (") AVANT le calcul de la formule :

Voir de convertir la valeur en float encore avant.
Et pour rajouter encore des problèmes, si le daemon de jMQTT n’arrive pas à s’assurer que la valeur est convertible en texte, alors il la passe en base64…

Bref, ça marche avec certaines valeurs mais elles sont souvent converties.
Et si on détecte les " en début et fin dans la fonction binToUInt64 le problème reste entier.

Je cherche une façon de contourner ça, mais je ne vois pas trop d’autre façon que de transformer la donnée avant qu’elle ne rentre dans le Core. J’ai regardé si jMQTT pouvait faire quelque chose en amont, mais ça ne sera pas dans une version qui sortira en 2023.

@ericgrand, le verdict est donc que même avec le Core v4.4 et une fonction de transformation, il faudrait que le payload soit (à date) en texte pour qu’il soit utilisable.

Désolé,
Bad

Merci pour la proposition, mais malheureusement celà ne fonctionne pas.
@Bad : ne soit pas désolé, ce que tu as fait, ainsi que les autres contributeurs est super sympa!
C’est moi qui suis désolé de vous avoir fait perdre autant de temps.

Je suis du coup en train d’essayer de faire un programme qui tourne sur l’ESP32 et qui extraira la valeur convertie en décimale puis l’enverra sur un topic MQTT…Autant dire que je galère sévère et je me demande si celà ne va pas se finir avec un Wemos D1 et une prise de mesure de tension en analogique pour connaitre l’état de charge approximatif.
Celà à au moins le mérite de me faire plonger dans l’univers Arduino et esp…Mais à 55 ans on n’apprend pas aussi vite qu’à 15!