Erweitert: Wettervorhersage mit Snips und OpenWeatherMap

Begonnen von rischbiter123, 05 Februar 2019, 14:23:00

Vorheriges Thema - Nächstes Thema

rischbiter123

Moin,

funktioniert. Vielleicht habe ich aber auch einen Kopierfehler beim Kommentieren gemacht. Versuch mal bitte diese:

sub WetterMorgen($) {
my ($no) = @_;
my $wet = "OpenWetterWhv";
my $i = "";
my $no1 = "";
my $k = 1;
my $h = 6;
my $l = "";
my $l1 = 5;
my $u = "";
my $v = "";
my $w = "";
my $h1 = substr(ReadingsVal($wet,"hfc1_pubDate",0), -5, -3);
if ($h1 eq "06")
{$i = 0}
elsif ($h1 eq "09")
{$i = 1}
elsif ($h1 eq "12")
{$i = 2}
elsif ($h1 eq "15")
{$i = 3}
elsif ($h1 eq "18")
{$i = 4}
elsif ($h1 eq "21")
{$i = 5};
if ($no > 1)
{$no1 = $no-$i}
else {$no1 = $no;
$l1 = $l1 - $i;
$h = $h1};
my $da = "hfc".$no1."_pubDate";
my $da1 = substr((ReadingsVal($wet,$da,0)), 3, 3);
my $Mona1 = &Mona(substr((ReadingsVal($wet,$da,0)),-15,4));
my $da2 = &WoTa(substr((ReadingsVal($wet,$da,0)),0,2))." ".$da1.". ".$Mona1.". ";
while($l < $l1) {
$k = $no1+$l;
my $we = "hfc".$k."_condition";
my $te = "hfc".$k."_tempHigh";
my $wi = "hfc".$k."_wind";
  $u = "Um ".$h." Uhr ist es ".(ReadingsVal($wet,$we,0)).". Die Temperatur beträgt voraussichtlich ".(ReadingsVal($wet,$te,0))." Grad Celsius."." Die Windgeschwindigkeit beträgt ".(ReadingsVal($wet,$wi,0))." Kilometer pro Stunde. ";
  $v = $v.$u;
  $h += 3;
  $l += 1;
}
  $w = "Das Wetter vom ".$da2.". ".$v;
  return $w;
}


sub WoTa($) {
my ($da3) = @_;
my $da4 ="";
if ($da3 eq "Mo")
{ $da4 = "Montag"; }
elsif ($da3 eq "Di")
{ $da4 = "Dienstag"; }
elsif ($da3 eq "Mi")
{ $da4 = "Mittwoch"; }
elsif ($da3 eq "Do")
{ $da4 = "Donnerstag"; }
elsif ($da3 eq "Fr")
{ $da4 = "Freitag"; }
elsif ($da3 eq "Sa")
{ $da4 = "Samstag"; }
elsif ($da3 eq "So")
{ $da4 = "Sonntag"; };
return $da4;
}

sub Mona($) {
my ($Mon1) = @_;
my $Mon2 ="";
if ($Mon1 eq "Jan")
{ $Mon2 = "Januar"; }
elsif ($Mon1 eq "Feb")
{ $Mon2 = "Februar"; }
elsif ($Mon1 eq "Mär")
{ $Mon2 = "März"; }
elsif ($Mon1 eq "Apr")
{ $Mon2 = "April"; }
elsif ($Mon1 eq "Mai")
{ $Mon2 = "Mai"; }
elsif ($Mon1 eq "Jun")
{ $Mon2 = "Juni"; }
elsif ($Mon1 eq "Jul")
{ $Mon2 = "Juli"; }
elsif ($Mon1 eq "Aug")
{ $Mon2 = "August"; }
elsif ($Mon1 eq "Sep")
{ $Mon2 = "September"; }
elsif ($Mon1 eq "Okt")
{ $Mon2 = "Oktober"; }
elsif ($Mon1 eq "Nov")
{ $Mon2 = "November"; }
elsif ($Mon1 eq "Dez")
{ $Mon2 = "Dezember"; };
return $Mon2;
}
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

rih

Hallo,

