Hauptmenü

at müllt Logfile zu

Begonnen von Nemo0815, 10 November 2021, 08:00:29

Vorheriges Thema - Nächstes Thema

Nemo0815

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?

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

Nemo0815

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: {

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Nemo0815

#6
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

Beta-User

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...?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Nemo0815

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...

JoWiemann

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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Beta-User

...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).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Nemo0815

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)

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors