99_myUtils.pm - Wert auslesen und erhöhen

Begonnen von bjoernhoefer, 07 Mai 2013, 16:47:27

Vorheriges Thema - Nächstes Thema

bjoernhoefer

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?

Puschel74

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?
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

bjoernhoefer

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

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

bjoernhoefer

war ein Tippfehler - hat immer schon 99_myUtils.pm geheissen.

Leider...

MisterEltako

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
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

bjoernhoefer

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.

bjoernhoefer

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.

MisterEltako

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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

bjoernhoefer

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?

Dietmar63

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
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

MisterEltako

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.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

bjoernhoefer

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.

MisterEltako

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]
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Dietmar63

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?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm