59_Weather, DarkSky und OpenWeatherMap API Bugfixes

Begonnen von CoolTux, 13 Januar 2019, 21:22:31

Vorheriges Thema - Nächstes Thema

CoolTux

Es wird morgen noch einmal ein Update aller Module geben.
Es wurden weitestgehend alle gemeldeten Bugs und Auffälligkeiten gefixt. Als kleine Erweiterung gibt die DarkSkyAPI nun noch Stunden Forecast mit an. Mein Dank für die Zuarbeit geht an Lippie

Wer morgen nach einem Update noch was findet meldet sich bitte hier in diesem Thread.

Vielen Dank an Alle

Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SouzA

Hi, danke, dass ihr das Modul überarbeitet habt.

Allerdings bekomme ich folgenden Fehler:
Wetter_Yahoo status => DarkSky Weather decode JSON err malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "permission denied\n") at FHEM/DarkSkyAPI.pm line 192.

Ich habe es einfach erstmal bei dem Namen Wetter_Yahoo belassen... Das alte Device gelöscht. Neues drüber gebügelt.
Folgende def:
define Wetter_Yahoo Weather api=OpenWeatherMapAPI,cachemaxage:600 apikey=xxxxxxx location=52.xxxx,9.xxxx interval=3600 language=de
ApiKey ist heute morgen bei OpenWeather erstellt worden.

Was kann das sein?

Thx & bis denn
SouzA
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

CoolTux

api=OpenWeatherMapAPI

API=OpenWeatherMapAPI

API muss groß geschrieben werden.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SouzA

Zitat von: CoolTux am 13 Januar 2019, 22:20:51
api=OpenWeatherMapAPI

API=OpenWeatherMapAPI

API muss groß geschrieben werden.

Dann is die Commandref falsch. (zumindest das Beispiel.)

Edit:
Und funzt. Danke!
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

CoolTux

Jepp ist bekannt und gefixt. Gibt hier da so 3-4 Posts zu  ;D
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Sprocki62

Hi Leon,

meine Idee hat mich nicht losgelassen, also hab ich selbst mal was versucht.. 
Zusammen mit den Anregungen von Lippie ist folgendes dabei rausgekommen ("alte" Zeilen im Code auskommentiert mit # )

sub WeatherAsHtmlV($;$)
{

  my ($d,$items) = @_;
  $d = "<none>" if(!$d);
  $items = 9 if( !$items );
  return "$d is not a Weather instance<br>"
        if(!$defs{$d} || $defs{$d}->{TYPE} ne "Weather");

  my $h = $defs{$d};
  my $width= int(ICONSCALE*ICONWIDTH);

  my $ret = '<table class="weather">';
#$ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue">%s<br>%s°C  %s%%<br>%s</td></tr>',
  $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue">Aktuell:<br>%s<br>%s°C&nbsp;&nbsp;  %s% relH<br>%s</td></tr>',
        $width,
        WeatherIconIMGTag(ReadingsVal($d, "icon", "")),
        ReadingsVal($d, "condition", ""),
        ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""),
        ReadingsVal($d, "wind_condition", ""));

#---
my $fc = ( (defined($h->{READINGS}->{fc1_day_of_week}) and $h->{READINGS}->{fc1_day_of_week}) ? 'fc' : 'hfc' );
  my $DayHour = ($fc eq 'fc' ? '_day_of_week' : '_pubDate' );

  for(my $i=1; $i<$items; $i++) {
#    $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue"><span class="weatherDay">%s: %s</span><br><span class="weatherMin">min %s°C</span> <span class="weatherMax">max %s°C</span></td></tr>',
    $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue"><span class="weatherDay">%s: <br> %s</span><br><span class="weatherMin">min %s°C</span> <span class="weatherMax">max %s°C</span></td></tr>',
        $width,
        WeatherIconIMGTag(ReadingsVal($d, "${fc}${i}_icon", "")),
        ReadingsVal($d, "${fc}${i}$DayHour", ""),
        ReadingsVal($d, "${fc}${i}_condition", ""),
        ReadingsVal($d, "${fc}${i}_low_c", ""), ReadingsVal($d, "${fc}${i}_high_c", ""));
  }
#---
  $ret .= "</table>";
  return $ret;
}

sub WeatherAsHtml($;$)
{
  my ($d,$i) = @_;
  WeatherAsHtmlV($d,$i);
}

sub WeatherAsHtmlH($;$)
{

  my ($d,$items) = @_;
  $d = "<none>" if(!$d);
  $items = 9 if( !$items );
  return "$d is not a Weather instance<br>"
        if(!$defs{$d} || $defs{$d}->{TYPE} ne "Weather");

  my $h = $defs{$d};
  my $width= int(ICONSCALE*ICONWIDTH);



  my $format= '<td><table border=1><tr><td class="weatherIcon" width=%d>%s</td></tr><tr><td class="weatherValue">%s</td></tr><tr><td class="weatherValue">%s°C %s%%</td></tr><tr><td class="weatherValue">%s</td></tr></table></td>';
#---
  my $ret = '<table class="weather">';
  my $fc = ( (defined($h->{READINGS}->{fc1_day_of_week}) and $h->{READINGS}->{fc1_day_of_week}) ? 'fc' : 'hfc' );
  my $DayHour = ($fc eq 'fc' ? '_day_of_week' : '_pubDate' );

  # icons
  $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td>', $width, WeatherIconIMGTag(ReadingsVal($d, "icon", "")));
  for(my $i=1; $i<$items; $i++) {
    $ret .= sprintf('<td class="weatherIcon" width=%d>%s</td>', $width, WeatherIconIMGTag(ReadingsVal($d, "${fc}${i}_icon", "")));
  }
  $ret .= '</tr>';

  # condition
#  $ret .= sprintf('<tr><td class="weatherDay">%s</td>', ReadingsVal($d, "condition", ""));
  $ret .= sprintf('<tr><td class="weatherDay">Aktuell:<br>%s</td>', ReadingsVal($d, "condition", ""));
  for(my $i=1; $i<$items; $i++) {
#    $ret .= sprintf('<td class="weatherDay">%s: %s</td>', ReadingsVal($d, "${fc}${i}$DayHour", ""),
    $ret .= sprintf('<td class="weatherDay">%s: <br>%s</td>', ReadingsVal($d, "${fc}${i}$DayHour", ""),
        ReadingsVal($d, "${fc}${i}_condition", ""));
  }
  $ret .= '</tr>';
#---
  # temp/hum | min
#  $ret .= sprintf('<tr><td class="weatherMin">%s°C %s%%</td>', ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""));
  $ret .= sprintf('<tr><td class="weatherMin">%s°C&nbsp;&nbsp; %s%</td>', ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""));
  for(my $i=1; $i<$items; $i++) {
    $ret .= sprintf('<td class="weatherMin">min %s°C</td>', ReadingsVal($d, "${fc}${i}_low_c", ""));
  }
  $ret .= '</tr>';
                                           


siehe Screenshot..

Das Datum von Lippie könnte man noch kürzen auf
Mo, 14.01.19
06:00 Uhr


Hoffe, das ist für Dich ok so? 

Gruß
Jonas

CoolTux

Zitat von: Sprocki62 am 13 Januar 2019, 22:26:53
Hi Leon,

meine Idee hat mich nicht losgelassen, also hab ich selbst mal was versucht.. 
Zusammen mit den Anregungen von Lippie ist folgendes dabei rausgekommen ("alte" Zeilen im Code auskommentiert mit # )

sub WeatherAsHtmlV($;$)
{

  my ($d,$items) = @_;
  $d = "<none>" if(!$d);
  $items = 9 if( !$items );
  return "$d is not a Weather instance<br>"
        if(!$defs{$d} || $defs{$d}->{TYPE} ne "Weather");

  my $h = $defs{$d};
  my $width= int(ICONSCALE*ICONWIDTH);

  my $ret = '<table class="weather">';
#$ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue">%s<br>%s°C  %s%%<br>%s</td></tr>',
  $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue">Aktuell:<br>%s<br>%s°C&nbsp;&nbsp;  %s% relH<br>%s</td></tr>',
        $width,
        WeatherIconIMGTag(ReadingsVal($d, "icon", "")),
        ReadingsVal($d, "condition", ""),
        ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""),
        ReadingsVal($d, "wind_condition", ""));

