Hallo habe diesen code in meiner eigen 99 utils Datei
sub Rollladen_aufwe() {
my $hm = sprintf($we);
if ($hm && (Value("Status") eq "Automatik")) {fhem("set HM.Rollladen Hoch")}
}
Doch nun bekomme ich diese Fehlermeldung habe versucht es zu Verstehen aber ich bin in Perl nicht so bewandert Fehler aus der log ist:
2013.09.01 17:54:31 1: reload: Error:Modul 99_myUtils deactivated:
Global symbol "$we" requires explicit package name at ./FHEM/99_myUtils .pm line 63, <$fh> line 5.
Global symbol "$hm" requires explicit package name at ./FHEM/99_myUtils .pm line 68, <$fh> line 5.
kann mich jemand unterstützen der sich etwas besser auskennt benötige Hilfe
die restlichen Codes in der util funktionieren.
Probier doch einfach mal:
sub Rollladen_aufwe() {
if ($we && Value("Status") eq "Automatik") {fhem("set HM.Rollladen Hoch")}
}
hallo keiner eine Idee was ich flach mache
Ich weiß zwar nicht, wen oder was Du flach machst, aber was Du falsch machst, kann ich Dir sagen: Du liest die Antworten nicht...
Hallo,
wenn ich mich recht erinnere, muss die $we als Parameter an deine Funktion in der 99_util übergeben werden. Sonst ist es dort nicht verfügbar.
Gruß
Christian
Nö.
$we ist eine modulübergreifende Variable, die mit ihrem Inhalt fhem-weit zur Verfügung steht.
---
Hallo Fehler besteht weiterhin immer noch
Global symbol "$we" requires explicit package name at ./FHEM/99_xxUtils.pm line 67.
Code ist:
sub Rollladenxx_aufwochenende() {
if ($we && Value("Status.xx") eq "Automatik") {fhem("set HM.Rollladen_xx Hoch")}
}
Hast du auch folgende Zeilen am Anfang deiner 99_myUtils.pm ?
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
Hallo ja ist enthalten so sieht es aus:
#########################################################################
##
## Zweck.........: Zimmer Steuern
## Standort......: XX
## Typ...........: Fest eingebaute Module
## Besonderheiten: Steuerbefehle
##
#########################################################################
package main;
use strict;
use warnings;
use POSIX;
sub
XXUtils_Initialize($$)
{
my ($hash) = @_;
}
# -------------- Rollladen Christian Automatik --------------
## Steuerung
##Rollladen zu
sub RollladenXX_zu() {
if (Value("RolladenzustandXX") eq "offen") {fhem("set HM.Rollladen_Christian Runter")}
}
##Rollladen auf Wochenende
sub RollladenXX_aufwochenende() {
if ($we && Value("Status.XX") eq "Automatik") {fhem("set HM.Rollladen_XX Hoch")}
}
1;
Rolladen zu mit dem befehl sunset im rest der normalen befehlzeile geht nur diesen öffen mit sunrise am wochenende oder in der woche geht nicht
sub RollladenXX_aufwochenende($) {
my ($we) = @_;
if ($we && (Value("Status.XX") eq "Automatik")) {fhem("set HM.Rollladen_XX Hoch")}
}
Und dann RolladenXX_aufwochenende($we)
verwenden zum Aufrufen.
(hat vermutlich was mit der Logik vom fhem-Start zu tun, was dazu führt, dass die 99_xxUtils die Variable $we noch nicht kennen)
Zitat von: crissiloop schrieb am Mo, 09 September 2013 10:42wenn ich mich recht erinnere, muss die $we als Parameter an deine Funktion in der 99_util übergeben werden. Sonst ist es dort nicht verfügbar.
Ja, Du hast völlig recht. Sorry für meine zuerst falsche Antwort.
Nach meinen Tests von eben habe ich das auch festgestellt.
---
Sorry, ich lese die Anfaengerfragen nur sporadisch, betateilchen hat mich auf diese Frage aufmerksam gemacht. Meine Antwort ist hier: Link (http://forum.fhem.de/index.php?topic=14982.msg96533#msg96533)
gibt es eine Möglichkeit diese trotzdem irgendwie zu übernehmen oder wie müsste ich das schreiben das ich nach Wochenende oder nach Woche in der utils ordne
das habe ich doch oben schon geschrieben:
ZitatRolladenXX_aufwochenende($we)
verwenden zum Aufrufen
also an der Stelle, wo Du die Funktion aufrufst, übergibst Du das $we als Funktionsvariable.
Zitat von: betateilchen am 28 September 2013, 02:40:25
sub RollladenXX_aufwochenende($) {
my ($we) = @_;
if ($we && (Value("Status.XX") eq "Automatik")) {fhem("set HM.Rollladen_XX Hoch")}
}
Und dann RolladenXX_aufwochenende($we)
verwenden zum Aufrufen.
(hat vermutlich was mit der Logik vom fhem-Start zu tun, was dazu führt, dass die 99_xxUtils die Variable $we noch nicht kennen)
Das ist wohl genau die Lösung die ich benötige um meinen "Einfacher Wecker (http://forum.fhem.de/index.php?topic=30733.0) in Verbinug mit (!$we) nur an Werktagen bzw. mit ($we) nur am Wochende zum laufen zu bekommen. Z.Zt. löst er halt jeden Tag aus.
Leider verstehe ich nicht, wie ich das bei mir umgesetzt bekomme und wo ich was in meine 99_myUtils.pm schreiben muss und ob ich auch was in meiner 99_Utils.pm verändern muss.
hier mal mein Auzsug aus der 99_myUtils.pm, dummy und notify lasse ich mal weg, die sind eigentlich standard.
NACHTRAG:habe den Auszug mal so angepasst, wie ich meine das es richtig ist. Im Event Monitor sehe dann zwar das der Dummy gestellt wurde, aber es wurde kein Wecker definiert. Jetzt ist die frage, ob er jeden Tag bzw. WE geprüft wird welcher tag ist und das passiert immer um Mitternacht und erst dann wird der Wecker definiert oder es ist einfach nur falsch von mir :S
#####################################################
###########-----Wecker Notify Werktage -----############
#########################################################
sub
WeckerWerktageDummyNotifyUtils()
{
if (Value("WeckerWerktageDummy") eq "Aus")
{
fhem("delete atMarantzWerktageAn");
fhem("delete atMarantzWerktageAus");
}
else
{
my ($wday) = @_;
fhem("delete atMarantzWerktageAn");
fhem("define atMarantzWerktageAn at $wday == 1 && $wday == 2 && $wday == 3 && $wday == 4 && $wday == 5 && *".Value("WeckerWerktageDummy").":00 set Marantz on");
fhem("sleep 1");
fhem("attr atMarantzWerktageAn room Wecker");
fhem("attr atMarantzWerktageAn group Aktiv");
###
my ($wday) = @_;
my $weckzeit = Value("WeckerWerktageDummy").":00";
my $Marantz_aus = TU_Get_Increment($weckzeit,"01:10:00");
fhem("delete atMarantzWerktageAus");
fhem("define atMarantzWerktageAus at ($wday == 1 && $wday == 2 && $wday == 3 && $wday == 4 && $wday == 5 && *".$Marantz_aus." set Marantz off");
fhem("sleep 1");
fhem("attr atMarantzWerktageAus room Wecker");
fhem("attr atMarantzWerktageAus group Aktiv");
}}
#########################################################
###########-----Wecker Notify Wochenende-----############
#########################################################
sub
WeckerWochenendeDummyNotifyUtils()
{
if (Value("WeckerWochenendeDummy") eq "Aus")
{
fhem("delete atMarantzWEAn");
fhem("delete atMarantzWEAus");
}
else
{
my ($we) = @_;
fhem("delete atMarantzWEAn");
fhem("define atMarantzWEAn at ($we && *".Value("WeckerWochenendeDummy").":00 set Marantz on");
fhem("sleep 1");
fhem("attr atMarantzWEAn room Wecker");
fhem("attr atMarantzWEAn group Aktiv");
###
my ($we) = @_;
my $weckzeit = Value("WeckerWochenendeDummy").":00";
my $MarantzWochenede_aus = TU_Get_Increment($weckzeit,"01:10:00");
fhem("delete atMarantzWEAus");
fhem("define atMarantzWEAus at $we && *".$MarantzWochenende_aus." set Marantz off");
fhem("sleep 1");
fhem("attr atMarantzWEAus room Wecker");
fhem("attr atMarantzWEAus group Aktiv");
}}
ich habe den wecker inzwischen so wie unten in meiner 99_myUtils.pm stehen. die 99_myutils.pm wird fehlerlos gespeichert, aber das At wird ohne $we bzw. $wday erstellt :S
##########################################################################################
##########################################################################################
###########-----Wecker Werktage Notify-----############
#########################################################
sub
WeckerWerktageDummyNotifyUtils()
{
if (Value("WeckerWerktageDummy") eq "Aus")
{
fhem("delete atMarantzWerktageAn");
fhem("delete atMarantzWerktageAus");
}
else
{
my ($wday) = @_;
fhem("delete atMarantzWerktageAn");
fhem("define atMarantzWerktageAn at *".Value("WeckerWerktageDummy").":00 {if (($wday == 1) || ($wday == 2) || ($wday == 3) || ($wday == 4) || ($wday == 5)) {set Marantz on}}");
fhem("attr atMarantzWerktageAn room Wecker,Home");
fhem("attr atMarantzWerktageAn group Aktiv");
#######
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
#######
my $weckzeit = Value("WeckerWerktageDummy").":00";
my $Marantz_aus = TU_Get_Increment($weckzeit,"01:30:00");
fhem("delete atMarantzWerktageAus");
fhem("define atMarantzWerktageAus at *".$Marantz_aus." {if (($wday == 1) || ($wday == 2) || ($wday == 3) || ($wday == 4) || ($wday == 5)) {set Marantz off}}");
fhem("attr atMarantzWerktageAus room Wecker,Home");
fhem("attr atMarantzWerktageAus group Aktiv");
}}
#########################################################
###########-----Wecker Wochenende Notify-----############
#########################################################
sub
WeckerWochenendeDummyNotifyUtils()
{
if (Value("WeckerWochenendeDummy") eq "Aus")
{
fhem("delete atMarantzWEAn");
fhem("delete atMarantzWEAus");
}
else
{
my ($we) = @_;
fhem("delete atMarantzWEAn");
fhem("define atMarantzWEAn at *".Value("WeckerWochenendeDummy").":00 {if ($we) {set Marantz on}}");
fhem("attr atMarantzWEAn room Wecker,Home");
fhem("attr atMarantzWEAn group Aktiv");
#######
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
#######
my $weckzeit = Value("WeckerWochenendeDummy").":00";
my $MarantzWochenende_aus = TU_Get_Increment($weckzeit,"01:30:00");
fhem("delete atMarantzWEAus");
fhem("define atMarantzWEAus at *".$MarantzWochenende_aus." {if ($we) {set Marantz off}}");
fhem("attr atMarantzWEAus room Wecker,Home");
fhem("attr atMarantzWEAus group Aktiv");
}}
Hier fehlen wohl die grundlegenden Verständnisse für das Programmieren!
Die Antworten sind sehr eindeutig und verständlich!
Nochmal mit anderen Worten (wie erkläre ich es meinem Kind):
1) Du sollst deine Methode umbenennen in "WeckerWerktageDummyNotifyUtils($)". Somit möchte deine Methode eine zusätzliche Variable erhalten, welche sie benutzen kann.
2) Sobald Du "WeckerWerktageDummyNotifyUtils" in dienem Fhem aufrufst, sollst du dieses mit "WeckerWerktageDummyNotifyUtils($we)" machen.
dadurch übergibst du den Wert der Variable we an deine Methode.
3) Um diese Variable nun auch verwenden zu können, must du diese einmalig deklarieren. Dafür sollst du die Zeile "my ($we) = @_;" einmalig - vorzugsweise am Anfang - in deine Methode aufnehmen.
4) nun kannst du Aufgrund der Festlegung mit "my" den Namen $we überall aufrufen und verwenden. Diese Variable wird nun den gewünschenten Inhalt haben.
Zitat von: RomanticBoy83 am 16 September 2015, 17:14:35
Hier fehlen wohl die grundlegenden Verständnisse für das Programmieren!
Die Antworten sind sehr eindeutig und verständlich!
Nochmal mit anderen Worten (wie erkläre ich es meinem Kind):
warum den gleich persönlich werden und seit wann muss man den grundlegendes Verständnis für das Programmieren haben für eine freundliche Hausautomation, habe ich dir irgendwas getan?
Zitat von: RomanticBoy83 am 16 September 2015, 17:14:35
1) Du sollst deine Methode umbenennen in "WeckerWerktageDummyNotifyUtils($)". Somit möchte deine Methode eine zusätzliche Variable erhalten, welche sie benutzen kann.
2) Sobald Du "WeckerWerktageDummyNotifyUtils" in dienem Fhem aufrufst, sollst du dieses mit "WeckerWerktageDummyNotifyUtils($we)" machen.
dadurch übergibst du den Wert der Variable we an deine Methode.
d.h. zwei Werte ändern und dann ist schon alles richtig, das war´s, mehr nicht?
müsste dann doch so aussehen:
aus der 99_myutils.pm
###-----Wecker Wochenende Notify-----###
sub
WeckerWochenendeDummyNotifyUtils($)
{
my ($we) = @_;
if (Value("WeckerWochenendeDummy") eq "Aus")
{
fhem("delete atMarantzWEAn");
fhem("delete atMarantzWEAus");
}
else
{
fhem("delete atMarantzWEAn");
fhem("define atMarantzWEAn at *".Value("WeckerWochenendeDummy").":00 {if ($we) {set Marantz on}}");
fhem("attr atMarantzWEAn room Wecker,Home");
fhem("attr atMarantzWEAn group Aktiv");
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
my $weckzeit = Value("WeckerWochenendeDummy").":00";
my $MarantzWochenende_aus = TU_Get_Increment($weckzeit,"01:30:00");
fhem("delete atMarantzWEAus");
fhem("define atMarantzWEAus at *".$MarantzWochenende_aus." {if ($we) {set Marantz off}}");
fhem("attr atMarantzWEAus room Wecker,Home");
fhem("attr atMarantzWEAus group Aktiv");
}}
mein notify:
define WeckerWochenendeDummyNotify notify WeckerWochenendeDummy {WeckerWochenendeDummyNotifyUtils($we);}
der "DEF" vom entstehenden At, wenn ich den Wecker gestellt habe, sieht so aus
*06:40:00 {if (0) {set Marantz on}}
da taucht dann aber eine "(0)" anstatt einem "($we)" auf. habe mich schon die ganze Zeit gefreut, dass es jetzt endlich geht und nix ist.
Wenn ich das ganze mit meinem WochenWecker und "(wday)" mache, steht dort allerdings eine "(3)" :S
Zitat von: RomanticBoy83 am 16 September 2015, 17:14:35
3) Um diese Variable nun auch verwenden zu können, must du diese einmalig deklarieren. Dafür sollst du die Zeile "my ($we) = @_;" einmalig - vorzugsweise am Anfang - in deine Methode aufnehmen.
wo kommt die den zweimal vor, ich sehe es einfach nicht :(
und ist die dort jetzt besser aufgehoben?
Jetzt bist du doch schon fast am Ziel! (und angreifen wollte ich dich überhaupt garnicht - ich bin selber blutiger Anfänger und kämpfte vor kurzen mit genau diesen Problemen und immer wieder neuen und schrieb dir auch noch eine falsche Antwort weil ich nicht richtig gelesen hatte!
Zu deinem Problem:
*06:40:00 {if (0) {set Marantz on}}
"Natürlich haben wir heute nicht Wochenende - $we == 0. Wenn du es jetzt nocheinmal versuchts, dann wird aus der 0 eine 1, denn heute ist nun doch Wochenende!"
Du must es nun nur noch hinbekommen, dass $we als String interpretiert wird und nicht als Variable. Es gibt mehrere Sonderzeichen, zudenen auch das Dolarzeichen gehört. Möchtest du diese in einen String nutzen, dann \$ nur so.
edit:
Ich schaue gerade deinen Quelltext genauer an um einmal zu verstehen, was du erreichen möchtest - du benutzt ja $we nirgendswo. Demzufolge ist das mit der Variablenübergabe auch völlig umsonst und unnötig! Das Problem ist tatsächlich ausschließlich das Dollarzeichen bei dir und hat mit den vorhergehenden Erläuterungen hier im Thema nix weiter zu tun.
wenn man was in Foren liest, versteht man schnell etwas falsch, so wie ich mal wieder, deswegen meine Verwunderung.
die Lösung des ganzen ist tatsächlich der Backslash gewesen, damit funktioniert es endlich. Danke für die Hilfe.
falls es hier jemand interessiert, sieht jetzt so im Ganzen aus ;)
##-----Wecker Wochenende Notify-----###
sub
WeckerWochenendeDummyNotifyUtils($)
{
my ($we) = @_;
if (Value("WeckerWochenendeDummy") eq "Aus")
{
fhem("delete atMarantzWEAn");
fhem("delete atMarantzWEAus");
}
else
{
fhem("delete atMarantzWEAn");
fhem("define atMarantzWEAn at *".Value("WeckerWochenendeDummy").":00 { fhem('set Marantz on') if (\$we)}");
fhem("attr atMarantzWEAn room Wecker,Home");
fhem("attr atMarantzWEAn group Aktiv");
#######--hier kommt der Timer, der nach X min. alles ausschaltet--############
my $weckzeit = Value("WeckerWochenendeDummy").":00";
my $MarantzWochenende_aus = TU_Get_Increment($weckzeit,"01:30:00");
fhem("delete atMarantzWEAus");
fhem("define atMarantzWEAus at *".$MarantzWochenende_aus." { fhem('set Marantz off') if (\$we)}");
fhem("attr atMarantzWEAus room Wecker,Home");
fhem("attr atMarantzWEAus group Aktiv");
}}
Ich sage nur: http://wiki.selfhtml.org/wiki/Perl.
LG
pah