[Gelöst] Endlosschleife in ElectricityCalculator wegen Zeitumstellung?

Begonnen von KyleK, 31 Oktober 2022, 00:09:53

Vorheriges Thema - Nächstes Thema

Beta-User

Zitat von: Beta-User am 08 November 2022, 21:54:31
ohne für die kommenden Monate einen unabsehbaren support-Aufwand zu generieren?
Ergänzend: ...ein Ladung irritierter User wie in https://forum.fhem.de/index.php/topic,47909.msg1244457.html#msg1244457 und dem folgenden Beitrag zu generieren, obwohl diese vermeintlich dringende Notfallmaßnahme jetzt doch erst mal noch gar nicht sein muss (und wenn, dann ggf. schneller über das OS-Paket zu lösen wäre!).

Konkreter Vorschlag: Streiche die betreffenden Beiträge durch und mach einen Vermerk drunter, dass weitere News dann bei Gelegenheit folgen werden...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: Sailor am 09 November 2022, 07:25:16
Wenn du mir ein Code-Schnipsel nennen oder auch nur einen Hinweis zum Lesen geben kannst wie man dieses Problem löst

Das wird doch in einigen Modulen bereits gemacht, zum Beispiel in 55_InfoPanel.pm zur Prüfung, ob bestimmte Funktionen verwendet werden können oder nicht.


sub InfoPanel_Initialize {
    my ($hash) = @_;

## no critic
    eval "use MIME::Base64" ;
    $useImgTools = 0 if($@);
    Log3(undef,4,"InfoPanel: MIME::Base64 missing.") unless $useImgTools;
    eval "use Image::Info qw(image_info dim)";
    $useImgTools = 0 if($@);
    Log3(undef,4,"InfoPanel: Image::Info missing.") unless $useImgTools;



--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rob

Zitat von: KölnSolar am 09 November 2022, 06:53:30
DateTime ist wohl in libdatetime-perl enthalten und dann braucht es kein cpan zur Installation.
Via apt zu installieren wäre auch mein präferierter Weg. Das wäre dann dieses Paket?
https://packages.debian.org/bullseye/libdatetime-perl
https://packages.debian.org/buster/libdatetime-perl

Cpan Installation ist tw. schwierig. Beim nativ installierten FHEM wohl weniger ein Problem - wird nur einmalig durchgeführt. Wer aber FHEM im Docker einsetzt, muss wg. preinstall per cpan relativ lange Startzeiten in Kauf nehmen - und zwar jedes Mal wenn der Container aktualisiert wird oder aus anderen Gründen ein Neustart vom Container fällig wurde (geänderte Parameter usw.). Kann der Container nix für - cpan ist braucht halt Zeit.

Preinstall via apt geht ratzfatz. Natürlich starte ich den Container nicht dauernd neu, also kein Riesenthema.

Wenn ich es richtig verstehe, ist das Paket bereits on board:

root@1bee5d8d8f05:/opt/fhem# apt list --installed | grep libdate

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libdatetime-format-builder-perl/stable,now 0.8300-1 all [installed,automatic]
libdatetime-format-iso8601-perl/stable,now 0.16-1 all [installed,automatic]
libdatetime-format-strptime-perl/stable,now 1.7800-1 all [installed]
libdatetime-locale-perl/stable,now 1:1.31-1 all [installed,automatic]
libdatetime-perl/stable,now 2:1.54-1 armhf [installed]
libdatetime-timezone-perl/stable-updates,now 1:2.47-1+2022e all [installed,automatic]

Sailor

Hi rob

Zitat von: rob am 10 November 2022, 10:08:47
Wenn ich es richtig verstehe, ist das Paket bereits on board:

Also bei mir war das definitiv nicht der Fall!  :-\

Gruß
   Sailor
******************************
Man wird immer besser...

Sailor

Habe mir jetzt mal folgenden Check ueberlegt.

Sobald der Bullshit gecheckt wird, wird init abgebrochen aber fhem stürzt nicht ab.
Und man kann die gewünschten Module schön untereinander auflisten.


##START###### Initialize module ##############################################################################START####
sub IONOSAPI_Initialize($) {
my ($hash)  = @_;

### Checking whether all required perl libaries are installed. ###
my $listUseLibaries = "
JSON
JSON::Parse
HttpUtils
Net::DNS
NetAddr::IP
Big::Bullshit
DateTime
DateTime::TimeZone
";

# Transform Tabs in spaces, remove exessive blanks, leading blanks and split into array
$listUseLibaries     =~ s/(.*?)\t/$1    /g;
$listUseLibaries     =~ s/[\h\v]+/ /g;
$listUseLibaries     =~ s/^\s+//;
my @UseLibaries = split (/ /, $listUseLibaries);

# Check each wanna be used libary for unavailability
foreach my $Libary (@UseLibaries) {
eval "use " . $Libary;
if (length($@) == 0) {
Log3 undef, 1, "IONOSAPI - Successfully Installed Perl Module               : " . $Libary
}
else {
Log3 undef, 1, "IONOSAPI - Cannot find " . $Libary . " in \@INC. Please install the Perl libary first. Initialization of IONOSAPI aborted";
return
}
}


Bei meinem Test-Modul klappt das sehr gut.


2022.11.10 22:08:18.485 1: IONOSAPI - Successfully Installed Perl Module               : JSON
2022.11.10 22:08:18.488 1: IONOSAPI - Successfully Installed Perl Module               : JSON::Parse
2022.11.10 22:08:18.489 1: IONOSAPI - Successfully Installed Perl Module               : HttpUtils
2022.11.10 22:08:18.603 1: IONOSAPI - Successfully Installed Perl Module               : Net::DNS
2022.11.10 22:08:18.635 1: IONOSAPI - Successfully Installed Perl Module               : NetAddr::IP
2022.11.10 22:08:18.636 1: IONOSAPI - Cannot find Big::Bullshit in @INC. Please install the Perl libary first. Initialization of IONOSAPI aborted


Gruß
    Sailor
******************************
Man wird immer besser...

rob

Zitat von: Sailor am 10 November 2022, 22:10:16
...Also bei mir war das definitiv nicht der Fall!  :-\ ...
Benutzt Du Docker? Bei mir ist es das offizielle latest Image. Da scheint das Modul bereits dabei zu sein.
Bei nativen Installationen dann wohl manuell einmalig nachzuinstallieren.

VG
rob

Beta-User

Zitat von: Sailor am 10 November 2022, 22:14:08
Habe mir jetzt mal folgenden Check ueberlegt.
a) Warum bitte hängst du weiter der Überlegung nach, dass unbedingt ein Check wegen eines Moduls erforderlich wäre? Mach den Code mit der einen geänderten Zeile sauber und du brauchst nicht alle User deiner Module dazu zu nötigen, irgendwelche Klimmzüge zu machen!
b) Vorgeschlagen war ein Block-eval. Gibt es irgend einen nachvollziehbaren Grund dafür, dass du das in ein String-eval umbauen mußt?

(Popcorn?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Zitat von: Sailor am 10 November 2022, 22:14:08
Habe mir jetzt mal folgenden Check ueberlegt.

Dir ist hoffentlich klar, dass Du mit diesem Bullshit alles noch schlimmer machst?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sailor

Hallo Beta-User

Zitat von: Beta-User am 10 November 2022, 23:09:48
a) Warum bitte hängst du weiter der Überlegung nach, dass unbedingt ein Check wegen eines Moduls erforderlich wäre? Mach den Code mit der einen geänderten Zeile sauber und du brauchst nicht alle User deiner Module dazu zu nötigen, irgendwelche Klimmzüge zu machen!
Weil timelocal, timelocal_modern und schon dar nicht timelocal_nocheck keine DST-korrekte Addierung eines Tages vornehmen koennen.
Zumindest hat sich das mir noch nicht erschlossen. Es sei denn du zeigst mit ein Code-Schnipsel der das kann.

Zitat von: Beta-User am 10 November 2022, 23:09:48
b) Vorgeschlagen war ein Block-eval. Gibt es irgend einen nachvollziehbaren Grund dafür, dass du das in ein String-eval umbauen mußt?
beta-teilchen hat einen String eval vorgeschlagen:
Zitat von: betateilchen am 09 November 2022, 20:46:02

eval "use MIME::Base64" ;
$useImgTools = 0 if($@);
Log3(undef,4,"InfoPanel: MIME::Base64 missing.") unless $useImgTools;


Diesen habe ich nur entsprechend weiter entwickelt.

Wie dem auch sei.

Der Code

eval {
use utf8;
use JSON;
use JSON::Parse;
use HttpUtils;
use Net::DNS;
use NetAddr::IP;
use Big::Bullshit;
use DateTime;
use DateTime::TimeZone;
1;
}
or do
{
### Log Entry for debugging purposes
Log3 undef, 1, "IONOSAPI - Cannot find one of the libaries in \@INC. Please install the Perl libary first. Initialization of 73_IONOSAPI.pm aborted!";
return;
};

kommt gar nicht erst zum eval, weil er bereits vorher meckert, dass die entsprechende Libary nicht installiert hat.

Zumindest stuerzt fhem beim startup nicht ab.


2022.11.11 09:25:11.117 1: reload: Error:Modul 73_IONOSAPI deactivated:
Can't locate Big/Bullshit.pm in @INC (you may need to install the Big::Bullshit module) (@INC contains: ./FHEM/lib ./lib ./ .//lib .//FHEM . /etc/perl /usr/local/lib/aarch64-linux-gnu/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/aarch64-linux-gnu/perl5/5.28 /usr/share/perl5 /usr/lib/aarch64-linux-gnu/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/aarch64-linux-gnu/perl-base .//FHEM/lib) at .//FHEM/73_IONOSAPI.pm line 87, <$fh> line 135.
BEGIN failed--compilation aborted at .//FHEM/73_IONOSAPI.pm line 87, <$fh> line 135.



Dann kann man sich noch die "or do" sparen.

Gruß
    Sailor
******************************
Man wird immer besser...

Sailor

Zitat von: betateilchen am 11 November 2022, 02:12:30
Dir ist hoffentlich klar, dass Du mit diesem Bullshit alles noch schlimmer machst?

Der von dir vorgeschlagene Code
Zitat von: betateilchen am 09 November 2022, 20:46:02

    eval "use MIME::Base64" ;
    $useImgTools = 0 if($@);
    Log3(undef,4,"InfoPanel: MIME::Base64 missing.") unless $useImgTools;

bricht das Laden und define des Moduls / Device nicht ab.
Das Modul und das Device laden erst einmal normal weiter. So weit so gut.
Aber sobald also die fragliche Funktion, welche die nicht vorhandenen Libary eigentlich bereit stellen soll, aufgerufen wird, stürzt fhem ab bzw. startet neu.

Wenn diese Funktion bereits im weiteren Verlauf der e.g. X_define verwendet werden, gibt es eine undendliche Reboot-Schleife.

Gruß
    Sailor

******************************
Man wird immer besser...

Beta-User

#55
Zitat von: Beta-User am 09 November 2022, 13:20:04
So war es nicht gemeint, das bezog sich auf die "nocheck"-Variante von timelocal...

Für die Kommandozeile:
{ my $ts=1669836392;; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ts);; return localtime(Time::Local::timelocal_nocheck(0,0,0,$mday+1,$mon,$year)) }
Paßt man das für den Oktober an, kommt man auf:
{ my $ts=1669836392-32*DAYSECONDS;; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ts);; return localtime(Time::Local::timelocal_nocheck(0,0,0,$mday+1,$mon,$year)) }
Dann mal die "32" ersetzen durch "31" bzw. "33".

Du kannst es gerne für den März selbst anpassen...

Dass betateilchen einen String-eval aus einem bestehenden Modul gepostet hatte, ist ja prinzipiell ok, aber der funktional gleichwertige Schnippsel von KölnSolar ist an dem Punkt schon weiter (auch wenn man über "or do" auch streiten kann, genauso wie über das "unless", das in den Modulen, die ich unter die Fittiche genommen habe immer die "komischsten" Code-Teile komplett unleserlich gemacht hat - nimm eine zweite Bedingung dazu, negiere eine und es wird zum Hirnverdreher...).

Und dass man das Modul im Fehlerfall nicht normal durchstarten kann, sondern einfach nach dem Laden "tot" stellen muss, versteht sich doch von selbst, oder? (Also keine timer anlegen, set-Befehle ausführen, usw.!)

Nachtrag: Der Block-eval war mit einer anderen Prüfung!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

Mein Kommentar bezog sich nicht darauf, dass Du die Prüfung nun eingebaut hast, sondern vielmehr auf die Art und Weise, WIE Du das umgesetzt hast.

Zitat von: Sailor am 10 November 2022, 22:14:08
Und man kann die gewünschten Module schön untereinander auflisten.

Es geht doch nicht um "schön". Und Deine gesamte regex-Orgie, nur um aus "schön" dann wieder "funktional" zu machen, ist einfach haarsträubend.


my @UseLibaries = ("JSON",
"JSON::Parse",
"HttpUtils");


liefert übrigens direkt das gewünschte Array.

Noch eleganter geht es so:


my @UseLibaries = qw( JSON
JSON::Parse
HttpUtils );


Völlig egal, ob Du das in eine Zeile schreibst oder "schön untereinander - das gesamte regexen ist damit unnötig.

Davon, dass bei Dir in UseLibaries sogar noch ein r fehlt, will ich mal gar nicht reden.

Vielleicht solltest Du Dir doch mal irgendwann ein paar perl-Grundlagen aneignen, bevor Du sämtliche Dir gegebenen Ratschläge einfach ignorierst und weiter vor Dich hin wurschtelst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sailor

Hallo Beta-User

Zitat von: Beta-User am 11 November 2022, 09:31:15
Paßt man das für den Oktober an, kommt man auf:
{ my $ts=1669836392-32*DAYSECONDS;; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ts);; return localtime(Time::Local::timelocal_nocheck(0,0,0,$mday+1,$mon,$year)) }

Ok, hast gewonnen!


# my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $mday = 29;
my $mon  = 9;
my $year = 2023;

my $EpochThisMidnight = Time::Local::timelocal_nocheck(0,0,0,$mday  ,$mon,$year);
my $EpochNextMidnight = Time::Local::timelocal_nocheck(0,0,0,$mday+1,$mon,$year);
my $SecondsToday = $EpochNextMidnight - $EpochThisMidnight;

### Log Entry for debugging purposes
Log3 $name, 1, $name. " - GetHostByName _______________________________________________________________________________";
Log3 $name, 1, $name. " - GetHostByName       - ReadThisMidnight            : " . localtime($EpochThisMidnight);
Log3 $name, 1, $name. " - GetHostByName       - ReadNextMidnight            : " . localtime($EpochNextMidnight);
Log3 $name, 1, $name. " - GetHostByName       - EpochThisMidnight           : " . $EpochThisMidnight;
Log3 $name, 1, $name. " - GetHostByName       - EpochNextMidnight           : " . $EpochNextMidnight;
Log3 $name, 1, $name. " - GetHostByName       - SecondsToday                : " . $SecondsToday;




2022.11.11 10:31:19.737 1: myIonosApi - GetHostByName _______________________________________________________________________________
2022.11.11 10:31:19.737 1: myIonosApi - GetHostByName       - ReadThisMidnight            : Wed Nov 30 00:00:00 2022
2022.11.11 10:31:19.737 1: myIonosApi - GetHostByName       - ReadNextMidnight            : Thu Dec  1 00:00:00 2022
2022.11.11 10:31:19.737 1: myIonosApi - GetHostByName       - EpochThisMidnight           : 1669762800
2022.11.11 10:31:19.738 1: myIonosApi - GetHostByName       - EpochNextMidnight           : 1669849200
2022.11.11 10:31:19.738 1: myIonosApi - GetHostByName       - SecondsToday                : 86400
2022.11.11 10:32:16.087 1: myIonosApi - GetHostByName _______________________________________________________________________________
2022.11.11 10:32:16.088 1: myIonosApi - GetHostByName       - ReadThisMidnight            : Sun Mar 26 00:00:00 2023
2022.11.11 10:32:16.088 1: myIonosApi - GetHostByName       - ReadNextMidnight            : Mon Mar 27 00:00:00 2023
2022.11.11 10:32:16.089 1: myIonosApi - GetHostByName       - EpochThisMidnight           : 1679785200
2022.11.11 10:32:16.089 1: myIonosApi - GetHostByName       - EpochNextMidnight           : 1679868000
2022.11.11 10:32:16.089 1: myIonosApi - GetHostByName       - SecondsToday                : 82800
2022.11.11 10:35:09.118 1: myIonosApi - GetHostByName _______________________________________________________________________________
2022.11.11 10:35:09.118 1: myIonosApi - GetHostByName       - ReadThisMidnight            : Sun Oct 29 00:00:00 2023
2022.11.11 10:35:09.124 1: myIonosApi - GetHostByName       - ReadNextMidnight            : Mon Oct 30 00:00:00 2023
2022.11.11 10:35:09.124 1: myIonosApi - GetHostByName       - EpochThisMidnight           : 1698530400
2022.11.11 10:35:09.124 1: myIonosApi - GetHostByName       - EpochNextMidnight           : 1698620400
2022.11.11 10:35:09.124 1: myIonosApi - GetHostByName       - SecondsToday                : 90000


Nehme ich dann so auf und verzichte auf DateTime.

Gruß
    Sailor
******************************
Man wird immer besser...

Beta-User

#58
Zitat von: Sailor am 11 November 2022, 10:37:49
Ok, hast gewonnen!
...es ging nicht um's gewinnen, sondern darum, eine (für die user!) möglichst unaufwändige funktionierende Lösung zu haben.

Wer bessere Alternativen kennt, darf gerne den Pott haben!

(zur Klarstellung: dieser "nocheck"-Schnippsel stammt auch nicht von mir, sondern von jemandem, der vor mir WeekdayTimer (?) maintaint hat!)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

erwin

...warum eigentlich nicht mit Bordmitteln? Rudi hat das schon in 90_at.pm und 92_FileLog.pm gelöst....
eine "generalisierte" form für 99_Utils:
# calculate number of seconds for given day
# input: 'YYYY-MM-DD HH:MM:SS' (like FHEM DateTime) or unix-Timestamp
# return: Numer of seconds for given day: 86400 (normal), 82800 or 90000 on DST day!
sub secondsToday {
        my $ts = shift;

        $ts = int(time()) if ((! defined($ts)) || $ts eq ''); # no arg given - today
        my $secToday = 0;
        if ($ts =~ /^[\d]+$/ix) { # unix TS
                $ts = FmtDateTime($ts); # convert unix TS into FHEM DateTime
        }
        my ($fy,$fm,$fd, undef) = split(/\D/,$ts,4);
        my $sec   = time_str2num("$fy-$fm-$fd 00:00:00");
        my $secTo = time_str2num("$fy-$fm-$fd 23:59:59") +1;
        $secToday = $secTo - $sec;
        return $secToday;
}

geht sicher noch eleganter....
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...