Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update 00_SIGNALduino.pm - fix break & WARNING #592

Merged
merged 11 commits into from
Jun 8, 2019

Conversation

HomeAutoUser
Copy link
Contributor

@HomeAutoUser HomeAutoUser commented May 20, 2019

  • Please check if the PR fulfills these requirements
  • Tests for the changes have been added / modified (needed for for bug fixes / features)
  • commandref has been added / updated (needed for bug fixes / features)
  • CHANGED has been updated (needed for bug fixes / features)
  • What kind of change does this PR introduce? (Bug fix, feature, docs update, ...)
  • added check, method defined on protocolDef
  • check defined method exist -> not exists, ERROR Message | no method defined, used system general method SIGNALduino_MCRAW

--> no SIGNALduino break an PEARL WARNING

  • What is the current behavior? (You can also link to an open issue here)
  1. PERL WARNING if method not defined in SD_ProtocolData.pm file
2019.05.20 19:45:51 1: PERL WARNING: Use of uninitialized value in exists at ./FHEM/00_SIGNALduino.pm line 2538.
2019.05.20 19:45:51 1: PERL WARNING: Use of uninitialized value $method in concatenation (.) or string at ./FHEM/00_SIGNALduino.pm line 2540.
  1. system break if defined method in SD_ProtocolData.pm file not exists
    Undefined subroutine &main::SIGNALduino_MCRAW1 called at ./FHEM/00_SIGNALduino.pm line 2546.

to TEST:
a) in file SD_ProtocolData.pm file delete method
b) in file SD_ProtocolData.pm file rename method to a unknown name

  • What is the new behavior (if this is a feature change)?
  • no PERL WARNING
  • break
  • User gets information in logfile or system used standard SIGNALduino_MCRAW sub

- added check method defined on protocolDef
- check defined method exist -> not exists, ERROR Message | no method defined, used system general method SIGNALduino_MCRAW

--> no SIGNALduino break an PEARL WARNING
{
SIGNALduino_Log3 $name, 5, "$name: Error: Unknown function=$method. Please define it in file $0";
my $method;
if (!exists $ProtocolListSIGNALduino{$id}{method}) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Intention verstehe ich, allerdings würde ich es etwas anders lösen.
Ich glaube wir hatten einen vergleichbaren Fall auch schon mal. Ich hoffe ich finde die codestelle.

Die Defaults würde ich 1x beim Einlesen der Daten setzen und nicht bei jeder Verarbeitung.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Defaults würde ich 1x beim Einlesen der Daten setzen und nicht bei jeder Verarbeitung.

korrigierst du den code wenn du die Stelle fandest?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ja, ich hoffe es eilt nicht zu sehr :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Stelle habe ich Gefunden.... allerdings ist das noch in 00_SIGNALduino.pm

Das passt da aber nicht gut hin...

Ihh bin jetzt etwas hin und her gerissen.

  1. Die Protokolldaten werden über lib::SD_Protocols verwaltet.

Ich könnte dort eine Funktion einbauen die nach LoadHash aufgerufen wird.
In etwa sowas wie setDefaut. Dann werden die Standardwerte im Hash hinterlegt.
Das Abrufen der Daten würde ich auf getProperty($id,"method"); ändern.

  • Die Werte müssen nur einmal gesetzt werden und sind dann immer vorhanden
  • 00_SIGNALduino.pm hat keine Kontrolle mehr über die Daten.
  1. In 00_SIGNALduino.pm wird der Wert von Method via $method= checkProperty($id,"method",\&main::SIGNALduino_MCRAW);
    Gesetzt. Dann wird zur Laufzeit verifiziert ob es den method Wert gibt und dann dieser oder der default zurückgegeben.
  • Die Zugriffe auf die Protokolldaten würde ich ohnehin umstellen wollen
  • Das prüfen eines Inhaltes zur Laufzeit kostet ein paar CPU Zyklen.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was du vorhast, habe ich verstanden. Was durchaus besser oder CPU sparender ist, kann ich schwer einschätzen.

Das ein Standard gesetzt wird, wenn Eintrag noch vorhanden ist, finde ich gut.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich denke, den Standard kann man beim Laden der Protokolldaten setzen. Das Programm funktioniert ja ohne die Methode nicht.

Deinen PR müsste ich dafür aber ein bisschen erweitern :)

@elektron-bbs
Copy link
Contributor

Wie ist es denn bei MU und MS geregelt? Ich finde, es sollte wie postDemodulation behandelt werden, um es zu vereinheitlichen und damit auch vereinfachen. Unter Umständen könnte es ja sogar eine Routine für alle werden.

@sidey79
Copy link
Contributor

sidey79 commented May 24, 2019

Wie ist es denn bei MU und MS geregelt? Ich finde, es sollte wie postDemodulation behandelt werden, um es zu vereinheitlichen und damit auch vereinfachen. Unter Umständen könnte es ja sogar eine Routine für alle werden.

Naja, postDemodulation ist optional und muss nicht vorhanden sein.
Die "method" Angabe bei der MC Verarbeitung ist nicht optional

@elektron-bbs
Copy link
Contributor

Warum ist die Angabe eigentlich nicht optional? Wenn sowieso an den Daten keine Veränderung erforderlich ist, braucht man die "method" auch nicht.
Die Längenprüfung könnte sicher auch direkt in SIGNALduino_Parse_MC erfolgen.

@sidey79
Copy link
Contributor

sidey79 commented May 25, 2019

Ohne die methode gibt es nichts zum Ausgeben. Daher ist eine Protokolldefinition ohne diese methode für nichts zu gebrauchen.

@elektron-bbs
Copy link
Contributor

Mhmm, das verstehe ich jetzt nicht.
Wenn ich z.B. Protokoll 57 dispatche:
MC;LL=-653;LH=665;SL=-317;SH=348;D=D55B58;C=330;L=21;
kommt im Modul dieses an:
SD_BELL_Parse Check P57 - 2AA4A7 alone
Das ist die ursprüngliche Nachricht, nur halt invertiert (weil polarity => 'invert',)
Es müsste halt nur hier etwas angepasst werden:

	   	my $method = $ProtocolListSIGNALduino{$id}{method};
	    if (!exists &$method)
		{
			SIGNALduino_Log3 $name, 5, "$name: Error: Unknown function=$method. Please define it in file $0";
		} else {

@HomeAutoUser
Copy link
Contributor Author

Deinen PR müsste ich dafür aber ein bisschen erweitern :)

Wenn du dies musst, kein Problem ;)

@sidey79
Copy link
Contributor

sidey79 commented May 28, 2019

Mhmm, das verstehe ich jetzt nicht.
Wenn ich z.B. Protokoll 57 dispatche:
MC;LL=-653;LH=665;SL=-317;SH=348;D=D55B58;C=330;L=21;
kommt im Modul dieses an:
SD_BELL_Parse Check P57 - 2AA4A7 alone
Das ist die ursprüngliche Nachricht, nur halt invertiert (weil polarity => 'invert',)
Es müsste halt nur hier etwas angepasst werden:

	   	my $method = $ProtocolListSIGNALduino{$id}{method};
	    if (!exists &$method)
		{
			SIGNALduino_Log3 $name, 5, "$name: Error: Unknown function=$method. Please define it in file $0";
		} else {

Ich habe es damals so implementiert, da alle MC Protokolle eine indivduelle Verarbeitung benötigt haben. Ich finde die Variante, verschiedene Verarbeitungsoptionen je Protokoll anwenden zu können auch flexibel.
Wenns hier einen Standard gibt, der die Nachricht 1:1 weitergibt, dann haben wir doch hier keine Baustelle mehr,

@sidey79
Copy link
Contributor

sidey79 commented May 28, 2019

Deinen PR müsste ich dafür aber ein bisschen erweitern :)

Wenn du dies musst, kein Problem ;)

Gut ich mach das. Hatte jetzt nur ein paar andere Aktivitäten um die Ohren.
Ich werde einen Default in der SD_Protocols.pm beim Ladevorgang setzen und \&main::SIGNALduino_MCRAW auch in diese lib verschieben.

@elektron-bbs
Copy link
Contributor

Ich finde es wenig effizient, eine Routine als Standard zu definieren, die eigentlich nichts tut, außer einmal hin und wieder zurück zu wandeln.
Warum nicht die method nur anwenden, wenn sie im Protokoll auch definiert ist, so wie es auch bei postdemodulation realisiert wurde?

Added sub to set defaults
moved MCRAW Output sub to SD_Protocols.pm
This reverts commit ac30131, reversing
changes made to a87e2b1.
removed SIGNALduino_MCRAW
@sidey79
Copy link
Contributor

sidey79 commented May 31, 2019

@HomeAutoUser

Ich habe das nun mal umgeändert.
Beim Implementieren bin ich allerdings unsicher geworden, ob das wirklich eine gute Idee war einen Standard zu setzen. Man hätte das Protokoll auch ignorieren können wenn die methode fehlt.

@HomeAutoUser
Copy link
Contributor Author

Ich habe das nun mal umgeändert.
Beim Implementieren bin ich allerdings unsicher geworden, ob das wirklich eine gute Idee war einen Standard zu setzen. Man hätte das Protokoll auch ignorieren können wenn die methode fehlt.

Du kannst es auch so machen, das das Protokoll ignoriert wird ABER dann bitte einen Hinweis für den User mit maximal Verbose 3.

Man kann es so oder so auslegen wie man solch einen Fehler abfängt. Wir sollten nur keine Pear Warning generieren.

@sidey79
Copy link
Contributor

sidey79 commented Jun 1, 2019

Da stimme ich dir zu.
Nicht angefangen wird aktuell, ob es die referenzierte sub überhaupt gibt.

@HomeAutoUser
Copy link
Contributor Author

Ich habe hier den Konlfikt beseitigt.

Nicht angefangen wird aktuell, ob es die referenzierte sub überhaupt gibt.

Du meinst, wenn es die Sub nicht gibt, so wird nichts angestellt?
Erhält der User eine Ausgabe?

@sidey79
Copy link
Contributor

sidey79 commented Jun 1, 2019

Ich habe hier den Konlfikt beseitigt.

Nicht angefangen wird aktuell, ob es die referenzierte sub überhaupt gibt.

Du meinst, wenn es die Sub nicht gibt, so wird nichts angestellt?
Erhält der User eine Ausgabe?

Manchmal macht das Handy einfach was es will und das ist nicht was ich gerne hätte.
Oder hab ich das am PC geschrieben? Egal, ich meinte so ein Fehler wird nicht abgefangen und das verursacht eine PERL Warnung.

Auf die Schnelle ist mir nicht eingefallen, wie man das überprüft außer via eval.

Added check for existing sub

SD_Protocols.pm

fixed sub syntax for args

test_SD_Protocols-definition.txt

Fixed check for protocol with id 0. Any protocol with a 0 was threated as 0 which is wrong

added test if setDefaults does it job to add method if it is not present

added test for sub MCRAW. not finished for now

test_loadprotohash-definition.txt

moved tests to subtest
fixed test sub MCRAW()
 - test output with max length equal current length
 - test output with current length higher max length
@sidey79
Copy link
Contributor

sidey79 commented Jun 3, 2019

@HomeAutoUser

So ich habe den Fehler mit einer falschen sub abgefangen und auch Tests erstellt.

@HomeAutoUser HomeAutoUser requested a review from sidey79 June 3, 2019 21:12
@HomeAutoUser
Copy link
Contributor Author

@HomeAutoUser

So ich habe den Fehler mit einer falschen sub abgefangen und auch Tests erstellt.

Sind hier von mir noch Handlungen notwendig weil "At least 1 approving review is required by reviewers" steht aber ich kein approve geben kann?

@sidey79
Copy link
Contributor

sidey79 commented Jun 4, 2019

@HomeAutoUser

Schau doch bitte noch mal drüber.
Den Approve button kann ich dann ja drücken, wenn wir beide der Meinung sind, dass so alles "okay" ist.

