FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: bjoernhoefer am 07 Mai 2013, 16:47:27

Titel: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 07 Mai 2013, 16:47:27
Hallo,

ich möchte einen Counter erstellen, der unter einen gewissen Umstand erhöht wird (wenn der Yahoo Wetter Code kleiner als 16 ist).

Dazu hab ich mir folgendes erstellt:

- Das Yahoo Wetter
define YahooWetter Weather 12814970 60
attr YahooWetter room wetter


- Einen Dummy
define wetter_dummy dummy
attr wetter_dummy room test
attr wetter_dummy state 1


- Ein Notify, der bei der Änderung des Yahoo Wetters meine myUtils auslöst.
define notify_wetter_test_01 notify YahooWetter {WetterAuswertung(ReadingsVal("YahooWetter","code",0))}

Und natürlich abschließend, 99_myUtils.pl (liegt im "Home Verzeichniss" /opt/fhem (unter Debian)):
package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

##########################################################
sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value(wetter_dummy);
  if ($Wetter < 16) {
    weather_temp++;
    {fhem ("setstate wetter_dummy ".$weather_temp)}
  }
}

1;


Ziel des ganzen ist es, die Bewässerung meines Gartens nur durchzuführen, wenn es nicht geregnet hat (also der Yahoo Code im Lauf des Tages nie kleiner als 16 war)
Der Counter wird dann mit einen at um 00:00:10 wieder auf Null gestellt.

Wenn ich nun das ganze so starte, dann bekomm ich ganz lustig viele Einträge in meinem Log:
Zitat2013.05.07 15:05:08 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 77) line 1.

2013.05.07 15:05:08 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 78) line 1.

2013.05.07 15:05:08 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 79) line 1.

Hat irgend wer eine Idee, was ich da falsch mache?
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Puschel74 am 07 Mai 2013, 18:09:12
Hallo,

hast du ein reload 99_myUtils.pm eingegeben und die Datei damit neu eingelesen?

Grüße

Edith:
ZitatUnd natürlich abschließend, 99_myUtils.pl
99_myUtils.pl?? ist ein Tippfehler vermute ich mal?
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 07 Mai 2013, 18:14:54
Hab fhem mittels init.d immer neu gestartet... Sollte eigentlich ausreichen, oder?
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Puschel74 am 07 Mai 2013, 18:22:02
Hallo,

ZitatHab fhem mittels init.d immer neu gestartet... Sollte eigentlich ausreichen, oder?

Nicht wenn du die Datei wirklich

Zitat99_myUtils.pl

genannt hast.

Grüße
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 08 Mai 2013, 11:12:13
war ein Tippfehler - hat immer schon 99_myUtils.pm geheissen.

Leider...
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: MisterEltako am 08 Mai 2013, 11:59:24
Es fehlen Anführungszeichen und der fehm-Aufruf ist falsch:

sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value("wetter_dummy");
  if ($Wetter < 16) {
    weather_temp++;
    {fhem ("setstate wetter_dummy $weather_temp")}
  }
}

MfG, MisterEltako
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 08 Mai 2013, 13:29:05
Nein Leider auch nicht...

package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

##########################################################
sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value("wetter_dummy");
  if ($Wetter < 16) {
    weather_temp++;
    {fhem ("setstate wetter_dummy $weather_temp")}
  }
}

1;


Meldung:
Zitat2013.05.08 13:24:21 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 46) line 1.
2013.05.08 13:24:21 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 47) line 1.
2013.05.08 13:24:21 3: notify_wetter_test_01 return value: Undefined subroutine &main::WetterAuswertung called at (eval 48) line 1.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 08 Mai 2013, 13:48:42
Der Fehler ist gefunden...

1. Das Skript lag im falschen Verzeichniss - muss in /opt/fhem/FHEM liegen (bei debian zumindest)
2. Im Skript fehlt noch ein $-Zeichen.

package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

##########################################################
sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value("wetter_dummy");
  if ($Wetter < 16) {
    [color=red]$[/color]weather_temp++;
    {fhem ("setstate wetter_dummy $weather_temp")}
  }
}

1;


Das komische ist nur, wenn ich das Yahoo Wetter update ("set YahooWetter update") dann erhöht sich der Wert des wetter_dummy nicht...

Ich hab ihn sicherheitshalber auf 1 gesetzt, aber er wird nicht mehr... obwohl der YahooWetter code in Wien derzeit auf 11 (shower) ist.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: MisterEltako am 08 Mai 2013, 17:25:37
so müsste es klappen:

sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value("wetter_dummy");
  if ($Wetter < 16) {
    ++$weather_temp;
    {fhem ("setstate wetter_dummy $weather_temp")}
  }
}

MfG,MisterEltako.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 08 Mai 2013, 17:53:54
ok, danke - komische notation, aber wenns funktioniert is mir wurscht... ;-)

ich habs jetzt auf >16 und mit einen update von YahooWetter getestet.

Jetzt hat er mir den Wert auf 32 gestellt, ein paar Augenblicke auf 62, einige Augenblicke später auf 92.

Es scheint fast so, als würde er alle paar Sekunden das Value für den Wetter Dummy um den Code-Wert vom YahooWetter erhöhen, oder führt er das Update 30mal durch?

Irgendwelche Ideen?
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Dietmar63 am 08 Mai 2013, 18:24:35
Das liegt daran, dass der notify für alle readings, die alle 60 Sekunden upgedatet werden feuert.

Du musst versuchen weiter einzuschränken, eventuell nur auf das reading temp.

Ein event-on-change-reading auf temp wird auch helfen. Mal in der Dokumentation nachlesen

Häng mal zum Testen nach dem notify folgenden Code ein :

{Log 3, "Nachricht von @: %" }

Dann siehst du wie oft deine Funktion aufgerufen wird
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: MisterEltako am 08 Mai 2013, 18:34:27
Du musst das notify noch spezifizieren, sonst wird jede Wetteroption zum Event für notify:

zB.

define notify_wetter_test_01 notify YahooWetter:code.* {WetterAuswertung(ReadingsVal("YahooWetter","code",0))}

oder

zum Weather-Device hinzufügen:

attr  YahooWetter event-on-change-reading code.*

MfG, MisterEltako.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 08 Mai 2013, 22:21:30
Das mit dem einschränken des notify hat super funktioniert - jetzt seh ich dann wie viele Minuten es wahrscheinlich geregnet hat - war zwar nicht so geplant, aber ist eigentlich auch kein Nachteil ;-)

Wenn ich den Log-Eintrag wie folgt eintrage:
package main;
use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

##########################################################
sub WetterAuswertung ($) {
  my ($Wetter) = @_;
  my $weather_temp = Value("wetter_dummy");
  if ($Wetter > 16) {
    ++$weather_temp;
    {fhem ("setstate wetter_dummy $weather_temp")}
    {Log 3, "Nachricht von @: %" }
  }
}

1;


quitiert er mir das beim restarten von fhem mit folgender Meldung auf der Konsole:
ZitatPossible unintended interpolation of @: in string at ./FHEM/99_myUtils.pm line 19, <$fh> line 5.

Aber danke vielmals für die schnelle und echt gute Hilfe soweit.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: MisterEltako am 08 Mai 2013, 22:56:06
Hi!

Du musst:

 {Log 3, "Nachricht von @: %" }

nicht in 99_myUtils.pm, sondern in deinen Aufruf durch das notify einbauen!!!

Also dein Aufruf in Fhem.cfg müsste so lauten:

[color=red]define notify_wetter_test_01 notify YahooWetter {\
   WetterAuswertung(ReadingsVal("YahooWetter","code",0));;\
   Log 3, "Nachricht von @: %";;\
}[/color]
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Dietmar63 am 09 Mai 2013, 11:15:07
Bist du sicher, dass du alle 60 Sekunden bei Yahoo per Weather die Wetterdaten beziehen willst.


1. werden die Wetterdaten bei Yahoo nicht so oft geändert, dass man sie so oft holen müßte.
2. habe ich festgestellt, dass die Daten auf Yahoo nicht super genau sind.
3. Der Service von Yahoo ist zur Zeit kostenlos. Yahoo könnte bei zu viel Traffic auf deren Servern
   auf die Idee kommen, den Service zu sperren. Mit Google ist das vor einem Jahr auch passiert. Der Googleservice ist
   nur noch für Geld zu bekommen. Ich hatte mir ebenfalls einen Wetterlogger gebaut, der dann ab August plötzlich
   keine Daten mehr lieferte.


Twighlight geht übrigens ähnlich verschwenderisch(alle 900 Sekunden Aufruf der Webseite) mit dem Service von Yahoo um.

Wie sieht die Allgemeinheit den Sachverhalt?
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: MisterEltako am 09 Mai 2013, 11:27:47
Hi!

Also ich habe festgestellt, das laut Logfile mit Einschränkungen des notify nur jede Stunde abgefragt wird.

Also in diesem Fall mit:

attr <device> event-on-change-reading code.*

oder:

define notify_wetter_test_01 notify YahooWetter:code.* }\ WetterAuswertung(ReadingsVal("YahooWetter","code",0))}

Also so, wie ich es schon vorgeschlagen habe. Auf Änderungen während des Tages wird so reagiert und doch nicht zu oft gefragt. Unabhängig davon würden mich die Logeinträge im Filelog mächtig nerven ;o).

MfG, MisterEltako
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Dietmar63 am 09 Mai 2013, 12:05:10
ich mein folgenden Definition in fhem.cfg:



define YahooWetter Weather 12814970 60
attr YahooWetter room wetter


Die 60 bedeutet, dass Yahoo alle 60 Sekunden nach dem altuellen Wetter befragt wird.
Mit dem notify und dem event-on-change-reading wird ja nur dafür gesorgt, dass die Funktion WetterAuswertung($) nicht so oft aufgerufen wird.

Wie gesagt, Google hat den kostenlosten Wetterdienst letztes Jahr im August dicht gemacht.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 10 Mai 2013, 11:29:24
Ich hab jetzt meine Einstellung von YahooWetter auf 3600 geändert - damit wird nur noch alle 30 Minuten nach neuen Wetter "gesucht".

Stresst dann den RaspberryPi auch nicht so, als wie wenn er jede Minute den gleichen Wert abfragt.

Initial ging ich auch davon aus, das 60 für Minten steht, was auch in Ordnung gewesen wäre (irgendwo in der Doku gelesen, wahrscheinlich aber auch verlesen...).

Wenn Yahoo Wetter auch ungenau ist, so hat es doch den Vorteil, das es besser ist, als nichts zu tun und jeden Tag manuell zu entscheiden, ob ich bewässern will oder nicht - im Zweifelsfall kann ich es trotzdem manuell entscheiden...

Soweit scheint jetzt alles zu funktionieren, wofür ich mich bei euch bedanke. Ich hoff bei den nächsten Utils brauch ich nicht so viel (oder gar keine) Hilfe - aber wenn weis ich ja wo man echt gute Unterstützung findet. Danke nochmals.
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: Ralph am 10 Mai 2013, 12:00:35
Zitat von: bjoernhoefer schrieb am Fr, 10 Mai 2013 11:29... auf 3600 geändert - damit wird nur noch alle 30 Minuten ...
Ach Ja, wirklich ? :-)
Titel: Aw: 99_myUtils.pm - Wert auslesen und erhöhen
Beitrag von: bjoernhoefer am 10 Mai 2013, 12:52:23
Ja - echt *g*

wenn man den Timer auf 1800 stellt - schon ;-)

Ich sollt keine Umstellungen an Fenstertagen machen...