Autor Thema: [Gelöst] Code in notify tut, in myutils nicht  (Gelesen 7387 mal)

Offline ujaudio

  • Sr. Member
  • ****
  • Beiträge: 830
[Gelöst] Code in notify tut, in myutils nicht
« 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 ;))
Einen lieben Gruß
Jürgen

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16128
  • s/fhem\.cfg/configDB/g
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #1 am: 25 Februar 2015, 18:39:39 »
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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.

Offline ujaudio

  • Sr. Member
  • ****
  • Beiträge: 830
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #2 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?
Einen lieben Gruß
Jürgen

Offline jojoja

  • Full Member
  • ***
  • Beiträge: 100
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #3 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
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

Offline ujaudio

  • Sr. Member
  • ****
  • Beiträge: 830
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #4 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??!?
Einen lieben Gruß
Jürgen

Offline jojoja

  • Full Member
  • ***
  • Beiträge: 100
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #5 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?
FHEM 6.0 @ IntelNUC6CAYH;  Unifi USG, Switch, AP AC Pro; HM-MOD-UART;  Sonos Play 1 & 3, One, Beam; Philips Hue

Offline Xguide

  • Full Member
  • ***
  • Beiträge: 483
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #6 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?

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.
« Letzte Änderung: 02 Juni 2017, 20:54:30 von Xguide »
FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -

Offline rabehd

  • Sr. Member
  • ****
  • Beiträge: 894
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #7 am: 02 Juni 2017, 13:35:28 »
Weil der Januar der Monat 0 ist.
Dafür gibt es auch keinen Monat 12.
Auch funktionierende Lösungen kann man hinterfragen.

Offline krikan

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 6644
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #8 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 :

Zitat
To 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

Offline DeeSPe

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4157
  • Wer anderen eine Bratwurst brät...
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #9 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
FHEM 5.9, Brix, VIVO mini, RPi3, Debian Jessie, ZME_UZB1
HM-CFG-LAN, HM-MOD-UART-WIFI, HUE, HarmonyHub, JeeLink, CO20
Hyperion auf RPi Zero W, Sonos, viel Z-Wave und HM
alles per HomeKit steuerbar
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Offline Xguide

  • Full Member
  • ***
  • Beiträge: 483
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #10 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!
« Letzte Änderung: 02 Juni 2017, 13:42:54 von Xguide »
FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -

Offline Xguide

  • Full Member
  • ***
  • Beiträge: 483
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #11 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!
FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -

Online KernSani

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 3108
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #12 am: 02 Juni 2017, 19:51:36 »
Dann bitte noch [Gelöst] vor's Subject des ersten Posts
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Offline Xguide

  • Full Member
  • ***
  • Beiträge: 483
Antw:[Gelöst] Code in notify tut, in myutils nicht
« Antwort #13 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
FHEM 5.9 - Intel NUC i3 mit Proxmox im Stretch Container
HomeMatic - VCCU mit 2 x HM-LAN-CFG
Module: SMA Peripheries - Sonos - IPCam(s) - Philips Hue - Sprinkler - TabletUI - DBlog -