[Gelöst] Code in notify tut, in myutils nicht

Begonnen von ujaudio, 25 Februar 2015, 18:32:41

Vorheriges Thema - Nächstes Thema

ujaudio

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

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ujaudio

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

jojoja

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

ujaudio

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

jojoja

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

Xguide

#6
***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.
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 -

rabehd

Weil der Januar der Monat 0 ist.
Dafür gibt es auch keinen Monat 12.
Auch funktionierende Lösungen kann man hinterfragen.

krikan

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Xguide

#10
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!
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 -

Xguide

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 -

KernSani

Dann bitte noch [Gelöst] vor's Subject des ersten Posts
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Xguide

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 -