Funktionen Auslagern -> Fehler (Bareword)

Begonnen von yep_DD, 15 Januar 2019, 01:18:34

Vorheriges Thema - Nächstes Thema

yep_DD

Hallo und einen guten Abend,

ich bin gerade dabei eine etwas "umfangreichere" Definition eines Notify in eine eigene Sub auszulagern. Gemäß des Tutorials benamst als "99_xxxxUtils.pm", dabei rufe ich alle Befehle des eigenen DoIfs nacheinander auf und bekomme aber folgende Fehlermeldung:

Bareword "off" not allowed while "strict subs" in use at ./FHEM/99_miscUtils.pm line 24. Bareword "off" not allowed while "strict subs" in use at ./FHEM/99_miscUtils.pm line

Das Moduls ist gemäß des Skeleton definiert, also mit

Zitatuse strict;
use warnings;
use POSIX;

Wie kann ich es richtig machen und dafür sorgen, dass FHEM das Modul an der richtigen Stelle lädt an dem die entsprechenden Variablen bereits definiert sind. So sieht das komplette Modul aus, falls es hilft die Frage zu beantworten:

Zitat
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
miscUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub KinoAn() {

set RolloWohnzimmer runter;
set HUEGroup13 off;
set HUEGroup2 off;
set HUEGroup8 off;
set HUEGroup6 off;
set HUEGroup9 off;
set HUE scene mGUM-b3iewZwkj5;
if ( fhem("get AVR state") eq "absent" ){
  set HUEDevice33 on;
  set HUEDevice32 on;
  sleep 45;
  set AVR on;
} else {
  set AVR on;
  sleep 5;
  #"/opt/fhem/test.py 21890150573100A";
  set AVR scene scene1;
}
}

1;

herrmannj

fhem('set RolloWohnzimmer runter');

'sleep' ist eine _ganz_ schlechte Idee ...

t1me2die

So sollte es funktionieren:


##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

sub
miscUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.
sub KinoAn() {

fhem ('set RolloWohnzimmer runter;
set HUEGroup13 off;
set HUEGroup2 off;
set HUEGroup8 off;
set HUEGroup6 off;
set HUEGroup9 off;
set HUE scene mGUM-b3iewZwkj5');
if ( fhem("get AVR state") eq "absent" ){
  fhem ('set HUEDevice33 on;
  set HUEDevice32 on;
  sleep 45;
  set AVR on');
} else {
  fhem ('set AVR on;
  sleep 5;
  #"/opt/fhem/test.py 21890150573100A";
  set AVR scene scene1');
}
}

1;


@herrmannj: Ich dachte, wenn ein 'sleep' innerhalb eines FHEM-Befehl's steht (nicht am Ende), dann wird es automatisch so wie ein "at" verarbeitet und blockiert FHEM nicht? Habe ich dort falsche Erkenntnisse? In dem o.g. Beispiel sollte also keine Blockierung von FHEM stattfinden.
Ich lasse mich aber gerne eines besseren belehren  :)

Gruß
Mathze

Byte09

#3
edit: glöscht wegen morgentlichem unsinn ;-)
.... das passiert wenn man die augen noch nicht richtig aufbekommt, aber meint kommentieren zu müssen  :-\

yep_DD

Zitat von: herrmannj am 15 Januar 2019, 02:34:41
fhem('set RolloWohnzimmer runter');

'sleep' ist eine _ganz_ schlechte Idee ...

da muss ich @t1me2die zustimmen, laut command reference (https://fhem.de/commandref_DE.html#sleep) ist sleep nur am Ende ohne weiterführenden Befehl ein Problem.

@t1me2die: Ja, das funktioniert vielen Dank. Das hatte ich nicht bedacht. Bin auch noch ganz am Anfang. Danke schön.

herrmannj

Zitat von: yep_DD am 15 Januar 2019, 12:16:47
da muss ich @t1me2die zustimmen, laut command reference (https://fhem.de/commandref_DE.html#sleep) ist sleep nur am Ende ohne weiterführenden Befehl ein Problem.

Du hast aber ein _perl_ sleep in Deinem code, t1me2die ein fhem sleep. Gravierender Unterschied

yep_DD

@herrmannj, ja, aber nur weil ich nicht wusste, dass es nicht fhem syntax war (Anfänger), das was ich hatte hat ja eben genau deswegen nicht funktioniert. Ich wollte ja fhem Syntax verwenden. So wie ich das sehe ist für alle anderen die sich fragen wohl folgene Aussage besser.

Niemals ein sleep in Perl verwenden oder ein sleep in FHEM ohne nachfolgenden Befehl, korrekt?

herrmannj


yep_DD

Super vielen Dank :). Weil wir gerade dabei sind, vielleicht kann ich das sleep auch komplett entfernen. Kann ich in FHEM non-blocking ein while verwenden?  Ich schalte meine Steckdosen an und warte dann einfach bis der AVR theoretisch am Netzwerk sein müsste. Ich würde aber gern ein while AVR state ne present oder ähnliches verwenden. Geht das? Oder eher über ein Notify?

amenomade

Sinn von einem ereignisgesteuerten System ist tatsächlich auf Ereignisse (dann über notify oder at) zu reagieren.

while und sleep sind keine gute Ideen. Das ist prozedurale Programmierung. Ein while wird immer blockieren.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

yep_DD

@amenomade danke, so habe ich es jetzt auch gelöst, über notifys. Dennoch ist ein sleep im fhem kontext laut Wiki und diverser andere Beiträge nicht blockierend. Im Perl Kontext hingegen schon.

amenomade

#11
Zitat von: yep_DD am 16 Januar 2019, 20:53:42
@amenomade danke, so habe ich es jetzt auch gelöst, über notifys. Dennoch ist ein sleep im fhem kontext laut Wiki und diverser andere Beiträge nicht blockierend. Im Perl Kontext hingegen schon.
Ja, im fhem Kontext hat es schon Sinn, wenn Du z.B. nach einem Event in einem notify 2 Befehle nicht direkt nacheinander durchführen möchtest. Einige nutzen es z.B. um nicht alle Jalousien gleichzeitig runterzufahren, wenn die alle am gleichen (schwachen) Stromkreis hängen. Solche Sachen sind OK. Aber, obwohl es funktioniert, hat es keinen Sinn ein sleep zu benutzen, um auf dem Status von einem anderen Device zu warten. Das fhem sleep ist eher ein "mach mal eine kurze Pause", und kein "warte auf etwas".
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

yep_DD

@anemonade, danke für die genaue erklärung. Denn genau so mache ich es jetzt. Ich habe ein Device was ich wirklich nur blind schalten kann leider ein Sleep brauche, weil sich noch niemand erbarmt hat ein Modul dafür zu schreiben. Für alles andere - den AVR - aus dem 1. Beitrag, habe ich es jetzt so umgebaut, dass ich über ein Notify informiert werde, wenn der AVR verfügbar ist. Ich habe somit alle -bis auf 1- Sleep entfernen können.