Pi2 remontant des capteurs d'ouverture en mqtt

Hello,

il y a encore du monde qui tâte les pins du GPIO ?

j’utilise les GPIO d’un pi2 alimenté en POE pour remonter des capteurs d’ouverture de portes filaires en mqtt dans home assistant. bon ça ça fonctionne sur le bureau.

A1

Après quelques soucis notamment de code sur une pin du GPIO qui m’a fait pas mal chercher en amont avant de comprendre que c’était le code… ça semble fonctionner sauf que j’ai un soucis sur le GPIO 27 du rpi2

  • je branche mon capteur sur cette pin, je boot le pi, le boot ne va pas au bout, le pi s’éteint.
  • je ne branche pas mon capteur sur cette pin, je démarre le rpi2, il démarre normalement, je teste avec le contact, ça détecte, c’est fonctionnel, j’enlève je remet … ça fonctionne. je laisse le capteur quelques secondes le pi s’éteint.

Donc ma question, y a t’il une subtilité que je ne connais pas sur ce GPIO27 ? j’ai testé sur un autre pi, les résultats sont identiques. chaque capteur branché pompe 0.4mA sur chaque pin du GPIO utilisée

vu que je ne suis pas très à l’aise avec le python, j’ai demandé un coup de main à chatgpt, du coup je met également le code du script que j’utilise au cas où

    import time
    import RPi.GPIO as GPIO
    import paho.mqtt.client as mqtt
    # MQTT settings
    MQTT_BROKER = "xxx.xxx.xxx.xxx"  # Remplacez par l'adresse IP de votre broker MQTT
    MQTT_TOPIC_PREFIX = "xxx"
    MQTT_USERNAME = "xxx"  # Nom d'utilisateur MQTT
    MQTT_PASSWORD = "xxx"  # Mot de passe MQTT
    # GPIO settings
    GPIO.setmode(GPIO.BCM)
    sensor_pins = [18, 4, 5, 6, 13, 17, 22, 26, 27]
    for pin in sensor_pins:
        GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    # MQTT client setup
    client = mqtt.Client()
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!" )
        else:
            print(f"Failed to connect, return code {rc}\n" )
    client.on_connect = on_connect
    # Set username and password
    client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
    print("Connecting to MQTT broker..." )
    client.connect(MQTT_BROKER, 1883, 60)
    client.loop_start()
    try:
        while True:
            for i, pin in enumerate(sensor_pins):
                sensor_state = GPIO.input(pin)
                if sensor_state == GPIO.HIGH:
                    state = "OPEN"
                else:
                    state = "CLOSED"
                topic = f"{MQTT_TOPIC_PREFIX}{i+1}"
                result = client.publish(topic, state)
                status = result.rc
                if status == 0:
                    print(f"Sent {state} to topic {topic}" )
                else:
                    print(f"Failed to send message to topic {topic}" )
            time.sleep(1)
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()
        client.loop_stop()

si vous avez des idées, n’hésitez pas, moi à force de retourner le problème je ne suis plus objectif, il me faut un regard neuf.

merci

Le schéma

oui c’est un peu le bordel, il a été repris plusieurs fois et je ne l’ai pas remis au propre avant de router mon circuit, mais il est simple à comprendre :slight_smile:

Bonjour,

A priori, non il n’y a pas de particularité sur ce port GPIO. Il me semble que c’est plus du coté connectique et capteur qu’il faille regarder ?

A+

Bonjour,
Je débute en mqtt mais est-ce que ton script est complet, car on voie que tu définis une procédure:

def on_connect(client, userdata, flags, rc):

on vois le début de la définition mais pas la fin, en plus on ne vois pas le corps du programme.

Hello,

J’ai fais tous les tests croisés possibles et imaginable, quelque soit le capteur que je met sur le GPIO27, ça plante ( j’ai 8 autres en prod qui fonctionnent sans soucis, sur les autres GPIO, ils ont tous été testés sur ce GPIO27 avec le même résultat.

En désespoir de trouver pourquoi, je viens de refaire toutes les soudures et testé toutes les continuités qui fonctionnaient déjà avant de refaire les soudures. toujours le même résultat.

la seule solution qui me reste c’est d’utiliser un autre GPIO ( j’avais fait une version de test en utilisant 23,24 et 25 et ça semblait fonctionner. Ce qui m’ennuie le plus c’est que les plaques sont faites mais vu qu’à priori le 27 n’a rien de particulier expliquant cela, c’est mon dernier recours.

En tout cas merci de la réponse :slight_smile:

Hello,

il est complet et il fonctionne, la seule chose sur laquelle j’ai mis la main outre les infos de connexion au broker mqtt, ce sont les GPIO utilisés, le reste c’est chatgpt qui a géré

Désolé A1
limite de 1 image par topic … :wink:

il est juste couplé à un démarrage automatique ( qui n’a pas été lui non plus simple à mettre en place ) .

Presse-papier02

re,

Depuis le début je parle de soucis de GPIO27, mais en fait c’était le 17 ( j’ai creusé de toute façon )

bon ben je les ai tous testés, c’est le HAT POE qui semble provoquer ce phénomène, ce qui ne m’arrange pas vu que je voulais profiter du POE ondulé de mon serveur …

HAT POE monté, GPIO 4,5,6,13,18,22,26,27 ( capteurs montés ou pas ) si je met un capteur sur 17 donc, mais pour les avoir également testés 23,24,25,12,16,20,21,19. le pi s’éteint au boot.

HAT POE non monté GPIO 4,5,6,13,18,22,26,27 ( capteurs montés ou pas ) si je met un capteur sur 17 donc, mais pour les avoir également testés 23,24,25 le pi boot

bref je suis dans l’impasse…

Re,

Bon ben ça tourne sur 8

je met le script final que j’utilise si ça branche qq’un

import time
import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import psutil

# MQTT settings
MQTT_BROKER = "xxx"  # Remplacez par l'adresse IP de votre broker MQTT
MQTT_TOPIC_PREFIX = "xxx"
MQTT_USERNAME = "xxx"  # Nom d'utilisateur MQTT
MQTT_PASSWORD = "xxx"  # Mot de passe MQTT
LWT_TOPIC = "xxx/status"
CPU_TOPIC = "xxx/cpu_usage"
MEMORY_TOPIC = "xxx/memory_usage"

# GPIO settings
GPIO.setmode(GPIO.BCM)
sensor_pins = [18, 4, 5, 6, 13, 22, 26, 27]

for pin in sensor_pins:
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# MQTT client setup
client = mqtt.Client()

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to MQTT Broker!")
        client.publish(LWT_TOPIC, "online", retain=True)  # Publish online status
    else:
        print(f"Failed to connect, return code {rc}\n")

client.on_connect = on_connect

# Set username and password
client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)

# Set Last Will and Testament (LWT)
client.will_set(LWT_TOPIC, payload="offline", qos=0, retain=True)

print("Connecting to MQTT broker...")
client.connect(MQTT_BROKER, 1883, 60)

client.loop_start()

try:
    while True:
        # Publish the state of the sensors
        for i, pin in enumerate(sensor_pins):
            sensor_state = GPIO.input(pin)
            state = "OPEN" if sensor_state == GPIO.HIGH else "CLOSED"
            topic = f"{MQTT_TOPIC_PREFIX}{i+1}"
            result = client.publish(topic, state)
            status = result.rc
            if status == 0:
                print(f"Sent {state} to topic {topic}")
            else:
                print(f"Failed to send message to topic {topic}")

        # Publish CPU usage percentage
        cpu_percent = psutil.cpu_percent(interval=1)
        result_cpu = client.publish(CPU_TOPIC, str(cpu_percent))
        status_cpu = result_cpu.rc
        if status_cpu == 0:
            print(f"Sent CPU usage {cpu_percent}% to topic {CPU_TOPIC}")
        else:
            print(f"Failed to send CPU usage to topic {CPU_TOPIC}")

        # Publish memory usage percentage
        memory_percent = psutil.virtual_memory().percent
        result_memory = client.publish(MEMORY_TOPIC, str(memory_percent))
        status_memory = result_memory.rc
        if status_memory == 0:
            print(f"Sent memory usage {memory_percent}% to topic {MEMORY_TOPIC}")
        else:
            print(f"Failed to send memory usage to topic {MEMORY_TOPIC}")

        time.sleep(1)  # Wait for 1 second before the next iteration
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
    client.publish(LWT_TOPIC, "offline", retain=True)  # Publish offline status
    client.loop_stop()

A1

il en a encore sous le pied le pi2 :wink: