Interfaces durch Type Library ersetzen

Begonnen von Dr. Boris Neubert, 24 April 2014, 20:22:26

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo Rudi,

zur Vorbereitung der lokalen Tests, eine Type Library mit Semantik für Readings zu verwenden, möchte ich Dich bitten, den beiliegenden Patch einzuspielen. Er entfernt die glücklosen Interfaces und fügt stattdessen einen frühen Aufruf in die bereits eingecheckte RTypes.pm hinzu.

Vielen Dank im Voraus.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Habs eingecheckt, bis auf die
  (my $dir = $0) =~ s+[/\\][^/\\]*$++; # Find the FHEM directory
  chdir($dir);

Verschiebung, da es z.Bsp. bei sowas wie "perl fhem.pl fhem.cfg" ein chdir("fhem.pl") versucht, und ich nicht alle Seiteneffekte durchblicke. Dass bei Windows sowas auch schiefgeht, ist mir nicht so wichtig :)

Wozu ist RTypes_ShowTypeLibrary() gedacht?

betateilchen

Kann es sein, dass die Änderung in irgendeiner Konfiguration zu einer Endlosschleife beim Starten von fhem führen kann?

http://forum.fhem.de/index.php/topic,22880.0.html

Wenn der User die letzte fhem.pl vor dem Einbau der RTypes verwendet, tritt das Problem nicht auf.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: rudolfkoenig am 24 April 2014, 21:19:37
Habs eingecheckt, bis auf die
  (my $dir = $0) =~ s+[/\\][^/\\]*$++; # Find the FHEM directory
  chdir($dir);

Verschiebung, da es z.Bsp. bei sowas wie "perl fhem.pl fhem.cfg" ein chdir("fhem.pl") versucht, und ich nicht alle Seiteneffekte durchblicke. Dass bei Windows sowas auch schiefgeht, ist mir nicht so wichtig :)

Erstmal Danke fürs Einchecken. Allerdings funktioniert es ohne den vorherigen Wechsel ins Verzeichnis von fhem.pl nicht. Das Problem ist nämlich, daß FHEM::RTypes nicht gefunden wird.

Zitat
Wozu ist RTypes_ShowTypeLibrary() gedacht?

Der Aufruf soll die Inhalte der Type Library loggen.

Insgesamt ist die Problematik folgende, weswegen ich gestern unangemessen lange über den wenigen Zeilen Code gebrütet habe: die Type Library soll geladen werden, bevor die Module geladen werden. Allerdings werden die Module in einem Rutsch mit der globalen Konfiguration geladen, welche erst den modpath setzt, so daß es da kein Dazwischenkommen gibt. Es hilft bei mir auch nicht, RTypes.pm ins selbe Verzeichnis wie fhem.pl zu legen.

Ich kann vor dem Aufruf der Konfiguration nichts loggen, weil das zentrale Log ja erst nach Aufruf der Konfiguration existiert.

Anbei erst einmal ein Patch, der den Absturz bei RTypes_ShowTypeLibrary() wegpatcht.

Wie kann das grundsätzliche Problem gelöst werden?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#4
Zitat von: Dr. Boris Neubert am 25 April 2014, 19:25:36
Insgesamt ist die Problematik folgende, weswegen ich gestern unangemessen lange über den wenigen Zeilen Code gebrütet habe: die Type Library soll geladen werden, bevor die Module geladen werden. Allerdings werden die Module in einem Rutsch mit der globalen Konfiguration geladen, welche erst den modpath setzt, so daß es da kein Dazwischenkommen gibt. Es hilft bei mir auch nicht, RTypes.pm ins selbe Verzeichnis wie fhem.pl zu legen.

Ich habe Dein Problem noch nicht wirklich erkannt. Kannst Du das Problem bitte nochmal irgendwie anders beschreiben? Vielleicht einfach mal die Abfolge beschreiben, die Du Dir beim fhem-Start vorstellst, ausgehend vom Aufruf "perl fhem.pl"


  • perl startet und lädt fhem.pl, die Ausführung von fhem.pl beginnt.
  • das virtuelle Device "global" wird definiert
  • configDB wird geladen, falls benötigt
  • globale Attribute werden geladen und gesetzt, während dieses Vorgangs werden die ersten Module geladen, sobald das Attribut "modpath" erscheint

