Stromzähler-Pin mit Raspi raten

Um vollen Zugriff auf die Messdaten eines Stromzählers zu erhalten, wird in der Regel eine Pin benötigt. Diese kann beim zuständigen Netzbetreiber angefordert werden. Da die Netzbetreiber sich hiermit teilweise monatelang Zeit lassen, lässt sich alternativ ein Raspberry Pi programmieren, um den korrekten Zähler-Pin mittels Brute-Force Methode herauszufinden.

Dazu wird eine LED verwendet, die in einem präzisen Rhythmus ein- und ausgeschaltet wird. Zunächst muss die LED zweimal blinken, um den Eingabemodus des Zählers zu aktivieren. Anschließend kann das System die Zahlenkombinationen von 0000 bis 9999 systematisch durchlaufen. Dabei ist darauf zu achten, dass die LED nah genug am Sensor des Stromzählers fixiert wird, um Übertragungsfehler zu vermeiden. Zudem muss das Timing exakt auf das jeweilige Zählermodell abgestimmt sein, damit die Lichtsignale weder zu schnell noch zu langsam erfolgen. Bei erfolgreicher Eingabe werden in meinem Zählermodell die erweiterte Verbrauchsdatenübermittlung zum Betrieb eines Zählermesskopfes automatisch freigeschaltet.

 

import RPi.GPIO as GPIO
import time

LED_PIN = 17

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)

def signal(sleeptime=0.1):
   GPIO.output(LED_PIN, GPIO.HIGH)
   time.sleep(0.01)
   GPIO.output(LED_PIN, GPIO.LOW)
   time.sleep(sleeptime)
   
try:
    for index in range(0000,10000):  # 0000 bis 9999
        # Zahl als 4-stellige Zeichenkette formatieren
        number_str = f"{index:04d}"
        
        # In einzelne Ziffern umwandeln
        digits = [int(d) for d in number_str]
        
        print(f"Aktueller Index: {number_str} -> {digits}")
        # Init Pin Mode
        signal(0.2)
        signal()
        for digit in digits:
            
            # LED für jede Ziffer kurz einschalten
            print(digit)
            for i in range(digit):
               signal()
            # Pause zwischen den Ziffern
            time.sleep(3)
        
        # 3 Sekunden Pause nach 4 Ziffern
        time.sleep(1)

except KeyboardInterrupt:
    print("Programm beendet")

finally:
    GPIO.cleanup()