#---
my $fc = ( (defined($h->{READINGS}->{fc1_day_of_week}) and $h->{READINGS}->{fc1_day_of_week}) ? 'fc' : 'hfc' );
  my $DayHour = ($fc eq 'fc' ? '_day_of_week' : '_pubDate' );

  for(my $i=1; $i<$items; $i++) {
#    $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue"><span class="weatherDay">%s: %s</span><br><span class="weatherMin">min %s°C</span> <span class="weatherMax">max %s°C</span></td></tr>',
    $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td><td class="weatherValue"><span class="weatherDay">%s: <br> %s</span><br><span class="weatherMin">min %s°C</span> <span class="weatherMax">max %s°C</span></td></tr>',
        $width,
        WeatherIconIMGTag(ReadingsVal($d, "${fc}${i}_icon", "")),
        ReadingsVal($d, "${fc}${i}$DayHour", ""),
        ReadingsVal($d, "${fc}${i}_condition", ""),
        ReadingsVal($d, "${fc}${i}_low_c", ""), ReadingsVal($d, "${fc}${i}_high_c", ""));
  }
#---
  $ret .= "</table>";
  return $ret;
}

sub WeatherAsHtml($;$)
{
  my ($d,$i) = @_;
  WeatherAsHtmlV($d,$i);
}

sub WeatherAsHtmlH($;$)
{

  my ($d,$items) = @_;
  $d = "<none>" if(!$d);
  $items = 9 if( !$items );
  return "$d is not a Weather instance<br>"
        if(!$defs{$d} || $defs{$d}->{TYPE} ne "Weather");

  my $h = $defs{$d};
  my $width= int(ICONSCALE*ICONWIDTH);



  my $format= '<td><table border=1><tr><td class="weatherIcon" width=%d>%s</td></tr><tr><td class="weatherValue">%s</td></tr><tr><td class="weatherValue">%s°C %s%%</td></tr><tr><td class="weatherValue">%s</td></tr></table></td>';
#---
  my $ret = '<table class="weather">';
  my $fc = ( (defined($h->{READINGS}->{fc1_day_of_week}) and $h->{READINGS}->{fc1_day_of_week}) ? 'fc' : 'hfc' );
  my $DayHour = ($fc eq 'fc' ? '_day_of_week' : '_pubDate' );

  # icons
  $ret .= sprintf('<tr><td class="weatherIcon" width=%d>%s</td>', $width, WeatherIconIMGTag(ReadingsVal($d, "icon", "")));
  for(my $i=1; $i<$items; $i++) {
    $ret .= sprintf('<td class="weatherIcon" width=%d>%s</td>', $width, WeatherIconIMGTag(ReadingsVal($d, "${fc}${i}_icon", "")));
  }
  $ret .= '</tr>';

  # condition
#  $ret .= sprintf('<tr><td class="weatherDay">%s</td>', ReadingsVal($d, "condition", ""));
  $ret .= sprintf('<tr><td class="weatherDay">Aktuell:<br>%s</td>', ReadingsVal($d, "condition", ""));
  for(my $i=1; $i<$items; $i++) {
#    $ret .= sprintf('<td class="weatherDay">%s: %s</td>', ReadingsVal($d, "${fc}${i}$DayHour", ""),
    $ret .= sprintf('<td class="weatherDay">%s: <br>%s</td>', ReadingsVal($d, "${fc}${i}$DayHour", ""),
        ReadingsVal($d, "${fc}${i}_condition", ""));
  }
  $ret .= '</tr>';
#---
  # temp/hum | min
#  $ret .= sprintf('<tr><td class="weatherMin">%s°C %s%%</td>', ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""));
  $ret .= sprintf('<tr><td class="weatherMin">%s°C&nbsp;&nbsp; %s%</td>', ReadingsVal($d, "temp_c", ""), ReadingsVal($d, "humidity", ""));
  for(my $i=1; $i<$items; $i++) {
    $ret .= sprintf('<td class="weatherMin">min %s°C</td>', ReadingsVal($d, "${fc}${i}_low_c", ""));
  }
  $ret .= '</tr>';
                                           


siehe Screenshot..

Das Datum von Lippie könnte man noch kürzen auf
Mo, 14.01.19
06:00 Uhr


Hoffe, das ist für Dich ok so? 

Gruß
Jonas

Hallo Jonas,

Vielen Dank für Deine Arbeit. Allerdings mehr wie Boris Bescheid geben werde ich nicht machen. Weather ist nicht mein Modul. Ich habe nur nötige Anpassungen für die Nutzung einer API Schnittstelle gemacht. Form und Style muss wenn Boris machen. Es ging erstmal nur darum per default wieder den alten Zustand zu bekommen.

Heißt aber nicht das es um sonst war, Boris kann ich 4 Wochen sicherlich wieder etwas am Modul tun.
Gerne kannst Du auch hier versuchen ein Pull Request zu machen.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

SouzA

#7
Zitat von: CoolTux am 13 Januar 2019, 22:23:28
Jepp ist bekannt und gefixt. Gibt hier da so 3-4 Posts zu  ;D

Ok, dann is ja gut.

Seit dem das mit dem Wetter war hab ich auch folgende Meldung, die auch nachdem das Modul jetzt wieder funktioniert nicht verschwindet:
2019.01.13 22:04:13 1: PERL WARNING: Redundant argument in sprintf at (eval 128943) line 1.
2019.01.13 22:04:13 1: PERL WARNING: Redundant argument in sprintf at (eval 128954) line 1.
2019.01.13 22:09:12 1: PERL WARNING: Redundant argument in sprintf at (eval 130025) line 1.
2019.01.13 22:09:12 1: PERL WARNING: Redundant argument in sprintf at (eval 130036) line 1.
2019.01.13 22:14:12 1: PERL WARNING: Redundant argument in sprintf at (eval 131037) line 1.
2019.01.13 22:14:13 1: PERL WARNING: Redundant argument in sprintf at (eval 131048) line 1.
2019.01.13 22:19:13 1: PERL WARNING: Redundant argument in sprintf at (eval 132067) line 1.
2019.01.13 22:19:13 1: PERL WARNING: Redundant argument in sprintf at (eval 132078) line 1.
2019.01.13 22:24:13 1: PERL WARNING: Redundant argument in sprintf at (eval 133155) line 1.
2019.01.13 22:24:13 1: PERL WARNING: Redundant argument in sprintf at (eval 133166) line 1.
2019.01.13 22:29:13 1: PERL WARNING: Redundant argument in sprintf at (eval 134226) line 1.
2019.01.13 22:29:13 1: PERL WARNING: Redundant argument in sprintf at (eval 134237) line 1.
2019.01.13 22:34:13 1: PERL WARNING: Redundant argument in sprintf at (eval 135335) line 1.
2019.01.13 22:34:14 1: PERL WARNING: Redundant argument in sprintf at (eval 135346) line 1.
2019.01.13 22:39:13 1: PERL WARNING: Redundant argument in sprintf at (eval 136377) line 1.
2019.01.13 22:39:13 1: PERL WARNING: Redundant argument in sprintf at (eval 136388) line 1.


Wie komme ich dahinter, was das für eine Fehlermeldung ist?
Vielen Dank für Hilfe.

Bis denn
SouzA

EDIT: über Stacktrace herausgefunden, dass es etwas mit Readingsgroup und JeeLink zu tun haben muss.
Raspi 4, EnOcean TCM310 USB, HM-MOD-UART-USB, Jeelink, hue, AMAD, fully, FRITZBOX, Signalbot, VIERA, Presence BT/Mac, TPLink, Gassistant, Shelly, fhempy, ZigBee

mi.ke

Hi Leon,

die Windboen (.*windGust) scheinen noch ohne den Faktor *3.6 zu sein.
Sind auch in der commandRef nicht erwähnt.

..und noch ne doofe Frage:
Wäre nicht das apiMaintainer-Reading besser in den Internals aufgehoben?

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

mi.ke

Hi Leon,

das "alte" Reading pubDateTs vermiss ich persönlich, weil ich anhand des Alters der Daten, die Readings in Berechnungen mit einfließen lasse oder eben nicht.

Wäre schön wenn, ist jetzt aber nicht soo wichtig.

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

CoolTux

Zitat von: mi.ke am 14 Januar 2019, 09:14:46
Hi Leon,

das "alte" Reading pubDateTs vermiss ich persönlich, weil ich anhand des Alters der Daten, die Readings in Berechnungen mit einfließen lasse oder eben nicht.

Wäre schön wenn, ist jetzt aber nicht soo wichtig.

Cheers
mi.ke
Da kannst Du Dich jetzt an pubDate halten. Das sind die Daten vom Anbieter, oder Du nimmst current_date_time das ist die Zeit an dem die Daten gezogen wurden. Also aus FHEM Sicht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

mi.ke

Zitat von: CoolTux am 14 Januar 2019, 09:39:31
Da kannst Du Dich jetzt an pubDate halten. Das sind die Daten vom Anbieter, ...

Ja, müssen ja die Daten vom Anbieter sein!!

In der alten Version (yahoo) war zusätzlich zum pubDate ein pubDateTs Reading.

Andersrum gefragt, wie bekomm ich auf die Schnelle das pubDate in Sekunden angezeigt, damit ich es von time() abziehen kann, um das Delta zu haben?
z.B.
pubDate = Mon, 14 Jan 2019 09:33 AM

Danke und cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

Helmi55

Servus Leon,
aus mir unerklärlichen Gründen konnte ich heute kein update durchführen
Es hieß ich habe keine Berechtigung auf 59_weather - habe aber seit gestern nichts am System verändert.
2019.01.14 09:12:46 1 : open ./FHEM/59_Weather.pm failed: Keine Berechtigung, trying to restore the previous version and aborting the update



Habe nun von deinem git die aktuellste Version heruntergeladen und einfach drüberkopiert.
Neustart und danach wieder die gewohnte Fehlermeldung

2019.01.14 11:01:40 1: PERL WARNING: Use of uninitialized value in sprintf at FHEM/OpenWeatherMapAPI.pm line 272.
Gruß
Helmut
System1 fhem 6.1 auf RPi 4B mit 4GB, HMUSBConfig, DS9490R-1Wire, Busware USB 868, Pool-Solarsteuerung mit FHEM. System2 fhem 6.1 auf RPi 4B mit 4GB (Bullseye) mit Busware USB 868 und 433 und HMUARTLGW für Haussteuerung

https://www.flickr.com/photos/canonhelmi/

errazzor

Hallo,

bei mir ist die Ansicht etwas komisch. Ich sehe nur zwei Tage und das auch ständig wiederholt mit unterschiedlichen Prognosen, siehe Bild.

Ich nutze die Openweather API.


CoolTux

Zitat von: Helmi55 am 14 Januar 2019, 11:08:33
Servus Leon,
aus mir unerklärlichen Gründen konnte ich heute kein update durchführen
Es hieß ich habe keine Berechtigung auf 59_weather - habe aber seit gestern nichts am System verändert.
2019.01.14 09:12:46 1 : open ./FHEM/59_Weather.pm failed: Keine Berechtigung, trying to restore the previous version and aborting the update



Habe nun von deinem git die aktuellste Version heruntergeladen und einfach drüberkopiert.
Neustart und danach wieder die gewohnte Fehlermeldung

2019.01.14 11:01:40 1: PERL WARNING: Use of uninitialized value in sprintf at FHEM/OpenWeatherMapAPI.pm line 272.
Gruß
Helmut

Ich muss davon ausgehen das Deine Rechte nicht stimmen. Du hast bestimmt da nie was angepasst. Deswegen klappt das Update nicht.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net