Eigentlich müßte doch das Laden Deiner RTypes.pm zwischen Punkt 3 und 4 problemlos funktionieren?
Zu dem Zeitpunkt kannst Du auch problemlos loggen - es funktioniert jedenfalls in Punkt 3 schon ohne Schwierigkeiten.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

getestet:


2014.04.25 19:59:34 0: Server shutdown
2014.04.25 19:59:36 1: Hier spricht RTypes
2014.04.25 19:59:36 1: DEBUG>99_myTest.pm initialized
2014.04.25 19:59:36 3: telnetPort: port 7072 opened
2014.04.25 19:59:36 3: WEB: port 8083 opened
2014.04.25 19:59:37 0: Server started with 7 defined entities


Erkenntnis:

  • Deine RTypes werden also VOR dem ersten Modul geladen.
  • Das Logging funktioniert schon in der _Initialize

in meiner fhem.pl sieht es so aus:


###################################################
# Server initialization
doGlobalDef($ARGV[0]);

if(configDBUsed()) {
  eval "use configDB";
  Log 1, $@ if($@);
  cfgDB_Init();
}

eval { # make errors non-lethal
  require FHEM::RTypes;
  RTypes_Initialize();
};

# As newer Linux versions reset serial parameters after fork, we parse the


die RTypes sieht so aus:


package main;

use strict;
use warnings;

sub Log($$);

sub
RTypes_Initialize() {
  Log 1, "Hier spricht RTypes";
  # Logging is not yet available at this stage
 
}

sub
RTypes_ShowTypeLibrary() {

  Log3 undef, 5, "Type Library:";

}

1;


also was genau ist Dein Problem?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Ich habe
- RTypes_Initialize nach setGlobalAttrBeforeFork verschoben.
- in setGlobalAttrBeforeFork GlobalAttr aufgerufen. Diese Routine setzt @INC auf modpath/FHEM, und damit ist das Laden aus dem FHEM Verzeichnis auch ohne ein chdir moeglich.
- das eval um das RType laden entfernt. Da spaeter RTypes_ShowTypeLibrary unkonditional aufgerufen wird, ist das wertlos, und lieber habe ich eine aussagekraeftige Fehlermeldung.
- den Aufruf von fhem.pl aus einem anderen Verzeichnis getestet
- das aktuelle fhem.pl fuer update zur Verfuegung gestellt

ZitatDer Aufruf soll die Inhalte der Type Library loggen.
Das verstehe ich immer noch nicht. Oder wenn doch, dann ist sowas mAn hier fehl am Platz: die Doku soll nicht beim starten von fhem.pl gezeigt werden.

betateilchen

@ Rudi:

Deine Änderung in #5658 führt bei mir dazu, dass fhem nicht mehr startet!

Kopiere ich die RTypes.pm aus /opt/fhem/FHEM nach /opt/fhem funktioniert es.


root@cubie:/opt/fhem# perl fhem.pl configDB

Can't locate RTypes.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at fhem.pl line 429.

root@cubie:/opt/fhem# cp FHEM/RTypes.pm .
root@cubie:/opt/fhem# perl fhem.pl configDB
root@cubie:/opt/fhem#

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

betateilchen

Zitat von: rudolfkoenig am 26 April 2014, 08:57:12
Ich habe
- RTypes_Initialize nach setGlobalAttrBeforeFork verschoben.

In der fhem.pl die ich gerade ausgecheckt habe, liegt das Initialize aber ausserhalb von setGlobalAttrBeforeFork.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatDeine Änderung in #5658 führt bei mir dazu, dass fhem nicht mehr startet!
Herrlich, dass per email das Rot nicht rueberkommt :)

