Korrekte Syntax FHEM-Befehl in Perl im ...notify... in myUtils auslagern

Begonnen von TomLee, 10 Juli 2020, 12:34:40

Vorheriges Thema - Nächstes Thema

frober

Zitat von: Otto123 am 04 März 2021, 20:23:33
Hallo Bernd,

aus meiner Sicht sitzt Du auf dem falschen Pferd
https://metacpan.org/pod/Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen

Tipp Wenn Du das Buch nicht hast führt dieser String zum Ziel : "perlcritic Two-argument "open" used"

Gruß Otto

Hallo Otto,

Ich habe die Webseite benutzt, die Beta-User hier verlinkt hat. Da sieht man im Popup der Fehlermeldung good and bad.

http://perlcritic.com/


Grüße Bernd
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

Jo, und wenn man den Empfehlungen dann folgt, kommt in etwa das hier raus:

package main;

use strict;
use warnings;

sub
myUtils_Logdatei_Initialize {
  my $hash = shift;
  return;
}

# Logdatei zum debuggen
#
# $file = name.log;
# debuglog("blabla",$file);

sub debuglog {
  my $myState = shift // return; #Beta-User: Perl defined-or
  my $file    = shift //  q{unnamed.log};
  my $fileName = "/opt/fhem/log/$file";
  if(open my $DATEI, q{>>}, $fileName) {
    print ($DATEI Zeitstempel()."$myState\n");
    return close ($DATEI);
  } else {
    return "Can't open $fileName: $!";
  }
  return;
}
1;

EDIT: Korrektur, danke an Otto!
EDIT2: %L muss man erst auflösen, daher doch hart vercodet
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

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Zitat von: Otto123 am 04 März 2021, 20:55:21
my DATEI dürfte nichts werden :)
:o :o :o
so isses, wenn man sich zu sehr auf tools verläßt; ein $ davor und es sollte funktionieren ::) ...

(Ich teste es dann mal ;D )
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

frober

Nun verstehe ich nichts mehr. :( :o

@Beta-User du hattest die Seite verlinkt.
Ist das wirklich alles Quatsch, alles so lassen wie es war?

Ich habe ja nicht eins zu eins angeschrieben, gut die Anführungszeichen habe ich vergessen.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Otto123

Deine beiden Fehler:
(open my $DATEI, q{>>}, $fileName)

1. Barewood DATEI 2. Two-argument ">> $fileName"

@Beta-User sollte man die myUtilsTemplate ändern?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Ähm, es ist schon "etwas" anders, oder?

Habe den code oben nochmal geändert und die $ reingeflickt, dann meckert die Seite den Punkt auch nicht mehr an, so funkionierte das grade in meinem Test.

Mußte zum Testen jetzt nur etwas suche, um die Zeitstempelfunktion aus fhem.pl zu suchen:
sub debuglog {
  my $myState = shift // return; #Beta-User: Perl defined-or
  my $file    = shift //  q{unnamed.log};
  my $fileName = "/opt/fhem/log/$file";
  if(open my $DATEI, q{>>}, $fileName) {
    print ($DATEI ( FmtDateTime(time)." $myState\n"));
    return close ($DATEI);
  } else {
    return "Can't open $fileName: $!";
  }
  return;
}

Meistens sind die Veränderungen auch nicht riesig, die perlcritic vorschlägt, oder man stößt eben auf irgendwas "deeply nested", das man selbst noch nie verstanden hat...

Zitat von: Otto123 am 04 März 2021, 21:18:55
@Beta-User sollte man die myUtilsTemplate ändern?
Das muss letztlich Rudi entscheiden, ich würde nach jetzigem Kenntnisstand (weiter) dazu neigen, ein alternatives Template anzubieten. (Die Art Diskussion hatte ich vor einiger Zeit schon mal mit CoolTux).

Man muss nämlich ohne Prototypen schon an der einen oder anderen Stelle aufpassen: ein mit shift aus der Parameter-Liste geholter Parameter sollte immer in" my $parambla = shift;".
Es kann aber Fälle geben, in denen dann $parambla trotz des $-Siegels kein scalar ist, sondern sich ein array oder hash (oder eine Referenz darauf) verbirgt... Erkläre das mal einen noob, der bekommt bei "for (@{$parambla}) {" oder "for ( keys %{$parambla}) {" große Augen....
(Wer aber intensiver in das Thema einsteigt, sollte sich damit beschäftigen!)
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

frober

Danke, jetzt bin ich wieder beruhigt. ;)

Die Zeitstempelfunktion aus fhem.pl ist die, die fürs Log benutzt wird, denke ich. Dann kann ich meine ja 'entsorgen'.

Was ich noch nicht verstehe, wo kommt der Inhalt von my $DATEI her? Das ist doch der Dateihandler!? Falls dies in der fhem.pl schon deklariert ist, wo bekomme ich solche Infos, Developer API?

@Beta-User deine edits hatte ich erst später gesehen.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

Beta-User

Die Funktion wird vermutlich nicht nur für's loggen verwendet, sondern z.B. auch für die Darstellung der Zeitstempel in FHEMWEB, denke ich. Müßte via grep rauszufinden sein...

