FHEM update mit Fehler am Ende

Begonnen von HCS, 20 Mai 2017, 13:06:44

Vorheriges Thema - Nächstes Thema

HCS

Habe bei einem FHEM Update gerade das hier am Ende bekommen:

2017.05.20 12:43:36 1 : update finished, "shutdown restart" is needed to activate the changes.
2017.05.20 12:43:36 1 :
2017.05.20 12:43:38 1 : fheminfo server response: <h1>Software error:</h1> <pre>DBD::SQLite::db prepare failed: too many columns on sqlite_altertab_models [for Statement &quot;ALTER TABLE models ADD COLUMN '[LaCrosseITPlusReader.Gateway.1.30 (1=RFM69 f:868300 r:20000) (2=RFM69 f:868300 r:8842) SC16IS750 (0x90) {IP=192.168.31.209}]' INTEGER DEFAULT 0&quot;] at /var/www/html/fhem.de/stats/statistics.cgi line 750. </pre> <p> For help, please send mail to the webmaster (<a href="mailto:webmaster@fhem.de">webmaster@fhem.de</a>), giving this error message and the time and date of the error. </p> <!-- warning: DBD::SQLite::db prepare failed: too many columns on sqlite_altertab_models [for Statement "ALTER TABLE models ADD COLUMN '[LaCrosseITPlusReader.Gateway.1.30 (1=RFM69 f:868300 r:20000) (2=RFM69 f:868300 r:8842) SC16IS750 (0x90) {IP=192.168.31.209}]' INTEGER DEFAULT 0"] at /var/www/html/fhem.de/stats/statistics.cgi line 750. -->
2017-05-20 12:43:38 Global global UPDATE


"[LaCrosseITPlusReader.Gateway.1.30 (1=RFM69 f:868300 r:20000) usw. usw." steht im internal "model" von meinen LaCrosseGateway devices.

Das ist bisher wohl nicht aufgetreten, wäre mir sonst bestimmt schon aufgefallen.
Konnte es auf einer zweiten FHEM-Installation auch gerade nachvollziehen.

betateilchen

*lach*

ok, wir sind an der natürlichen Grenze dessen angelangt, was sqlite als Tabellenstruktur zulässt.

@HCS: Du kannst den Fehler mit "attr global sendStatistics never" vorläufig vermeiden.

@Rudi: kannst Du bitte in 98_update.pm die Ausführung von "fheminfo send" (ab Zeile 427) bis auf weiteres auskommentieren?

@Markus Bloch: lass uns mal einen Workshop planen, um das lange vor uns hergeschobene Thema endlich anzugehen.

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

HCS

Zitat von: betateilchen am 20 Mai 2017, 13:26:24
@HCS: Du kannst den Fehler mit "attr global sendStatistics never" vorläufig vermeiden.
Ja klar, ist jetzt auch nicht so dramatisch, könnte nur zu Verwirrung führen, wenn das sonstigen Anwendern passiert

rudolfkoenig

Zitat@Rudi: kannst Du bitte in 98_update.pm die Ausführung von "fheminfo send" (ab Zeile 427) bis auf weiteres auskommentieren?
Habs ueberlegt, aber dann mich dazu entschlossen lieber in statistics.cgi insertDb() auszukommentieren, und statt "==> OK" die Meldung:
ZitatNOTE: statistics collecting currently disabled, see https://forum.fhem.de/index.php?topic=72168.0 for details
zurueckzuliefern. Das hat mAn weniger Nebeneffekte, und wirkt schneller.

betateilchen

Ok, das ist auch eine gute Variante :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Derzeit arbeite ich daran, die Zähl-Logik in fheminfo umzubauen, dabei ergibt sich folgende Frage:

@Rudi: kennst Du derzeit noch Module, die das "model" als Internal liefern und nicht als Attribut?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HCS

Zitat von: betateilchen am 20 Mai 2017, 17:37:54
... die das "model" als Internal liefern und nicht als Attribut?
36_JeeLink, 36_KeyValueProtocol und 36_LaCrosseGateway sicher

Falls meine Suche passt, dann weitere mögliche Kandidaten siehe Anhang.

betateilchen

Danke, ich habs befürchtet. Und dann auch noch unterschiedlich in Groß-/Kleinschreibung... *grummel*
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Kann mir mal bitte jemand kurz beschreiben,
wie ich das am einfachsten auf nonblocking mit HttpUtils.pm umstricken kann?


sub _fi2_Send() {
   my $json = encode_json \%fhemInfo;
   Log3("fheminfo",4,"fheminfo: $json");

   my $uri = $cmds{fheminfo2}{uri};
   my $req = HTTP::Request->new("POST",$uri);
   $req->content_type("application/x-www-form-urlencoded");
   $req->content("uniqueID=".$fhemInfo{'system'}{'uniqueID'}."&json=$json");

   my $ua  = LWP::UserAgent->new(
       agent => "FHEM/".$fhemInfo{'system'}{'release'},
       timeout => 60);
   my $res = $ua->request($req);

   my $response = "server response: ";
      $response .= $res->is_success ? $res->content : $res->status_line;
   return $response;
}

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

rudolfkoenig

#9
Da ich deine Version nicht testen kann, habe ich die aktuelle 98_fheminfo.pm auf HttpUtils_NonblockingGet umgebaut, kurz getestet (d.h. auf dem Server die gelieferten Daten mit der alten Version verglichen), und diese umgebaute Version angehaengt. Hier ist der Diff:

165,166c165,166
<     my $req = HTTP::Request->new("POST",$uri);
<     $req->content_type("application/x-www-form-urlencoded");
---
>     my %hash;
>     $hash{url} = $uri;
175c175
<       $req->content("uniqueID=$uniqueID&system=$contInfo&modules=$contModules");
---
>       $hash{data} = "uniqueID=$uniqueID&system=$contInfo&modules=$contModules";
178c178
<       $req->content("uniqueID=$uniqueID&system=$contInfo&modules=$contModules&models=$contModels");
---
>       $hash{data} = "uniqueID=$uniqueID&system=$contInfo&modules=$contModules&models=$contModels";
181,191c181,190
<     my $ua  = LWP::UserAgent->new(
<         agent => "Fhem/$release",
<         timeout => 60);
<     my $res = $ua->request($req);
<
<     $str .= "\nserver response: ";
<     if($res->is_success) {
<       $str .= $res->content."\n";
<     } else {
<       $str .= $res->status_line."\n";
<     }
---
>     $hash{header} = "User-Agent: Fhem/$release";
>     $hash{callback} = sub($$$) {
>       my ($hash, $err, $data) = @_;
>       if($err) {
>         Log 1, "fheminfo: Server ERROR: $err";
>       } else {
>         Log 1, "fheminfo: Server RESPONSE: $data";
>       }
>     };
>     HttpUtils_NonblockingGet(\%hash);


Kurz:
- es muss ein %hash mit url, data und callback(!) angelegt werden, Syntax von data ist identisch.
- HttpUtils_NonblockingGet kommt sofort zurueck (ist ja nonblocking :) ), Fehler oder Rueckgabewert bekommt man erst im callback.

Nachtrag: falls man asynchron (wg. callback) Daten via telnet/FHEMWEB ausgeben will, dann kann man asyncOutput verwenden. Das dafuer notwendige $cl wird jedem Befehl (wie fheminfo) direkt,  SetFn/GetFn/DefineFn indirekt ueber $hash->{CL} mitgeteilt.

rudolfkoenig

#10
Zitat@Rudi: kennst Du derzeit noch Module, die das "model" als Internal liefern und nicht als Attribut?

ZWave: Da diese Daten das Geraet bei der Inklusion liefert, und der Benutzer sie nicht aendern soll, werden sie als Reading gespeichert. Dabei gibt es model als Klartext und modelId als Nummer.  Beispiel: "Everspring AN158 Plug-in Meter Appliance Module" und 0060-0004-0002.

Nachtrag: in der mit FHEM ausgelieferten Liste (FHEM/lib/openzwave_manufacturer_specific.xml) sind 760 ZWave-Geraete aufgefuehrt.

betateilchen

#11
Das Problem mit den "models" an verschiedenen Stellen (Internal und Attribut) habe ich schon abgefangen.
Wenn ich Dich richtig verstehe, sollte auch ein reading namens "model" entsprechend in die Statistik einfließen?

Es gibt auch Module, die schreiben eine Modellbezeichnung als "type" in die Readings. Das wird ein Faß ohne Boden.

Bezüglich HttpUtils_NonblockingGet() bin ich schon ganz schön weit, aber ich kriege die Daten einfach nicht vernünftig an (mein) statistics.cgi geliefert, damit statistics damit was anfangen kann. Mit LWP::Ua funktioniert es einwandfrei.

Naja, ich bastle mal weiter, ist ja schönes Wetter zum "im Cafe sitzen und programmieren" 8)

Erstmal Danke für die Unterstützung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

ZitatWenn ich Dich richtig verstehe, sollte auch ein reading namens "model" entsprechend in die Statistik einfließen?
Wenn wir Modelle sammeln wollen, dann ja.

betateilchen

Kaum macht man es richtig, schon funktioniert es auch nonblocking :)

Danke für Deinen obigen Codeschnipsel.
-----------------------
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 21 Mai 2017, 12:43:15
Wenn wir Modelle sammeln wollen, dann ja.

Dann sollten wir uns auf Prioritäten festlegen, falls eine Modellbezeichnung in einem device - warum auch immer - an mehreren Stellen vorkommt.

Aktuell sieht die Reihenfolge so aus:



      my $model = 'noModel';
         $model = defined($defs{$key}{model}) ? $defs{$key}{model} : $model;
         $model = defined($defs{$key}{MODEL}) ? $defs{$key}{MODEL} : $model;
         $model = AttrVal($name,'model',$model);
         $model = ReadingsVal($name,'model',$model);


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