@@ -2535,7 +2535,7 @@ SIGNALduino_Parse_MC($$$$@)
SIGNALduino_Log3 $name, 5, "$name: extracted data $bitData (bin)";

my $method = lib::SD_Protocols::getProperty($id,"method");
if (!exists &$method)
if (!exists &$method || !defined &{ $method })
{
SIGNALduino_Log3 $name, 5, "$name: Error: Unknown function=$method. Please define it in file $0";
} else {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich muss hier nochmal einhaken:
Wenn ich das richtig verstehe, wird bei falscher method oder bei nicht existierender method eine Fehlermeldung nur bei verbose 5 ausgegeben und es erfolgt keine weitere Auswertung. Der User bekommt im Normalfall (verbsoe 3) davon nichts mit.

Warum drehst du das Ganze nicht einfach rum:
Bei existierender method diese anwenden, sonst halt keine anwenden und einfach die Auswertung fortsetzen.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Existieren wird der Eintrag method immer, solange nicht jemand "rumbastelt".

Die Fehlermeldung, ob die definierte Methode auch existiert ist eher für Entwickler gedacht, welche die Angabe der Methode ja vornehmen.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Man könnte den Eintrag aber auch einfach weglassen, wenn man keine Vorverarbeitung braucht, da es sowieso in einem selbst entwickelten Modul weiter verarbeitet wird.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die "Vorverarbeitung" soll prüfen,

  1. ob die maximale Länge überschritten wurde
  2. Die Daten von einer binären darstellung in eine hexadezimale wandeln

Ich verstehe nicht, wieso dieses flexiblen Auswerten geändert werden soll.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich dachte ja nur, das es ein guter Zeitpunkt wäre, das gleich zu optimieren...

@HomeAutoUser
Copy link
Contributor Author

HomeAutoUser commented Jun 6, 2019

@HomeAutoUser

Schau doch bitte noch mal drüber.
Den Approve button kann ich dann ja drücken, wenn wir beide der Meinung sind, dass so alles "okay" ist.

Mir ist nichts aufgefallen.

Ich verstehe nicht, wieso dieses flexiblen Auswerten geändert werden soll.

Wenn ich @elektron-bbs richtig verstanden habe, so meint er das so, das wenn keine Methode angegeben ist, das dann die Bits unverändert herauskommen. Es geht nicht ums ändern, es geht darum, das wenn nichts angegeben ist und auch die Methode nicht angegeben wurde, das als Standard benutzt wird. (ich vermute als Endresultat in der Verarbeitungsroutine) Die flexible Verarbeitung ist dadurch bleibend. Sobald du eine separate Verarbeitung benötigst, so kann du diese flexible angeben.

@sidey79
Copy link
Contributor

sidey79 commented Jun 6, 2019

Ohne Verarbeitungsmethode fehlt die Längenprüfung und es gibt auch keine Daten zum Dispatchen.
Dann müsste man das, was es schon in der Standard Methode passiert wieder nachentwickeln. Ich sehe da keinen Vortei,l.

sidey79
sidey79 previously approved these changes Jun 6, 2019
@coveralls
Copy link

Pull Request Test Coverage Report for Build 1519

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage remained the same at ?%

Totals Coverage Status
Change from base Build 1518: 0.0%
Covered Lines:
Relevant Lines: 0

💛 - Coveralls

1 similar comment
@coveralls
Copy link

coveralls commented Jun 7, 2019

Pull Request Test Coverage Report for Build 1519

  • 0 of 0 changed or added relevant lines in 0 files are covered.
  • No unchanged relevant lines lost coverage.
  • Overall coverage remained the same at ?%

Totals Coverage Status
Change from base Build 1518: 0.0%
Covered Lines:
Relevant Lines: 0

💛 - Coveralls

@HomeAutoUser HomeAutoUser merged commit 2a928bc into RFD-FHEM:dev-r34 Jun 8, 2019
@HomeAutoUser HomeAutoUser deleted the dev-r34_method_check branch June 14, 2019 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants