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);
}