FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ujaudio am 25 Februar 2015, 18:32:41

Titel: [Gelöst] Code in notify tut, in myutils nicht
Beitrag von: ujaudio am 25 Februar 2015, 18:32:41
Hallo,
ich habe jede Menge Beiträge (zugegbenermaßen nicht alle) durchforstet, die eine ähnliche Fehlermeldung haben wie ich:
Global symbol "$wday" requires explicit package name at ./FHEM/99_myUtils.pm line 34. Global symbol "$wday" requires explicit package name at ./FHEM/99_myUtils.pm line 36.
Aber ich finde daraus keinen Hinweis. Ich habe den Code in einem notify Fehlerfrei am laufen, aber beim Abspeichern in MyUtils bekomme ich o.g. Fehler.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
################################################################
# Rollladensteuerung abhängig von Schieberegler oder automatisch
################################################################
sub shuttercontrol ($$) {
  my ($slider, $shutter) = @_;
  my $posindex = 0;
####################
# jemand da nein  ja
#            0    75
####################
  if (Value("jaristda") eq 1) {
    $posindex += 75;
  };
#################
# Tag Mo-Fr Sa So
#       0   25 50
#################
  if ($wday == 6) {
    $posindex += 25;
  } elsif ($wday == 0) {
    $posindex += 50;
  };
################################
# Twilight dunkel           hell
#               0  1  2  3  4
################################
  if (ReadingsVal("Daemmerung", "twilight_weather",0)>50) {
    $posindex += 4;
  } elsif (ReadingsVal("Daemmerung", "twilight_weather",0)>30) {
    $posindex += 3;
  } elsif (ReadingsVal("Daemmerung", "twilight_weather",0)>10) {
    $posindex += 2;
  } elsif (ReadingsVal("Daemmerung", "twilight_weather",0)>5) {
    $posindex += 1;
  };
if ($slider>=0) {
  fhem("$shutter set $slider")
  }
}
1;


Konkrete Frage: Warum funktioniert $wday im notify, nicht aber in der Subroutine?
(Bitte nicht über die Logik sinnieren, die habe ich zu Testzwecken erst einmal vereinfacht ;))
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: betateilchen am 25 Februar 2015, 18:39:39
Zitat von: ujaudio am 25 Februar 2015, 18:32:41
Konkrete Frage: Warum funktioniert $wday im notify, nicht aber in der Subroutine?

Weil $wday nur für fhem-Oneliner zur Verfügung steht (also in der FHEMWEB Befehlszeile und direkt in notify und at devices), aber nicht als systemweite globale Variable.

Du kannst das aber problemlos in Deine Funktion einbauen:



sub shuttercontrol ($$) {
  my ($slider, $shutter) = @_;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  my $posindex = 0;
[...]



Damit hast Du die einzelnen Detailwerte aus einem Zeitstring verfügbar, also auch $wday.
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: ujaudio am 25 Februar 2015, 19:07:29
Danke, wie muss ich jetzt meine Subroutine korrekt aufrufen? Ich habe ja 2 Parameter definiert, mein Test-notify "or_rolloupd" sieht so aus:
or_slider {
if ($EVENT < 0) {
  shuttercontrol("or_slider or_test");
  } else {
  my $x = 10*$EVENT;
  fhem("set or_test $x")
  }
}


Auch wenn ich den Regler nur so bewege, dass positive Werte angenommen werden, bekomme ich die folgende Fehlermeldung:
or_rolloupd return value: Not enough arguments for main::shuttercontrol at (eval 7963) line 3, near ""or_slider or_test")"

Wo ist mein Knoten im Gehirn?
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: jojoja am 25 Februar 2015, 19:33:59
Hallo Jürgen,

probiers mal mit:
shuttercontrol("or_slider", "or_test");

das trifft sich recht gut, hatte dasselbe Problem mit $wday. Weiß zufällig auch jemand wie man sprintf einbindet?

Gruß Johannes
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: ujaudio am 25 Februar 2015, 19:45:12
Danke,

mein Fehler war wohl folgender: im Funktionsaufruf {fhem("set device value"]} wird nur 1 Argument übergeben - und ich dachte 3. Deshalb meine völlig falsche Analogie.

Deiner Frage entnehme ich, dass perl-Funktionen wie z.B. sprintf nicht im perlcode von myUtils verfügbar sind??!?
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: jojoja am 25 Februar 2015, 19:49:49
Genau. Ich musste auch für switch(case)
use :: Switch;
verwenden, nur habe ich zu sprintf nichts passendes gefunden. Oder mache ich grundlegend etwas falsch?
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: Xguide am 02 Juni 2017, 13:16:54
***Update: Problem gelöst, ich war zu dusselig***

Hallo zusmamen,

Betateilichen hat im zitierten Beitrag erwähnt, dass man sich die DateTime Variablen in der myUtils verfügbar machen kann.
Das hat bei mir auch bis zum 28.05.2017 funktioniert, allerdings jetzt nicht mehr.
Hat jemand eine Idee woran das liegt? Ich bin mir keiner Änderung bewusst...In den Notifies usw. funktioniert es


  my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
  Log(1, "returnNoOfDays(): Timestring ".localtime(time));
  Log(1, "returnNoOfDays(): Year ".$year);
  Log(1, "returnNoOfDays(): Month ".$mon);
  Log(1, "returnNoOfDays(): Day ".$mday);
  Log(1, "returnNoOfDays(): Hour ".$hour);
  Log(1, "returnNoOfDays(): Min ".$min);
  Log(1, "returnNoOfDays(): Sec ".$sec);


Ergebnis:

2017.06.02 13:09:55 1: returnNoOfDays(): Timestring Fri Jun  2 13:09:55 2017
2017.06.02 13:09:55 1: returnNoOfDays(): Year 117
2017.06.02 13:09:55 1: returnNoOfDays(): Month 5
2017.06.02 13:09:55 1: returnNoOfDays(): Day 2
2017.06.02 13:09:55 1: returnNoOfDays(): Hour 13
2017.06.02 13:09:55 1: returnNoOfDays(): Min 9
2017.06.02 13:09:55 1: returnNoOfDays(): Sec 55


Danke für Eure Hilfe!

PS: Das ich ggf. $year += 1900 machen muss verstehe ich ja noch, aber warum Monat 5?

Zitat von: betateilchen am 25 Februar 2015, 18:39:39
Weil $wday nur für fhem-Oneliner zur Verfügung steht (also in der FHEMWEB Befehlszeile und direkt in notify und at devices), aber nicht als systemweite globale Variable.

Du kannst das aber problemlos in Deine Funktion einbauen:



sub shuttercontrol ($$) {
  my ($slider, $shutter) = @_;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  my $posindex = 0;
[...]



Damit hast Du die einzelnen Detailwerte aus einem Zeitstring verfügbar, also auch $wday.
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: rabehd am 02 Juni 2017, 13:35:28
Weil der Januar der Monat 0 ist.
Dafür gibt es auch keinen Monat 12.
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: krikan am 02 Juni 2017, 13:37:03
Schau mal in http://perldoc.perl.org/functions/localtime.html:

Zitat...month in the range 0..11 , with 0 indicating January and 11 indicating December. This makes it easy to get a month name from a list..

Das ist abweichend von https://fhem.de/commandref.html#perl :

ZitatTo make date and time handling easier, the variables $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst are available in the perl oneliners (see also perldoc -f localtime). Exceptions: $month is in the range of 1 to 12, and $year is corrected by 1900 (as I would expect).

Warum das bis 28.05.2017 funktioniert haben soll, verstehe ich nicht..

Gruß, Christian
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: DeeSPe am 02 Juni 2017, 13:37:18
http://perldoc.perl.org/functions/localtime.html

Beginnend bei 0 ist es einfacher das durch ein Array zu jagen und die passenden Monatsnamen statt dessen auszuspucken!
Siehe:
    my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
    print "$abbr[$mon] $mday";
    # $mon=9, $mday=18 gives "Oct 18"


Gruß
Dan
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: Xguide am 02 Juni 2017, 13:38:02
Also sagt ihr mir, dass sich daran nie was geändert hat?
Das wundert mich aber wirklich, da ich am Wochenende werder etwas am Pi noch am FHEM geändert habe und vor dem 28.05. kamen die DateTimes richtig aus der myUtils ohne 1900 auf das Jahr zu addieren oder +1 bei Monat zu machen....

Dann bräcuhte ich mal eine Erklärung dafür, ich hoffe ihr traut mir zu Nachrichten per Copy & Paste hier rein zu packen:


ℹ️Info 2017-05-28 12:50:11: Es klingelt jemand an der Tür!

ℹ️Info 29.04.0117 08:07:59:Haus verlassen!✅Alle Fenster geschlossen!
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: Xguide am 02 Juni 2017, 13:50:37
Kommando zurück, jetzt fällt mir der Unterschied auf. Ich hatte das Klingeln vergessen auf meine neue Funktion umzubiegen und da ich dafür nur das Notify geändert habe, habe ich keine Log-Benachrichtigung darüber.
Mea Culpa - Die Fehler entstanden bei mir durch die Umstellung von Notify auf myUtils.
Werde jetzt brav +1900 und +1 machen :-)

Danke für die schnelle Hilfe!
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: KernSani am 02 Juni 2017, 19:51:36
Dann bitte noch [Gelöst] vor's Subject des ersten Posts
Titel: Antw:[Gelöst] Code in notify tut, in myutils nicht
Beitrag von: Xguide am 02 Juni 2017, 20:56:24
Ich habe den Thread gekapert, deswegen kann ich es nicht beim ersten Post machen.
Habe meinen Beitrag aber entsprechend markiert!

Danke noch einmal für die Tipps und ein schönes Wochenende,

Marcel