Page 1 sur 3

Aide pour récupérer des données sur une trame série.Modbus

Publié : 08 avr. 2018, 20:13
par marcus_54
Bonjour,

Je suis vraiment débutant, je n'ai fait qu'un seul petit script depuis mon installation Domoticz.

J’ai un tracer solaire Eperver1210A qui envoie des trames RS485 sur l'état de la production solaire.
J'ai récupéré les informations série c'est du 115200 bd et j'ai un adaptateur série USB FTDI232.
Le câblage matériel ce n’est pas une difficulté.

La dernière partie est de réaliser un script pour extraire les données. Voici les informations :

La trame est composée d'un certain nombre d'octets :
Elle commence par 01 43 36 07
Les données se trouvent à un certain offset de ce début.
Les données sont constituées de mots de 16 bits, il faut donc concaténer l'octet de poids fort puis celui de poids faible.
Pour obtenir par exemple la tension de la batterie :
à l'offset 52 on à 0x05 0x03 soit 0x0503 (en uint16) ce qui donne en décimale 1283, divisé par 100 donne 12.83V.

Les données que j'aimerai extraire :
Tension, intensité, puissance du panneau photovoltaïque
Tension, intensité, puissance de la charge
Tension, intensité (en int16), niveau de charge, température.

Si vous avez déjà traité un script semblable, votre aide serait bien appréciée :)

Merci

Re: Aide pour récupérer des données sur une trame série.

Publié : 08 avr. 2018, 22:27
par papoo
c'est du modbus
tu devrais pouvoir extraire tes données via pymodbus
https://github.com/riptideio/pymodbus

Re: Aide pour récupérer des données sur une trame série.

Publié : 08 avr. 2018, 22:33
par papoo
la valeur en 32 bits = HIGH*65536+LOW.
voila un exemple d'un de mes scripts script_time_modbus.py mais avec du modbus tcp/ip

Code : Tout sélectionner

#domoticz settings
import DomoticzEvents as DE
domoticz_host           = '127.0.0.1'    # Url domoticz
domoticz_port           = '8080'            # port
domoticz_url            = 'json.htm'        # Ne pas modifier

idx_compteur1 = '176'

from pymodbus.client.sync import ModbusTcpClient
import urllib, urllib2

client = ModbusTcpClient('192.168.1.21')
client.connect()
result = client.read_input_registers(1009,2) # Lire 24 compteurs 16 bits  adresse de debut 200 (16 Least et 16 Most)
# compteur1 = ((result.registers[0]*65536)+result.registers[1])  # (Least*65536)+ Most
compteur1 = ((result.registers[1])  # (Least*65536)+ Most
#print(compteur1)
# print ((result.registers[2]*65536)+result.registers[3])
# print ((result.registers[4]*65536)+result.registers[5])
# print ((result.registers[6]*65536)+result.registers[7])
# print ((result.registers[8]*65536)+result.registers[9])
# print ((result.registers[10]*65536)+result.registers[11])
# print ((result.registers[12]*65536)+result.registers[13])
# print ((result.registers[14]*65536)+result.registers[15])
# print ((result.registers[16]*65536)+result.registers[17])
# print ((result.registers[18]*65536)+result.registers[19])
# print ((result.registers[20]*65536)+result.registers[21])
# print ((result.registers[22]*65536)+result.registers[23])

# for compteurs in enumerate(result.registers):
    # print (compteurs)
   

client.close()
  
if idx_compteur1 != None: 
    #uploading values to domoticz 
    url = "http://" + domoticz_host + ":" + domoticz_port + "/" + domoticz_url + "?type=command&param=udevice&idx=" + idx_compteur1 + "&nvalue=0&svalue=" + str(compteur1)
    urllib2.urlopen(url , timeout = 5)
    DE.Log("Python: Compteur eau froide : " + str(compteur1))

Re: Aide pour récupérer des données sur une trame série.

Publié : 09 avr. 2018, 09:03
par marcus_54
Merci d'avoir répondu,

J'ai deux possibilités :
Le dialogue est initié par l'afficheur MT50, et je récupère dans la trame de réponse les informations qui m’intéresse (c'est ce que j'ai fait, mais sur Simulink Matlab sur PC et qui ne peut pas être utilisé sur RPI) J'ai opté pour cette solution, car c'est la plus simple à mon niveau. Je n'ai pas le détail du protocole, c'est donc en tâtonnant que j'ai trouvé les infos.

Image

J'ajoute un noeud avec un adaptateur RS485 et c'est Domoticz qui fait la requête et qui récupère l'information.
Solution possible à mon niveau uniquement s'il y a une gestion toute faire disponible dans Domoticz

Image

Re: Aide pour récupérer des données sur une trame série.

Publié : 09 avr. 2018, 18:13
par papoo
marcus_54 a écrit : uniquement s'il y a une gestion toute faire disponible dans Domoticz
il n'y as pas grand chose de tout fait dans domoticz
il existe ce plugin modbus qui te permettra de remonter des infos
https://github.com/DomoticX/domoticz-modbus
http://www.domoticz.com/forum/viewtopic ... lit=modbus

Re: Aide pour récupérer des données sur une trame série.

Publié : 09 avr. 2018, 18:23
par papoo
à la lecture du forum officiel, un membre vient de poster un autre plugin d'un produit similaire au tiens
peut être pourrais tu t'en inspirer
http://www.domoticz.com/forum/viewtopic ... 65&t=23012

Re: Aide pour récupérer des données sur une trame série.

Publié : 10 avr. 2018, 11:08
par marcus_54
Merci pour les pistes.
il faut que je commande un adaptateur RS485 avant toute chose.

Re: Aide pour récupérer des données sur une trame série.

Publié : 13 avr. 2018, 19:23
par marcus_54
Bonsoir,

J'ai reçu mon adaptateur RS485 Modbus.
Il fonctionne je l'ai testé avec l’application du tracer sur PC.
Je l'ai connecté sur mon Raspberry Pi sur lequel tourne Domoticz :)

J'ai copié dans plugins les fichiers de domoticz-modbus-master.

Dans la doc qui va avec il est indiqué :
Dependancies
For this plugin to work you need to install some dependancies
pymodbus AND pymodbusTCP
Install for python 3.x with: sudo pip3 install -U pymodbus pymodbusTCP
quand le lance cette commande dans PuTTY
j'ai "sudo: pip3: command not found"...

C'est quoi l'erreur ? SVP

Merci

Re: Aide pour récupérer des données sur une trame série.Modbus

Publié : 13 avr. 2018, 21:35
par papoo
sudo apt-get install python3-pip

Re: Aide pour récupérer des données sur une trame série.Modbus

Publié : 14 avr. 2018, 17:42
par marcus_54
Merci
ca avance....

Il reste plus qu'à trouver comment bien paramétrer le truc.... :?
(Tracer_Solaire) Modbus error decoding or recieved no data (RTU/ASCII/RTU over TCP)!, check your settings!