geht leider auch nicht. Im Logfile bekomme ich folgende Warnmeldung:
PERL WARNING: Argument "" isn't numeric in numeric lt (<) at ./FHEM/99_myUtils.pm line 106.
Ob es damit zusammen hängt? Müsste diese Stelle sein:
my $da2 = &WoTa(substr((ReadingsVal($wet,$da,0)),0,2))." ".$da1.". ".$Mona1.". ";
while($l < $l1) {
$k = $no1+$l;

Die Warnmeldung kam auch schon mit der vorherigen neuen Version.

rischbiter123

Moin,

die Warnung habe ich auch. Muss wahrscheinlich in der Variablendeklarierung eine 0 oder 1 reingeschrieben werden. Da es aber trotzdem funktioniert, war und bin ich zu faul, es auszuprobieren.

Das einzige was mir jetzt noch einfällt: Hast Du bei Snips nach dem Ändern der Shortcuts ein 'set Snipsdevice updateModel' ausgeführt?

Ansonsten bin ich leider überfragt, da es bei mir funktioniert.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

rih

Hallo Andreas,

Snips updateModel habe ich mehrfach ausgeführt.
Könnte ich bei Openweather etwas falsch konfiguriert haben? Hat ja aber schon mal funktioniert, meine ich.

Was mir auffällt: im Wetterdevice sind die Wochentage und der Monat auf englisch. Ist das die Ursache des Problems?
... Muss eigentlich die Ursache sein. Ich mache den Versuch und schreibs auf englische Namen um.

rischbiter123

Moin,

dann ist bei Dir die Sprache vom Pi noch auf Englisch. Aber Du könntest Recht haben, da er ja die Namen nicht auflösen kann. Vielleicht hast Du es ja beim letzten Mal zufällig mit einem Montag probiert, da ist die Abkürzung ja gleich.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

rih

Die Sprache vom Pi ist auf deutsch eingestellt. Kann aber sein, dass auf dem Pi irgendetwas im Argen liegt. Ist auch noch Wheezy drauf. Aber es läuft soweit und ich möchte jetzt deswegen keine größeren Aktionen machen.

Habe jetzt die Umstellung des Codes auf englisch probiert, aber außer den englischen Namensabkürzungen müssen natürlich auch die substr-Berechnungen von 2 auf 3 Zeichen geändert werden. Da tue ich mich gerade ein wenig schwer. Könntest Du mir sagen, an welchen Stellen ich da eingreifen muss?


rischbiter123

Moin,

kannst Du mir mal bitte die hfc1-Readings hier posten. Dann schaue ich mir das heute Abend mal an.

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

rih

Hallo Andreas,

hier die gewünschten Readings:
hfc1_cloudCover
0

hfc1_code
35

hfc1_condition
leichter regen

hfc1_day_of_week
Mon, 15:00

hfc1_high_c
9

hfc1_humidity
61

hfc1_icon
heavyrain

hfc1_iconAPI
10d

hfc1_low_c
8

hfc1_pressure
1001

hfc1_pubDate
Mon, 4 Mar 2019 15:00

hfc1_rain3h
0.09

hfc1_snow3h
0.003

hfc1_tempHigh
9

hfc1_tempLow
8

hfc1_temp_c
8

hfc1_temperature
8

hfc1_wind
45

hfc1_wind_speed
45


Hoffe, das reicht so. Werde parallel selbst weiter probieren, ob ich es hinbekomme. Danke für Deine Hilfe.

rih

Bin jetzt ein Stück weiter. Wochentag (Montag) und Tag (4.) werden nun angesagt. Nur beim Monat komme ich nicht weiter, obwohl sich gerade da im März an der Stringposition und Länge (-15,4) nichts geändert haben dürfte. Ist ja nur aus dem "Mär" ein "Mar" geworden. Vorausgesetzt, der hintere Teil des Strings ist in englisch und deutsch gleich. Da brauche ich jetzt Deine Hilfe.
Bei den 4-stelligen Monatsnamen June, July, Sept (sofern die so geliefert werden) braucht man dann wahrscheinlich auch noch eine Sonderbehandlung.

CoolTux

my $l = "";

Das ist ein leerer String. Aber eben ein String. Da kann man nicht mit > oder < arbeiten.

my $l;
So sollte es gehen.
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

rischbiter123

Moin,

@CoolTux
funktioniert, habe es im ersten Post geändert.

@rih

Hier die vollständige Fassung für Englische Readings. Dort muss es -14,3 heißen.

sub WetterMorgen($) {
my ($no) = @_;
my $wet = "OpenWetterWhv";
my $i = "";
my $no1 = "";
my $k = 1;
my $h = 6;
my $l;
my $l1 = 5;
my $u = "";
my $v = "";
my $w = "";
my $h1 = substr(ReadingsVal($wet,"hfc1_pubDate",0), -5, -3);
if ($h1 eq "06")
{$i = 0}
elsif ($h1 eq "09")
{$i = 1}
elsif ($h1 eq "12")
{$i = 2}
elsif ($h1 eq "15")
{$i = 3}
elsif ($h1 eq "18")
{$i = 4}
elsif ($h1 eq "21")
{$i = 5};
if ($no > 1)
{$no1 = $no-$i}
else {$no1 = $no;
$l1 = $l1 - $i;
$h = $h1};
my $da = "hfc".$no1."_pubDate";
my $da1 = substr((ReadingsVal($wet,$da,0)), 4, 3);
my $Mona1 = &Mona(substr((ReadingsVal($wet,$da,0)),-14,3));
my $da2 = &WoTa(substr((ReadingsVal($wet,$da,0)),0,3))." ".$da1.". ".$Mona1.". ";
while($l < $l1) {
$k = $no1+$l;
my $we = "hfc".$k."_condition";
my $te = "hfc".$k."_tempHigh";
my $wi = "hfc".$k."_wind";
  $u = "Um ".$h." Uhr ist es ".(ReadingsVal($wet,$we,0)).". Die Temperatur beträgt voraussichtlich ".(ReadingsVal($wet,$te,0))." Grad Celsius."." Die Windgeschwindigkeit beträgt ".(ReadingsVal($wet,$wi,0))." Kilometer pro Stunde. ";
  $v = $v.$u;
  $h += 3;
  $l += 1;
}
  $w = "Das Wetter vom ".$da2.". ".$v;
  return $w;
}

sub WoTa($) {
my ($da3) = @_;
my $da4 ="";
if ($da3 eq "Mon")
{ $da4 = "Montag"; }
elsif ($da3 eq "Tue")
{ $da4 = "Dienstag"; }
elsif ($da3 eq "Wed")
{ $da4 = "Mittwoch"; }
elsif ($da3 eq "Thu")
{ $da4 = "Donnerstag"; }
elsif ($da3 eq "Fri")
{ $da4 = "Freitag"; }
elsif ($da3 eq "Sat")
{ $da4 = "Samstag"; }
elsif ($da3 eq "Sun")
{ $da4 = "Sonntag"; };
return $da4;
}

sub Mona($) {
my ($Mon1) = @_;
my $Mon2 ="";
if ($Mon1 eq "Jan")
{ $Mon2 = "Januar"; }
elsif ($Mon1 eq "Feb")
{ $Mon2 = "Februar"; }
elsif ($Mon1 eq "Mar")
{ $Mon2 = "März"; }
elsif ($Mon1 eq "Apr")
{ $Mon2 = "April"; }
elsif ($Mon1 eq "May")
{ $Mon2 = "Mai"; }
elsif ($Mon1 eq "Jun")
{ $Mon2 = "Juni"; }
elsif ($Mon1 eq "Jul")
{ $Mon2 = "Juli"; }
elsif ($Mon1 eq "Aug")
{ $Mon2 = "August"; }
elsif ($Mon1 eq "Sep")
{ $Mon2 = "September"; }
elsif ($Mon1 eq "Oct")
{ $Mon2 = "Oktober"; }
elsif ($Mon1 eq "Nov")
{ $Mon2 = "November"; }
elsif ($Mon1 eq "Dec")
{ $Mon2 = "Dezember"; };
return $Mon2;
}


LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

CoolTux

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

rischbiter123

Moin,

könnte man das dann bei allen so machen, oder gäbe es dann Deklarationsfehler?

LG

Andreas
4*Raspi, Max Thermostate und Fensterkontakte, FB7590, Mysensors und NanoCUL, IT und Sonoff, zigbee2mqtt2

CoolTux

#28
Kannst Du bei allen machen, so lange Du später in der Routine erst eine Zuweisung machst bevor Du ab fragst.
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

rih

Hallo Andreas,

vielen Dank für Deine Hilfe. Nun läuft die Vorhersage korrekt auf meinem "halb-englischen" Pi.

Was den Meinungsaustausch zwischen Dir und CoolTux anbelangt: da scheint es nun doch zu Deklarationswarnungen zu kommen.
2019.03.04 18:15:05 1: PERL WARNING: Use of uninitialized value $l in numeric lt (<) at ./FHEM/99_myUtils.pm line 106.
2019.03.04 18:15:05 1: PERL WARNING: Use of uninitialized value $l in addition (+) at ./FHEM/99_myUtils.pm line 107.