Hallo zusammen,
ich habe mir ein at erstellt, dass u.a. Perl Code (direkt und über die 99_MyUtils) enthält.
Dabei wird jetzt trotz Verbose 0 (oder egal was ich hier einstelle) immer der komplette at inkl. Code geloggt und entsprechend das Logfile gefüllt.
Kann man das irgendwie ändern?
Indem du vielleicht erst mal ein list des at, die myUtils-Sub und Auszüge aus dem Log postest, weil was soll man sonst helfen?
Und bitte in "code-Tags", das '#' im "Menü"...
Gruß, Joachim
Zitat von: Nemo0815 am 10 November 2021, 08:00:29
Hallo zusammen,
ich habe mir ein at erstellt, dass u.a. Perl Code (direkt und über die 99_MyUtils) enthält.
Dabei wird jetzt trotz Verbose 0 (oder egal was ich hier einstelle) immer der komplette at inkl. Code geloggt und entsprechend das Logfile gefüllt.
Kann man das irgendwie ändern?
Das kenne ich nur, wenn der Code fehlerhaft ist oder zumindest ein Warning drin ist.
Bei mir steht dann in den Zeilen vor dem Code im Log auch was.
Ja, da sind bestimmt Warnings drin, weil ich da drin telnet verwende und es da zu timeouts kommen kann, aber kann ich verhindern dass trotz warnings es zu einer Ausgabe im Log kommt?
Dachte dafür wäre das verbose attribute eigentlich gedacht ...
99_myUtils:
my $tab = new Net::Telnet (Timeout => 5 );
sub OpenESP3D()
{
$tab->open("esp3D");
}
sub TriggerESP3D($) {
my ($cmd) = @_;
#$tab2->open("esp3d");
$tab->print($cmd);
}
sub GetTab()
{
return $tab;
}
das At:
Internals:
COMMAND {
OpenESP3D();
TriggerESP3D("M105");
TriggerESP3D("M114");
TriggerESP3D("M27");
my $tab = GetTab(); # Telnet object
my $i = 10;
while ((my $line = $tab->getline()) && ($i-- > 0)){
if( $line =~ /T\:.*B\:.*/ ) {
my @val = (split(/[:\/\s]+/, $line));
fhem("setreading ESP3DStatus Hotend_Temperature @val[2]");;
fhem("setreading ESP3DStatus Hotend_MaxT @val[3]");;
fhem("setreading ESP3DStatus Base_Temperature @val[5]");;
fhem("setreading ESP3DStatus Base_MaxT @val[6]");;
}
if( $line =~ /X\:.*Y\:.*Z\:.*/ ) {
my @val2 = (split(/[:\s]+/,$line));;
fhem("setreading ESP3DStatus X_Coord @val2[1]");;
fhem("setreading ESP3DStatus Y_Coord @val2[3]");;
fhem("setreading ESP3DStatus Z_Coord @val2[5]");;
fhem("setreading ESP3DStatus Extruder @val2[7]");;
fhem("setreading ESP3DStatus X_Count @val2[10]");;
fhem("setreading ESP3DStatus Y_Count @val2[12]");;
fhem("setreading ESP3DStatus Z_Count @val2[14]");;
}
if( $line =~ /Not\sSD\sprinting/)
{
fhem("setreading ESP3DStatus Status Idle");;
}
if( $line =~ /SD\sprinting\sbyte.*/){
fhem("setreading ESP3DStatus Status Printing");;
my @val3 = (split(/[:\/\s]+/,$line));;
my $percent = sprintf("%.1f %",@val3[3]/@val3[4] *100);;
fhem("setreading ESP3DStatus PercentComplete $percent");;
}
#else
{
fhem("setreading ESP3DStatus lastRawStatus $line");;
}
} # while
}
DEF +*00:00:30 {
OpenESP3D();
TriggerESP3D("M105");
TriggerESP3D("M114");
TriggerESP3D("M27");
my $tab = GetTab(); # Telnet object
my $i = 10;
while ((my $line = $tab->getline()) && ($i-- > 0)){
if( $line =~ /T\:.*B\:.*/ ) {
my @val = (split(/[:\/\s]+/, $line));
fhem("setreading ESP3DStatus Hotend_Temperature @val[2]");;
fhem("setreading ESP3DStatus Hotend_MaxT @val[3]");;
fhem("setreading ESP3DStatus Base_Temperature @val[5]");;
fhem("setreading ESP3DStatus Base_MaxT @val[6]");;
}
if( $line =~ /X\:.*Y\:.*Z\:.*/ ) {
my @val2 = (split(/[:\s]+/,$line));;
fhem("setreading ESP3DStatus X_Coord @val2[1]");;
fhem("setreading ESP3DStatus Y_Coord @val2[3]");;
fhem("setreading ESP3DStatus Z_Coord @val2[5]");;
fhem("setreading ESP3DStatus Extruder @val2[7]");;
fhem("setreading ESP3DStatus X_Count @val2[10]");;
fhem("setreading ESP3DStatus Y_Count @val2[12]");;
fhem("setreading ESP3DStatus Z_Count @val2[14]");;
}
if( $line =~ /Not\sSD\sprinting/)
{
fhem("setreading ESP3DStatus Status Idle");;
}
if( $line =~ /SD\sprinting\sbyte.*/){
fhem("setreading ESP3DStatus Status Printing");;
my @val3 = (split(/[:\/\s]+/,$line));;
my $percent = sprintf("%.1f %",@val3[3]/@val3[4] *100);;
fhem("setreading ESP3DStatus PercentComplete $percent");;
}
#else
{
fhem("setreading ESP3DStatus lastRawStatus $line");;
}
} # while
}
FUUID 6189150f-f33f-a685-6593-28fb5a16154e4510
NAME GetESP3DStatusAt
NR 446
NTM 10:12:47
PERIODIC yes
RELATIVE yes
REP -1
STATE inactive
TIMESPEC 00:00:30
TRIGGERTIME 1636535567.59148
TRIGGERTIME_FMT 2021-11-10 10:12:47
TYPE at
READINGS:
2021-11-10 10:12:17 state inactive
Attributes:
room 3D Drucker
verbose 1
Log Auszug:
2021.11.10 02:31:47 3: eval: {
OpenESP3D();
TriggerESP3D("M105");
TriggerESP3D("M114");
TriggerESP3D("M27");
my $tab = GetTab(); # Telnet object
my $i = 10;
while ((my $line = $tab->getline()) && ($i-- > 0)){
if( $line =~ /T\:.*B\:.*/ ) {
my @val = (split(/[:\/\s]+/, $line));
fhem("setreading ESP3DStatus Hotend_Temperature @val[2]");;
fhem("setreading ESP3DStatus Hotend_MaxT @val[3]");;
fhem("setreading ESP3DStatus Base_Temperature @val[5]");;
fhem("setreading ESP3DStatus Base_MaxT @val[6]");;
}
if( $line =~ /X\:.*Y\:.*Z\:.*/ ) {
my @val2 = (split(/[:\s]+/,$line));;
fhem("setreading ESP3DStatus X_Coord @val2[1]");;
fhem("setreading ESP3DStatus Y_Coord @val2[3]");;
fhem("setreading ESP3DStatus Z_Coord @val2[5]");;
fhem("setreading ESP3DStatus Extruder @val2[7]");;
fhem("setreading ESP3DStatus X_Count @val2[10]");;
fhem("setreading ESP3DStatus Y_Count @val2[12]");;
fhem("setreading ESP3DStatus Z_Count @val2[14]");;
}
if( $line =~ /Not\sSD\sprinting/)
{
fhem("setreading ESP3DStatus Status Idle");;
}
if( $line =~ /SD\sprinting\sbyte.*/){
fhem("setreading ESP3DStatus Status Printing");;
my @val3 = (split(/[:\/\s]+/,$line));;
my $percent = sprintf("%.1f %",@val3[3]/@val3[4] *100);;
fhem("setreading ESP3DStatus PercentComplete $percent");;
}
#else
{
fhem("setreading ESP3DStatus lastRawStatus $line");;
}
} # while
}
2021.11.10 02:31:47 1: PERL WARNING: Scalar value @val2[10] better written as $val2[10] at (eval 151221) line 29.
2021.11.10 02:31:47 3: eval: {
Was genau tust du/willst du tun?
Warum per at in fhem und nicht auf System-Ebene?
Die while-Schleife blockiert, das ist dir bewusst!?
Was mit den setreadings in der blockierend durchgeführten Schleife passiert: fraglich...
Und
Zitat
2021.11.10 02:31:47 3: eval: {
Ist doch sowas wie eine Exception also zumindest ein schwerer Fehler, oder?
Das darf schon im Log stehen und es kommt verm. aus "dem System" und nicht "von fhem" selbst -> daher wirkt verbose u.U. nicht?
Habe aber nicht ganz genau verstanden was du da so treibst, ist mir "zu wirr", sorry.
Da muss jemand ran der wirklich Ahnung von Perl etc. hat...
Gruß, Joachim
Zitat von: MadMax-FHEM am 10 November 2021, 10:24:19
Da muss jemand ran der wirklich Ahnung von Perl etc. hat...
Es steht doch schon ziemlich genau da, was zu tun ist:
PERL WARNING: Scalar value @val2[10] better written as $val2[10] at (eval 151221) line 29.
(vermutlich kommt diese Art Warning noch ein paar Mal mehr für andere Zeilen...)
Popcorn-Thread, oder?
PS: eine globale Variable zu schaffen mit dem Namen "$tab" erscheint mir fehleranfällig, aber da der TE ja vermutlich weiß, was er da tut, soll es mir egal sein...
Zitat von: Beta-User am 10 November 2021, 10:27:57
Es steht doch schon ziemlich genau da, was zu tun ist:
PERL WARNING: Scalar value @val2[10] better written as $val2[10] at (eval 151221) line 29.
(vermutlich kommt diese Art Warning noch ein paar Mal mehr für andere Zeilen...)
Popcorn-Thread, oder?
PS: eine globale Variable zu schaffen mit dem Namen "$tab" erscheint mir fehleranfällig, aber da der TE ja vermutlich weiß, was er da tut, soll es mir egal sein...
Naja, ist alles noch etwas quick and dirty (funktioniert aber) und Perl ist jetzt auch nicht unbedingt meine Muttersprache :D
Wollte eigentlich nur vermeiden das ganze ausserhalb vom FHEM zu machen (Faulheit). Hab gerne alles an einem Platz
Ziel ist es mittels Telnet den ESP8266 zu pollen und sich die aktuellen Stati zu holen, aber ich seh schon wäre am Ende als Cronjob wohl besser aufgehoben
Besserer globaler Variablennamen (myUtils) mit flexiblerer Ziel-Übergabe:
my $myesp3Dtab = new Net::Telnet (Timeout => 5 );
sub OpenESP3D {
my $target = shift // return;
$myesp3Dtab->open($target);
}
sub TriggerESP3D {
my $cmd = shift // return;
$myesp3Dtab->print($cmd);
}
sub GetTab()
{
return $myesp3Dtab;
}
Ungetestete neue DEF:
{
OpenESP3D('esp3D');
TriggerESP3D('M105');
TriggerESP3D('M114');
TriggerESP3D('M27');
my $tab = GetTab(); # Telnet object
my $i = 10;
while ((my $line = $tab->getline()) && ($i-- > 0)){
if( $line =~ /T\:.*B\:.*/ ) {
my @val = (split(/[:\/\s]+/, $line));
fhem("setreading ESP3DStatus Hotend_Temperature $val[2];
setreading ESP3DStatus Hotend_MaxT $val[3];
setreading ESP3DStatus Base_Temperature $val[5];
setreading ESP3DStatus Base_MaxT $val[6]");;
}
if( $line =~ /X\:.*Y\:.*Z\:.*/ ) {
my @val2 = (split(/[:\s]+/,$line));;
fhem("
setreading ESP3DStatus X_Coord $val2[1];
setreading ESP3DStatus Y_Coord $val2[3];
setreading ESP3DStatus Z_Coord $val2[5];
setreading ESP3DStatus Extruder $val2[7];
setreading ESP3DStatus X_Count $val2[10];
setreading ESP3DStatus Y_Count $val2[12];
setreading ESP3DStatus Z_Count $val2[14]");;
}
if( $line =~ /Not\sSD\sprinting/)
{
fhem("setreading ESP3DStatus Status Idle");;
}
if( $line =~ /SD\sprinting\sbyte.*/){
fhem("setreading ESP3DStatus Status Printing");;
my @val3 = (split(/[:\/\s]+/,$line));;
my $percent = sprintf("%.1f %",$val3[3]/$val3[4] *100);;
fhem("setreading ESP3DStatus PercentComplete $percent");;
}
#else
{
fhem("setreading ESP3DStatus lastRawStatus $line");;
}
} # while
}
Ist das wirklich so schwer, dass man direkt die Flinte ins Korn werfen muss...?
Danke! Das hat mir schonmal die Warnings aus dem Log enfernt!
Fragt sich nur wie's noch mit dem blockieren aussieht wenn der Slave nicht verfügbar ist...
Hallo,
die Funktion fhem() kennt noch einen optionalen 2ten Parameter, mit dem ein Log-Eintrag unterdrückt werden kann.
fhem("setreading <reading> <value>", 0|1)
Bei 1 wird kein Log-Eintrag erzeugt.
Grüße Jörg
...hilft aber auch nicht mit dem blockieren...
Was ist das für ein Teil? "Spricht" das MQTT? Wenn ja, geht es damit vermutlich sehr viel einfacher, ansonsten gäbe es noch diverse andere Module, um Daten von Netzwerkgeräten abzufragen (insbes. HTTPMOD, jsonMod).
Zitat von: Beta-User am 10 November 2021, 12:08:43
...hilft aber auch nicht mit dem blockieren...
Was ist das für ein Teil? "Spricht" das MQTT? Wenn ja, geht es damit vermutlich sehr viel einfacher, ansonsten gäbe es noch diverse andere Module, um Daten von Netzwerkgeräten abzufragen (insbes. HTTPMOD, jsonMod).
Das hier https://github.com/luc-github/ESP3D
ich nutze aber im Moment nur die Telnet Schnittstelle davon, mit HTTPMOD bin ich da nicht weitergekommen (Java Script)
Hmm, ok, das scheint dann nicht zu passen...
Wenn der timeout nicht drastisch kleiner gesetzt werden kann, wäre es vermutlich sinnvoller, den Code als eigenständiges (Perl- ;) ) Programm außerhalb von FHEM auszuführen und dann die Ergebnisse via telnet/MQTT/whatever (asynchron) an FHEM zu übergeben.