Python et serial

Bonjour

Je voudrais mettre en place un programme python pour interagir avec ma borne de recharge. Elle a un port rs232 que j’ai relié à mon Pi.

Depuis minicom, j’ai confirmé que le lien était fonctionnel mais je ne suis pas doué en programmation. Le programme que je teste ne donne rien et je ne comprends pas pourquoi.

Si un participant du forum pourrrait me faire un retour :pleading_face:

Merci

Antoine

#! /usr/bin/env python
import requests
import time
import serial


ser = serial.Serial(
    port='/dev/ttyUSB1',
    baudrate=115200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)
if ser.isOpen():
    ser.close()
ser.open()
ser.isOpen()

ser.write("$GG*B2\r") #commande renvoyant OK puis 2 valeurs numérique. Il faut validrr zvec enter d'ou le \r
out = ''
# let's wait one second before reading output (let's give device time to answer)
time.sleep(1)
while ser.inWaiting() > 0:
    out += ser.read(40)

if out != '':
    print(">>" + out)


ser.close()

Que donne l’exécution de ce script dans un terminal ssh hors de jeedom ?

je suis pas sur que requests soit en python 2

il vaudrait mieux modifier ta 1 er ligne avec une directive python 3

#! /usr/bin/env python3
pi@covid:~$ python
Python 2.7.16 (default, Oct 10 2019, 22:02:15) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named requests
>>> exit()
pi@covid:~$ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> 

>>> 

Pour le python 3, j’ai pas encore compris comment je devais écrire le ser.write.
Je vais tester demain: ser.write("$GG*B2".encode())

J’ai jamais testé l’exécition en ssh, je google et teste demzin doir :wink:

Antoine

C’est simple en ssh tu lance python ou python3
au prompt >>>
tu passe tes lignes 1 a une pour voir si erreurs ou pas
exit() pour quitter Python

tu a un problème avec

celui-ci va te renvoyer True en console
il te faut faire

if ser.isOpen():
    ser.close()
ser.open()
if ser.isOpen():

    ser.write("$GG*B2\r") 
    out = ''
    time.sleep(1)
    while ser.inWaiting() > 0:
        out += ser.read(40)

    if out != '':
        print(">>" + out)


ser.close()

1 « J'aime »

Bonsoir Olive

J’ai testé depuis SSH et c’est ok.
Depuis jeedom et le plugin script, je n’y arrive pas. Je ne comprends pas pourquoi.

Si je passe par un scénario, comme suggéré dans un autre post, où dois-je sauver le fichier .py?

Merci

Antoine

de préference dans la partie visible de www-data
donc ou tu veut a partir de
/var/www/html/dossierscript/monfichier.py par exemple
n’oublie pas de lui mettre des droits si tu veut l’exécuter directement avec un shebang sans python3 devant.

Salut,

Depuis un scenario, n’est-il pas possible de simplement ajouter un bloc de type CODE:

A tester …

Sebastien

Ah zut, les blocs CODE c’est que pour du PHP … désolé …

Sauf si tu utilise php pour écrire et executer ton script :sunglasses:

$script = 'monpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser

if (1){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import requests
from sys import argv
from bs4 import BeautifulSoup
res = requests.get("https://www.meteoblue.com/fr/meteo/semaine/villecresnes_france_2968823")
soupe=BeautifulSoup(res.content, "html.parser")
print(soupe.find_all(class_ ="current_description")[0].span.next.next.next.next.split()[0],end='')
#fin du script python3
EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}

$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 
$scenario->setLog('Vitesse du vent  : '.$reponse.' Kmh'); // recuperation des paramètres de retour du script 

// cet exemple nécéssite l'installation de la librairie BeautifulSoup, en ssh faire : pip3 install bs4
1 « J'aime »

yep, ça peut fonctionner!!!

ça fonctionne :innocent:

celui-la il renvoie la vitesse du vent de meteoblue !!!

mais on peut mettre n’importe quel code python entre

<<<'EOD'
et
EOD;

Oui je vois :slight_smile:

Mais pour Tonio il suffirait de remplacer la partie de generation du fichier py par son script.
Il est alors possible de passer des paramètres dans ce même fichier et d’utiliser le scenario pour se faire (par exemple donner la puissance de charge!)
Là on aurait alors automatiser la puissance de charge par rapport à une production photovoltaique !

Sebastien

Oui bien sur

Bonjour,

Inspiré de cet exemple pour essayer d’envoyer un texte; cependant cela ne fonctionne pas. Qu’ai-je oublié ?

Merci

$python = <<<'EOD'
#! /usr/bin/env python
  ser = serial.Serial(
    port='/dev/ttyS2',
    baudrate=1200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)


if ser.isOpen():
    ser.close()
ser.open()
if ser.isOpen():
    ser.write("$ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz\r") 
ser.close()
#fin du script python3
EOD;

Salut

Pour la deuxième ligne tu devrais avoir python3.

Pour le serial, je passe par un node red-node qui communique avec mon Jeedom en mqtt.

Antoine

Merci Antoine,

J’ai ajouté le 3 qui manquait à Python; mais toujours rien en sortie… :frowning:

Depuis une fenêtre SSH j’arrive bel et bien à faire un echo sur le port série et cela fonctionne.
Il y a python 3.7.3
Mais depuis mon scénario on dirait que le code ne s’exécute pas…

Un petit up…
Merci…

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.