PIN für neue Zähler mit esp8266

Begonnen von immi, 25 August 2026, 01:45:17

Vorheriges Thema - Nächstes Thema

immi

Hallo zusammen,
seit Jahren lese ich meinen Zähler mit dem Modul 47_OBIS.pm (SML) aus, das über einen ESP8266 (ser2net) angebunden ist.
Vor Kurzem wurde unser Stromzähler ausgetauscht.
Ich habe zwar den neuen PIN beim Netzbetreiber angefordert, wollte aber gleichzeitig wissen, wer schneller ist: BRUTE-FORCE-FHEM oder der Netzbetreiber.

In beiden Fällen dauerte es mehrere Tage, aber... and the winner is: FHEM! :)
Das Skript kann gestoppt werden, sobald die Power-Werte (Leistung in Watt) im System sichtbar sind.
Das Skript verwendet LongPulse_ms Kommand in espeasy und kann in 99_myUtils.pm gespeichert werden.

sub ESPEasySetCodeRange($$)
{
    my ($start_code,$stop_code) = @_;
my $delay = 0;
    for(my $i=$start_code; $i<$stop_code; $i++)
    {
my $cifra_attuale=$i;
my $pausa=41; #va bene 0000-9500
InternalTimer( gettimeofday() + $delay,
sub {
$pausa=ESPSetCode($cifra_attuale);  # attenzione non  aggiorna il delay esternocon la pausa aggiornata
Log3("ESPEasySetCodeRange",2,"ESPSetCode $cifra_attuale , durata $pausa");
},0);
$delay=$delay+$pausa; # Pause nach der gesamten 4-stelligen Zahl (in Sekunden)
    }
    return;
}



sub ESPSetCode($)
{
    #my ($p1,$p2,$p3,$p4) = @_;
my ($numero) = @_;
my $GPIOPin = 5;  # Verwendet Pin 5   ->D1
my $blinkDuration = 300;   # Dauer des Blinkens für eine Ziffer (in Millisekunden)
my $blinkPauseDuration = 200;  # Dauer der Pause zwischen den Blinkimpulsen für eine Ziffer (in Millisekunden)
my $digitSpaceBetweenDuration = 3550;  # Pause zwischen den Ziffern (in Millisekunden)
my $host="name_of_your_esp8266";
    # Separa le cifre direttamente in una lista
my @cifre = split //, sprintf("%04d", $numero);
# start meeter
HttpUtils_NonblockingGet({ url  => "http://$host/control?cmd=LongPulse_ms,$GPIOPin,1,850,400,2", timeout  => 1, callback => sub { return undef } });
    # Cicla sulle 4 cifre estratte
my $delay = 2.6;
    foreach my $cifra (@cifre) {
if ($cifra>0) { InternalTimer( gettimeofday() + $delay,
            #sub { ESPEasyPulseSequence("esp-usb",$GPIOPin,$cifra,$blinkDuration,$blinkPauseDuration);},0);
#LongPulse_ms,5,1,150,250,[VAR#2]
sub { HttpUtils_NonblockingGet({url => "http://$host/control?cmd=LongPulse_ms,$GPIOPin,1,$blinkDuration,$blinkPauseDuration,$cifra",timeout => 1});},0);
      }
$delay=$delay+ ($digitSpaceBetweenDuration /1000) +($cifra*($blinkDuration+$blinkPauseDuration)/1000) ;
    }
    return ($delay+8);
}

 

RalfRog

Interessanter Ansatz.

Der ESP erzeugt den Blinkcode und liest auch die Daten aus?
Ist der Lesekopf selbst gebaut?

Gruß Ralf
FHEM VM Debian13 (trixie) auf Proxmox VE9  (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen