59_Weather: Non-Blocking

Begonnen von vbs, 06 Juni 2014, 22:41:26

Vorheriges Thema - Nächstes Thema

vbs

Ich hab mal etwas an 59_Weather rumgespielt, und das Abfragen der WWW-Daten auf einen BlockingCall umgebaut. Mag das mal jemand reviewen?

justme1968

eine andere möglichkeit wäre HttpUtils_NonblockingGet zu verwenden und auf das forken ganz zu verzichten.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

vbs

Ja mei, was es nicht alles gibt. Also hier dann der nächste Versuch, diesmal mit HttpUtils_NonblockingGet.

P.A.Trick

Bei mir klappt das Modul nicht!

Error messages while initializing FHEM:
configfile: Cannot load module Weather


Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

vbs

Hm, gibts da evtl. auf der Kommandozeile oder so noch weitere Informationen zu?

P.A.Trick

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

vbs

Hm, also ich hab leider absolut keine Idee. Bei mir läufts halt (hilft dir auch nicht, ich weiß). Einfach gar nicht starten ohne Meldung, kenn ich so nicht  :-\
Kann das vielleicht nochmal jemand anders testen, ob das bei ihm auch passiert?

marvin78

Getestet: läuft einwandfrei und ohne Fehler. Ich weiß, das ist nur bedingt hilfreich.

herrmannj

Hi vbs,

auch von mir: erster Test: perfekt.

Im übrigen: vielen Dank !!!

Ich hatte weather wegen blocking schon rausgeschmissen - jetzt ist es Dank Dir wieder drin  :D

Magst Du es einchecken (lassen) ?

@p.a.trick: rechte ?

Danke und Grüße
Jörg

marvin78

Ich tippe auch auf Dateirechte.

Im Übrigen läuft das Modul tatsächlich besser als die alte Version. Ich hatte selbst auf meinem recht performanten Cubietruck hin und wieder Auszeiten wegen Weather. Die sind vollständig weg.

P.A.Trick

Zitat von: vbs am 09 Juni 2014, 18:44:08
Hm, gibts da evtl. auf der Kommandozeile oder so noch weitere Informationen zu?

Ich habe noch einmal versucht und direkt neu gestartet!

2014.06.10 22:11:09 1: reload: Error:Modul 59_Weather deactivated:
Type of arg 1 to each must be hash (not hash element) at ./FHEM/59_Weather.pm line 374, near "} )
      "
BEGIN not safe after errors--compilation aborted at ./FHEM/59_Weather.pm line 503, <$fh> line 516.

2014.06.10 22:11:09 0: Type of arg 1 to each must be hash (not hash element) at ./FHEM/59_Weather.pm line 374, near "} )
      "
BEGIN not safe after errors--compilation aborted at ./FHEM/59_Weather.pm line 503, <$fh> line 516.

2014.06.10 22:11:09 3: Please define Forecast first

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

P.A.Trick

#11
Zitat von: herrmannj am 10 Juni 2014, 20:57:23
Hi vbs,

auch von mir: erster Test: perfekt.

Im übrigen: vielen Dank !!!

Ich hatte weather wegen blocking schon rausgeschmissen - jetzt ist es Dank Dir wieder drin  :D

Magst Du es einchecken (lassen) ?

@p.a.trick: rechte ?

Danke und Grüße
Jörg

Hm nein die Dateirechte stehen richtig!

-rwxr-xr-x  1 fhem fhem  30719 10. Jun 22:10 59_Weather.pm

Arggh wieso läuft das nur bei mir nicht!? *grübel*

Er spuckt den Fehler beim folgenden Aufruf raus!

use constant ICONHIGHT => 120;

Any idea?
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

herrmannj

das:
while ( (my $key, my $value) = each $urlResult{readings} )

ist bei mir line 373 (nicht 374) und das muss in der Tat ein hash sein. Sollte er auch. Check mal bitte ob Deine yahoo weater location (also die nummer) richtig ist. Oder nimm 656958, die geht. Vielleicht wird eine falsche # nicht abgefangen.

Sonst musst Du mal einen dump direkt davor einbauen. Soweit ich das sehe wird der hash in den lines darüber mit den yahoo Werten gefüllt, ein dump muss was ausspucken.

vg
jörg

vbs

Danke für die Rückmeldungen! Schön zu hören, dass es bei den meisten läuft.  :) Würde trotzdem noch gerne wissen, was da bei PA.Trick passiert, bevor ich guten Gewissens jemanden bitten kann, das einzuchecken.

Also einen Verdacht hab ich zumindest. So wurde der Hash bisher angelegt:
    $urlResult{"readings"} = {};

Meinem bescheidenen Perl-Verständnis nach, ist das kein Hash sondern eine Hash-Referenz. War eigentlich keine Absicht. Vielleicht ist das aber das Problem. Ich hab das jetzt mal geändert auf:
    $urlResult{"readings"} = ();
(man beachte die runden Klammern)

Magst du das mal ausprobieren P.A.Trick? Welche Perl-Version benutzt du? Vielleicht ist das der Grund, warum es sich bei dir anders verhält...

Ansonsten würde ich gerne herrmannj's Vorschlag nachkommen und da Log-Ausgaben reinpflastern.

P.A.Trick

Zitat von: herrmannj am 10 Juni 2014, 22:33:46
das:
while ( (my $key, my $value) = each $urlResult{readings} )

ist bei mir line 373 (nicht 374) und das muss in der Tat ein hash sein. Sollte er auch. Check mal bitte ob Deine yahoo weater location (also die nummer) richtig ist. Oder nimm 656958, die geht. Vielleicht wird eine falsche # nicht abgefangen.

Sonst musst Du mal einen dump direkt davor einbauen. Soweit ich das sehe wird der hash in den lines darüber mit den yahoo Werten gefüllt, ein dump muss was ausspucken.

vg
jörg

Also die Nummer 656958 bringt bei mir den gleichen Fehler. Habe das Device gelöscht und neu definiert.
Das mit dem Dump musst du mir noch mal erklären Jörg...ich Perl noob ;-)
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

P.A.Trick

Zitat von: vbs am 10 Juni 2014, 22:48:17
Danke für die Rückmeldungen! Schön zu hören, dass es bei den meisten läuft.  :) Würde trotzdem noch gerne wissen, was da bei PA.Trick passiert, bevor ich guten Gewissens jemanden bitten kann, das einzuchecken.

Also einen Verdacht hab ich zumindest. So wurde der Hash bisher angelegt:
    $urlResult{"readings"} = {};

Meinem bescheidenen Perl-Verständnis nach, ist das kein Hash sondern eine Hash-Referenz. War eigentlich keine Absicht. Vielleicht ist das aber das Problem. Ich hab das jetzt mal geändert auf:
    $urlResult{"readings"} = ();
(man beachte die runden Klammern)

Magst du das mal ausprobieren P.A.Trick? Welche Perl-Version benutzt du? Vielleicht ist das der Grund, warum es sich bei dir anders verhält...

Ansonsten würde ich gerne herrmannj's Vorschlag nachkommen und da Log-Ausgaben reinpflastern.


Wenn du mir sagst wie ich das mache mit den Log Ausgaben mache ich das gerne!
Perl Version: This is perl, v5.10.1 (*) built for arm-linux-gnueabi-thread-multi


Update: Klappt auch mit dieser version nicht :/
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

herrmannj

Zitat von: P.A.Trick am 10 Juni 2014, 22:54:41
Also die Nummer 656958 bringt bei mir den gleichen Fehler. Habe das Device gelöscht und neu definiert.
Das mit dem Dump musst du mir noch mal erklären Jörg...ich Perl noob ;-)

heul jetzt nicht rum, man wächst mit seinen Aufgaben  ;D

http://perldoc.perl.org/Data/Dumper.html


use Data::Dumper;
...
Log3 (undef, 1, "das war drin: " . Dumper($urlResult{"readings"}) );


Ich denke bei Dir ist $urlResult{"readings"}) empty (der Test mit exist ist nicht optimal, existieren bedeutet nicht das was drin ist ...)

Frage wäre (wenn) "warum ist nix drin" ??

Du bist doch auf ein NAS umgezogen. Wenn der dump das bestätigt, schau doch mal ob das original weather läuft oder den gleichen Fehler macht. Magste Dein def kurz posten ?

vg
Jörg

P.A.Trick

Zitat von: herrmannj am 10 Juni 2014, 23:15:07
heul jetzt nicht rum, man wächst mit seinen Aufgaben  ;D

http://perldoc.perl.org/Data/Dumper.html


use Data::Dumper;
...
Log3 (undef, 1, "das war drin: " . Dumper($urlResult{"readings"}) );



Ich denke bei Dir ist $urlResult{"readings"}) empty (der Test mit exist ist nicht optimal, existieren bedeutet nicht das was drin ist ...)

Frage wäre (wenn) "warum ist nix drin" ??

Du bist doch auf ein NAS umgezogen. Wenn der dump das bestätigt, schau doch mal ob das original weather läuft oder den gleichen Fehler macht. Magste Dein def kurz posten ?

vg
Jörg

Urgs....na gut ich werde es versuchen! :-)
Hier die Def:

define Forecast Weather 29349204 1800 de
attr Forecast room _Umwelt
define MyWeather Weather 29349204 1800 de
attr MyWeather alias Wetter
attr MyWeather group Umwelt
attr MyWeather room _Umwelt
define w_Wetter_Buer weblink htmlCode { WeatherAsHtml("MyWeather") }
attr w_Wetter_Buer group Wetter
attr w_Wetter_Buer room _Umwelt



Der Dumper hat leider nicht gebracht....Habe ihn vor der Zeile 373 eingebaut...keine Meldung im Log gefunden.


if (exists($urlResult{readings})) {
      readingsBeginUpdate($hash);
      Log3 (undef, 1, "das war drin: " . Dumper($urlResult{"readings"}) );
      while ( (my $key, my $value) = each $urlResult{readings} )
      {
        readingsBulkUpdate($hash, $key, $value);
      }

Mache ich etwas falsch?

Zufällig bin ich eben noch über das hier gestolpert (Ausgabe fhem.pl aus der Konsole)

Subroutine Weather_DebugCodes redefined at ./FHEM/59_Weather.pm line 125, <$fh> line 2381.
Subroutine Weather_Initialize redefined at ./FHEM/59_Weather.pm line 136, <$fh> line 2381.
Subroutine latin1_to_utf8 redefined at ./FHEM/59_Weather.pm line 151, <$fh> line 2381.
Subroutine temperature_in_c redefined at ./FHEM/59_Weather.pm line 161, <$fh> line 2381.
Subroutine wind_in_km_per_h redefined at ./FHEM/59_Weather.pm line 166, <$fh> line 2381.
Subroutine degrees_to_direction redefined at ./FHEM/59_Weather.pm line 171, <$fh> line 2381.
Subroutine Weather_UpdateReading redefined at ./FHEM/59_Weather.pm line 178, <$fh> line 2381.
Subroutine Weather_RetrieveData redefined at ./FHEM/59_Weather.pm line 213, <$fh> line 2381.
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

herrmannj

das re-define kommt vom reload, mach vielleicht shutdown restart, ist aber nix schlimmes.

die logausgabe setz mal vor das "if" und nimm mal nur  .. Dumper($urlResult) ..

im log müsste mindestens "das war drin" stehen

vg
jörg

P.A.Trick

Arggh Perl mag mich nicht!

2014.06.10 23:45:38 1: reload: Error:Modul 59_Weather deactivated:
Global symbol "$urlResult" requires explicit package name at ./FHEM/59_Weather.pm line 370.
Type of arg 1 to each must be hash (not hash element) at ./FHEM/59_Weather.pm line 375, near "} )
      "
BEGIN not safe after errors--compilation aborted at ./FHEM/59_Weather.pm line 504.


Mist hatte ich eben bei der Konsolen-Ausgabe vergessen!

Prototype mismatch: sub main::Weather_RetrieveData ($) vs ($$) at ./FHEM/59_Weather.pm line 239.
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

herrmannj

ah, I see

bin mir nicht sicher, probier mal den:

vg
jörg


P.A.Trick

Nein leider nicht!

2014.06.11 00:08:56 1: reload: Error:Modul 59_Weather deactivated:
Type of arg 1 to each must be hash (not hash element) at ./FHEM/59_Weather.pm line 373, near "} )
      "
BEGIN not safe after errors--compilation aborted at ./FHEM/59_Weather.pm line 502.

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

herrmannj

komisch das der hier läuft....

naja, eh noch zu warm um ins bett zu gehen. wart ma ich schau ma  8)

vg
jörg

herrmannj

ich hab den hash mal dereferenziert, was eigentlich auch richtig ist. komisch das mein perl nich meckert, hast Du "die perl" ?

bin mal gespannt

vg
jörg

P.A.Trick

Du bist GOTT! Prost und eine wunderschöne Nacht wünsche ich dir!

PS: Was meinst du mit die Perl? Ich habe einfach ein Debian mit Standard Perl Paket!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

stromer-12

Zitat von: herrmannj am 11 Juni 2014, 00:07:43
ah, I see

bin mir nicht sicher, probier mal den:

vg
jörg

Diese Version funktioniert bei mir.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

vbs

Super, dass du es lösen konntest Jörg! Könntest du kurz ein oder zwei Sätze dazu verlieren, warum das an der Stelle zwingend eine Hash-Referenz sein muss und kein normaler Hash sein darf? Würde das gerne verstehen, damit das nicht nochmal vorkommt... Danke!

herrmannj

Hi vbs,

ick sach ma so: "ick heb keene Ahnung"  ;D

Lief ja bei allen außer bei p.a.trick, jetzt läufts bei allen  8)

allerdings war die ref genau das Problem, ich musste die ref im "each" de-referenzieren, dann ging es. Vermutlich unterstützt sein perl kein "each" mit hashref.

vg
jörg

vbs

Ahh, lesen bildet, musste ich mal wieder festellen.  ;D Das sagt die Doku zu each und das ist genau unser Fall, oder?

ZitatStarting with Perl 5.14, each can take a scalar EXPR, which must hold reference to an unblessed hash or array. The argument will be dereferenced automatically. This aspect of each is considered highly experimental. The exact behaviour may change in a future version of Perl.

herrmannj

ach schau an. Dann ist das perl von p.a.trick nicht zickig sondern alt  :P So ergibt das einen Sinn.

Hast Du mal getestet was passiert wenn die xml von yahoo empty ist oder irgendwelche Fehlermeldungen zurückgeliefert werden  ? Sowas wie "Wartungsarbeiten" oder so ?

vg
jörg

vbs

Ja das Perl 5.10 ist von 2010/2011. Also nicht mehr ganz frisch.

Ich *meine*, dass ich es getestet hatte, indem ich per Fritzbox meiner fhem-Maschine den Internetzugang verboten hatte. in dem Fall war dann $xml undefined oder ein Leerstring.
Ich kann aber nicht sagen, wie es sich jetzt nach den Änderungen verhält. Vorher war ja urlResult als leerer Hash initialisiert. Im Moment ist es wohl undef. Ich bin nicht sicher, wie sich in dem Fall das "if (exists($urlResult->{readings})) {" verhält. Undef per "->" dereferenzieren geht in die Hose, oder?
Wenn ich quatsch rede, einfach Bescheid sagen. Perl und ich sind noch nicht so richtig warm geworden...  8)

vbs

Also bei mir läuft es auch fehlerfrei ohne Internet-Verbindung. Mag das jemand so einchecken?

Dr. Boris Neubert

Hallo,

ist die funktionierende Version im ersten Post?

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

vbs


Dr. Boris Neubert

Es ging damit auch bei mir.

Eingecheckt.

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

vbs