Ich vermute, das liegt an dem cfgDB_GlobalAttr, den ich nicht angepasst habe, um GlobalAttr aufzurufen.
Wir sollten alles auf einem zu bauenden readFile/writeFile umstellen (Argument und Rueckgabe ein array von Zeilen), damit die eigentlichen Funktionen an eine Stelle sind.

Zitat- RTypes_Initialize nach setGlobalAttrBeforeFork verschoben.

Mit "nach" meinte ich "nach dem Aufruf von", und nicht "rein in die Funktion"

betateilchen

Zitat von: rudolfkoenig am 26 April 2014, 10:03:47
Mit "nach" meinte ich "nach dem Aufruf von", und nicht "rein in die Funktion"

Hellsehen kann ich nicht.

Ich schau mir mal das cfgDB_GlobalAttr an und vergleiche, was Du in GlobalAttr umgebaut hast.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ich habe jetzt den Aufruf von GlobalAttr() in configDB.pm übernommen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo Rudi,

Zitat von: rudolfkoenig am 26 April 2014, 08:57:12
Ich habe
- RTypes_Initialize nach setGlobalAttrBeforeFork verschoben.
- in setGlobalAttrBeforeFork GlobalAttr aufgerufen. Diese Routine setzt @INC auf modpath/FHEM, und damit ist das Laden aus dem FHEM Verzeichnis auch ohne ein chdir moeglich.
- das eval um das RType laden entfernt. Da spaeter RTypes_ShowTypeLibrary unkonditional aufgerufen wird, ist das wertlos, und lieber habe ich eine aussagekraeftige Fehlermeldung.
- den Aufruf von fhem.pl aus einem anderen Verzeichnis getestet
- das aktuelle fhem.pl fuer update zur Verfuegung gestellt

Vielen Dank für die Änderungen. Ich verstehe zwar nicht, warum die jetzt von Dir gewählte Reihenfolge bei meinen ersten Gehversuchen nicht funktioniert hatte. Jedenfalls läuft das so jetzt und das ist gut.

Zitat
Das verstehe ich immer noch nicht. Oder wenn doch, dann ist sowas mAn hier fehl am Platz: die Doku soll nicht beim starten von fhem.pl gezeigt werden.

Es geht darum, für Debugging-Zwecke etwas auszugeben. Da aus dem RTypes_Initialize() heraus nun das Logging funktioniert, darf der Aufruf von RTypes_ShowTypeLibrary() gerne raus.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Zitatwarum die jetzt von Dir gewählte Reihenfolge bei meinen ersten Gehversuchen nicht funktioniert hatte.

Weil setGlobalAttrBeforeFork erst nach diese Aenderung GlobalAttr aufruft, der wiederum @INC setzt.


Zitatdarf der Aufruf von RTypes_ShowTypeLibrary() gerne raus.

Ok, entfernt.

rudolfkoenig

#14
Ich habs nicht mit configDB getestet. Habe es jetzt also nach cfgDB_AttrRead geaendert, und beim Versuch mit configDB kam dann
ZitatDBD::SQLite::db prepare failed: no such column: VERSIONUUID at configDB.pm line 199.

Daraufhin habe ich configDB.db mit sqlite3 neu angelegt, und erneut gestartet. Nach etwas Pause kommt:
ZitatDBD::SQLite::db selectrow_array failed: database is locked at configDB.pm line 526.
Hat 'ne Weile gedauert, bis ich kapiert habe, dass es irgendwie ein Programmierfehler im Fall von frischen sqlite3 installationen sein muss, und es mit einem
        $fhem_dbh->commit();
in der Zeile 161 von configDB.pm beheben laesst. Ob das so richtig ist, weiss ich nicht.

Wenn ich schon dabei war: cfgDB_Read99 kann auch nichts zurueckliefern, was zu Fehlermeldung in fhem.pl fuehrt, das habe ich inn fhem.pl abgefangen.

Edit: Oops: die Diskussion wurde unter meinem "Hintern" geteilt. Sorry.