Eine Variable "entsteht" (mit undef-Inhalt) in dem Moment, in dem du sie deklarierst. (Und zur Klarstellung: undef ist was anderes wie 'undef', auch wenn das unlängst ein User unbedingt ignorieren wollte). Dabei mußt du nur sicherstellen, dass es nichts gleiches im selben lexikalen Kontext gibt (daher package ich zwischenzeitlich mehr oder weniger alles, was auch Teil von myUtils-template für Fortgeschrittene wäre...).
Ist der lexikale Kontext beendet, hört die Variable (in der Regel) auch wieder auf zu existieren, von daher ist die Frage nach $DATEI aus Perl-Sicht m.E. etwas falsch gestellt. (Die Vorgehensweise per C (&Co), die man von MySensors her vielleicht kennt, scheint etwas anders zu sein, da stellt man in der Regel vorneweg klar, was für Variablen man haben will und auch, welchen Typs die sein sollen. Würde man das "Perl-like" irgendwo verstreuen, wäre Chaos vorprogrammiert...)
Falls du mal was doppelt deklarieren solltest, findet sich das im Log (masks earlier...)

Was in der DevelopmentAPI (und der Intro dazu im Wiki) dokumentiert ist, sollte "änderungfest" sein, aber auch "normale" Funktionen aus fhem.pl dürfte Rudi kaum (vom Namen her) ändern. Was es gibt, ist meistens "sprechend" benannt und in der Liste am Anfang der .pl zu finden...
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

frober

OK, danke. Ich hatte die falsche Annahme, dass mit ursprünglich DATEI der Dateihandler ( als Programm) aufgerufen wird. Das ist quasi
nur ein "Platzhalter".
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

TomLee

Frage, weil ich mich dabei ziemlich doof anstelle und mir keine Lösung kommt.
Wie bekomme ich denn in meine sub Cube die 2 Events einer sequence-Definition (mit gesetztem triggerPartial Attribut) die mir das unterscheiden zw. Einfach.- und Doppel-tap des Cube ermöglichen soll ?

Ich meine eine Lösung könnte sein über ein weiteres notify welches $EVENT global übergibt (les ich aus den Bemerkungen hier), mir ist aber nicht klar wo/wie das dann genau in der myUtils erfolgen soll.

TomLee

Habs denk ich, so wär die Variable global verfügbar :

Zitatsub notifysequence {
   my $EV1 = shift;

sub irgendwas {bla}

sub irgendwas {bla}

sub irgendwas {bla}

}

Korrekt ?

Es gibt keinen anderen Weg auf die Events von sequence zu reagieren ?

Die 2 zusätzlichen Device-Definitionen notify und sequence sind wirklich nötig um einen Doppel-tap zu realisieren oder hat jemand noch einen anderen Vorschlag ?

Ich wollte es wieder mit Each umsetzen das wäre eine Definition weniger, kommt mir aber nicht richtig vor dazu in der myUtils in einen fhem()-Befehl zu wechseln um das sleep und anschliessend den Perl-Code auszuführen.



TomLee

Jetzt frag ich mich wie man denn eine Variable wirklich global (über mehrere|alle myUtils) verfügbar machen kann.

Würde sich ja anbieten bspw. bei einem Presence-Device.

Wär jemand so nett ein Beispiel zu zeigen oder zu verlinken ?

Beta-User

Zitat von: TomLee am 16 März 2021, 18:24:21
Jetzt frag ich mich wie man denn eine Variable wirklich global (über mehrere|alle myUtils) verfügbar machen kann.
https://wiki.fhem.de/wiki/99_myUtils_anlegen#Globale_Ablage_von_Daten
=> Eine Möglichkeit: %data nutzen.
Ein Beispiel ist im Wiki verlinkt.

ZitatWürde sich ja anbieten bspw. bei einem Presence-Device.
M.E. "beißt" sich das: Entweder die Daten sollen zu einem Device gehören, dann sollten sie m.E. auch im Device-Hash "verortet" sein (Abruf via ReadingsVal/AttrVal&Co), oder es ist eben was, was man unabhängig von einem Device halten will/muss, (nur) das wäre dann %data.

Aber auch hier: TIMTOWTDI....
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

TomLee

Hier, so mein ich es zu verstehen, wird ein Beispiel gezeigt.

Die Variable, so versteh ich es bisher kann in irgendeiner myUtils in Initialize deklariert werden, also der Teil:

sub
myUtils_Initialize($$)
{
my ($hash) = @_;
my $NewMailtime = time;
}


In FHEM, in dem Beispiel also im notify, ist dann ein Zugriff auf die Variable mit $main::NewMailtime möglich.

Hab ich versucht nachzuvollziehen:
sub
Abfall_myUtils_Initialize($$)
{
  my ($hash) = @_;
  my $bla = 'irgendwas';
}


Und
{return $main::bla}
und klappt nicht.

Auch ist mir nicht klar wie der Zugriff erfolgen könnte/sollte wenn Initialize, wie schonmal vorgeschlagen, so definiert ist:

sub Remotes_myUtils_Initialize {
  my $hash = shift//return;
  my $bla = "irgendwas";
  return;
}


edit: den letzten genannten Link muß ich mir noch anschauen da ich gerade am schreiben war