Anfängerprobleme mit Variablen

Begonnen von LCN-User, 05 Mai 2013, 12:22:07

Vorheriges Thema - Nächstes Thema

LCN-User

Hallo,

bei mir läuft eigentlich LCN als Bussystem. Vor kurzem habe ich aber alle Fenster mit Homematic-Drehgriffen ausgestattet, die ich mit FHEM (auf einer FB 7390) abfrage. Die Ergebnisse möchte ich später wieder an mein LCN-System in Form von verschiedenen 8bit-Werten übergeben.

Der Code ist nur provisorisch. Der ermittelte 8bit-Wert soll später weiter verarbeitet und von einer Subroutine mittels http-Aufruf an mein LCN-System übergeben werden.

Die ersten Versuche dazu sind holprig. Folgender FHEM-Code wirft mir für einen Notify reihenweise Deklarationsfehler aus:
DisplayFensterBadWC {
   my $vmTransfer   = 0b00000000
   my $vmTransfer43 = 0b00001100
   my $WindowState  = Value("FensterBadWC")
   my $VM = ""
   $WindowState = Value("FensterBadWC")
   { if($WindowState eq "closed")
       ($vmTransfer43 = 0b00000000) }
   { elsif($WindowState eq "tilted")
       ($vmTransfer43 = 0b00000100) }
   $vmTransfer = $vmTranfer43  vmTransfer21
   $VM = sprintf %d, $vmTransfer
}


Zitat2013.05.05 12:01:28 3: DisplayFensterBadWC return value: syntax error at (eval 254) line 1, near "0b00000000    my "
Global symbol "$vmTransfer43" requires explicit package name at (eval 254) line 1.
Global symbol "$WindowState" requires explicit package name at (eval 254) line 1.
Global symbol "$WindowState" requires explicit package name at (eval 254) line 1.
Global symbol "$vmTransfer43" requires explicit package name at (eval 254) line 1.
syntax error at (eval 254) line 1, near "{ elsif"
Global symbol "$WindowState" requires explicit package name at (eval 254) line 1.
Global symbol "$vmTransfer" requires explicit package name at (eval 254) line 1.
Global symbol "$vmTranfer43" requires explicit package name at (eval 254) line 1.
(eval 254) has too many errors.

Ich verstehe nicht, wie die Deklaration von Perl funktioniert. Die Variablen sind doch lokal definiert und sollen innerhalb des notify zur Verfügung stehen. Was mache ich falsch?

Danke,
LCN-FHEM-User

Puschel74

Hallo,

wenn das ein Notify in fhem sein sollte fehlen sämtliche Zeilenabschlüsse.

Nur Auszugsweise aus einem meiner Notifys:

my $pruef_morgens_an = (Value("Morgens_Ein"));
  my $pruef_abends_aus = (Value("Abends_Aus"));
  my $pruef_temp_aussen_max = (Value("Pruef_Temp_aussen_Max"));
  my $pruef_temp_aussen_min = (Value("Pruef_Temp_aussen_Min"));
  my $pruef_temp_aussen_minmin = (Value("Pruef_Temp_aussen_MinMin"));
  my $gew_temp_innen_wz_max = (Value("Gewuenschte_Temp_innen_Max"));


Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

LCN-User

Ich habe die Datei aus dem Webfront von FHEM kopiert. So sieht das in FHEM.CFG aus:
define DisplayFensterBadWC notify DisplayFensterBadWC {\
   my $vmTransfer   = 0b00000000\
   my $vmTransfer43 = 0b00001100\
   my $WindowState  = Value("FensterBadWC")\
   my $VM = ""\
   $WindowState = Value("FensterBadWC")\
   { if($WindowState eq "closed")\
       ($vmTransfer43 = 0b00000000) }\
   { elsif($WindowState eq "tilted")\
       ($vmTransfer3 = 0b00000100) }\
   $vmTransfer = $vmTranfer43  vmTransfer21\
   $VM = sprintf %d, $vmTransfer\
}


Mit Semikolon hatte ich anfänglich gearbeitet. Hatte aber auch nichts geändert. Irgendwann bin ich dann dazu übergegangen, den Code im Webfront zu berarbeiten, um nicht mit Klammern und Strichen durcheinander zu kommen.

Wo muss ich den Semikolons einfügen, am Ende jeder Befehlszeile?

Puschel74

Hallo,

wenn du mit "Webfrontend" die DEF des Notify meinst - ich hab meinen Auszug aus der DEF kopiert.

Grüße

Edith: So sieht der Code bei mir in der fhem.cfg aus (Achtung! Anderes notify).

define Laptop_Laden_pruef notify CUL_EM_7:current.* {\
  my $Strom_Laptop=ReadingsVal("CUL_EM_7","current",0);;\
  if ($Strom_Laptop gt 0.04) {\
    Log (3,"Laptop werden geladen. Strom ".$Strom_Laptop);;\
  }\
  if (($Strom_Laptop lt 0.03) && ($Strom_Laptop gt 0.01)) {\
    fhem ("set Laptop_Lader off") if (Value("Laptop_Lader") ne "off");;\
  }\
  if ($Strom_Laptop lt 0.01) {\
    if (Value("Laptop_Laden") eq "") {\
      fhem ("define Laptop_Laden at +01:01:00 set Laptop_Lader on");;\
    }\
  }\
  Log (3,"Zur Zeit werden ".$Strom_Laptop." kWh verbraucht.");;\
}

und so in der DEF
CUL_EM_7:current.* {
  my $Strom_Laptop=ReadingsVal("CUL_EM_7","current",0);
  if ($Strom_Laptop gt 0.04) {
    Log (3,"Laptop werden geladen. Strom ".$Strom_Laptop);
  }
  if (($Strom_Laptop lt 0.03) && ($Strom_Laptop gt 0.01)) {
    fhem ("set Laptop_Lader off") if (Value("Laptop_Lader") ne "off");
  }
  if ($Strom_Laptop lt 0.01) {
    if (Value("Laptop_Laden") eq "") {
      fhem ("define Laptop_Laden at +01:01:00 set Laptop_Lader on");
    }
  }
  Log (3,"Zur Zeit werden ".$Strom_Laptop." kWh verbraucht.");
}


Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

LCN-User

Danke für die schnelle Antwort.
Zitat von: Puschel74 schrieb am So, 05 Mai 2013 12:31wenn du mit "Webfrontend" die DEF des Notify meinst - ich hab meinen Auszug aus der DEF kopiert.
OK. Ich mache es noch einmal.

LCN-User

Wenn ich im Webfrontend folgendes eingebe
DisplayFensterBadWC {\
   my $vmTransfer   = 0b00000000 ;\
   my $vmTransfer43 = 0b00001100 ;\
   my $WindowState  = Value("FensterBadWC");\
   my $VM = "" ;\
}

kriege ich im Log
2013.05.05 12:51:47 3: DisplayFensterBadWC return value: Unknown command {\
, try help
Unknown command my, try help
Unknown command my, try help
Unknown command my, try help
Unknown command }\
, try help

[/quote]
Ich darf also keine Zeilenumbruch-"\" im Webfrontend einfügen. Lasse ich die Striche weg, kriege ich:
Zitat2013.05.05 12:43:13 3: DisplayFensterBadWC return value: Unknown command {\\
, try help
Unknown command \\
, try help
Unknown command \\
, try help
Unknown command \\
, try help
Unknown command \\
}\
, try help
Ich verstehe diese Programmiersprache nicht - oder die Version ist falsch installiert. Es läuft "out-of-the-box" von AVM, über die ich einmal "update" habe laufen lassen.

Puschel74

Hallo,

guckst du nochmal oben meinen letzten Beitrag.

In der DEF stehen KEINE \ und nur EINMAL ;
In der fhem.cfg hast du dann einmal \ und zweimal ;; (das macht fhem automatisch beim speichern).

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

LCN-User

Ja, hatte ich ja vorher immer gemacht. Das Ergebnis ist für:
DisplayFensterBadWC {
   my $vmTransfer   = 0b00000000 ;
   my $vmTransfer43 = 0b00001100 ;
   my $WindowState  = Value("FensterBadWC");
   my $VM = "" ;
}


Zitat2013.05.05 12:51:47 3: DisplayFensterBadWC return value: Unknown command {\
, try help
Unknown command my, try help
Unknown command my, try help
Unknown command my, try help
Unknown command }\
, try help


Puschel74

Hallo,

versuchs mal so:

my $vmTransfer   = "0b00000000" ;

Ungetestet. Ich weiß nicht wie du einer Variablen einen festen Wert zuweisen kannst da ich das aus Dummys auslese.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

LCN-User

Hallo noch einmal.

Ich müsste mal eine kleine Parenthese einschieben:

Ich habe vorgestern ein Update von der ersten AVM-Labor auf die neuere vorgenommen. Üblicherweise konnte ich alle Änderungen in der fhem.cfg im Webfrontend durch Anklicken des Buttons "save fhem.cfg" wegsichern können. Seit dem Update kam da aber eine Fehlermeldung, wenn ich größere Änderungen machen möchte. War vorher m. E. nicht so. Daraufhin habe ich via Telnet alles FHEM-Zeug entfernt, das AVM-Image erneut eingespielt und FHEM anschließend mit "update" auf 5.4 aktualisiert. Wenn ich jetzt ins FHEM-Verzeichnis schaue, liegt dort eine fhem.cfg auf der FHEM-Ebene und eine weitere im Verzeichnis /etc. Letztere lässt sich per Editor bearbeiten und wegspeichern, die andere gehört Linux und ist schreibgeschützt. Ich hatte das Problem, dass beim Neustart von FHEM nicht die Daten aus /etc angezogen wurden und mein Notify nur noch fragmentrisch eingeldaen wurde, obwohl die cfg alle Daten enthält. Ursache dafür schienen unterschiedliche fhem.cfg in den beiden Verzeichnissen zu sein. Jetzt scheint es nach Neustart der Box aber zu funktionieren. Ein FHEM-Neustart hat nicht ausgereicht.

Ich habe nun im DEF des Notify erneut folgenden Code eingefügt und dann "save" eingegeben:
define DisplayFensterBadWC notify DisplayFensterBadWC {
   my $vmTransfer   = 0b00000000
   my $vmTransfer43 = 0b00001100
   my $WindowState  = Value("FensterBadWC")
   my $VM = ""
   $WindowState = Value("FensterBadWC")
   { if($WindowState eq "closed")
       ($vmTransfer43 = 0b00000000) }
   { elsif($WindowState eq "tilted")
       ($vmTransfer3 = 0b00000100) }
   $vmTransfer = $vmTranfer43  vmTransfer21 ;
   $VM = sprintf %d, $vmTransfer
}
"Trigger DisplayFensterBadWC" läuft ohne Log-Eintrag durch. Wie kann ich eigentlich prüfen, ob die If-Bedingungen durchlaufen werden?

Gruß, LCN-FHEM-User


MisterEltako

Über DEF des Devices im Webfrontend müsste es so lauten:

define DisplayFensterBadWC notify DisplayFensterBadWC {
   Log 3,"Fensterstatus wird geprüft";
   my $vmTransfer   = 0b00000000;
   my $vmTransfer43 = N;
   my $WindowState  = Value("FensterBadWC");
   my $VM = "";
   $WindowState = Value("FensterBadWC");
   if($WindowState eq "closed") {
       $vmTransfer43 = 0b00000000;
        Log 3, "Status geschlossen....";
   }elsif ($WindowState eq "tilted") {
       my $vmTransfer3 = 0b00000100;
       Log 3, "Status tilted....";
   }
   $VM = sprintf ("%d", $vmTransfer);
}

was soll diese Zeile bewirken:  $vmTransfer = $vmTranfer43  vmTransfer21 ;????????

MfG, MisterEltako.

HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Puschel74

Hallo,

soweit ich das noch im Kopf habe "sperrt" AVM sein fhem ein und lässt es nicht als root laufen.
Ich weiß nicht welche Möglichkeiten und Funktionen damit beschränkt werden.

Ein Kuddelmuddel (2 fhem.cfg in unterschiedlichen Ordnern?????) wird fhem evtl. auch nicht gerade das Leben leichter machen - und dir die Fehlersuche.

Tipp: Deine FB mit dem Recovery-Tool von AVM in den "jungfräulichen" Auslieferungszustand zurück versetzen und dann NUR das
5.4-Image von fhem.de über die Updatefunktion einspielen.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

LCN-User

Danke für eure Hilfe!
Zitat von: MisterEltako schrieb am So, 05 Mai 2013 16:08was soll diese Zeile bewirken:  $vmTransfer = $vmTranfer43  vmTransfer21 ;????????
Das steht hier nur experimentell. Damit baue ich mir ein 8bit-Wort zusammen, das mit folgendem Befehl an mein LCN-Bussystem übertragen wird. vmTransfer43 ist für Bit 3 und 4 zuständig, usw.:
{ GetHttpFile("192.168.178.5:8000", "/vm_bin?sgmt=0&module=216&value=$VM");0 }
$VM soll dabei das 8bit-Wort als String in Dezimaldarstellung enthalten. Der Befehl samt String-Aufbau wird später sich in einer Subroutine laufen.
Zitat von: Puschel74soweit ich das noch im Kopf habe "sperrt" AVM sein fhem ein und lässt es nicht als root laufen.
Ich weiß nicht welche Möglichkeiten und Funktionen damit beschränkt werden.
Heute habe ich irgendwo gelesen, daß das Einspielen von 5.4 das System angeblich "befreit". Muss ich noch prüfen.

ZitatEin Kuddelmuddel (2 fhem.cfg in unterschiedlichen Ordnern?????) wird fhem evtl. auch nicht gerade das Leben leichter machen - und dir die Fehlersuche.
Ganz meine Meinung. Aber ich hatte ja bewußt FHEM händisch vom System geschmissen und das Image neu eingespielt. Anschließend direkt das Upate auf 5.4 gefahren. Das Problem der zweiten fhem.cfg tauchte m. E. erst mit der neuen Labor von AVM auf. Vielleicht kann ja irgendjemand anders, der ebenfalls eine 7390 im Einsatz hat, etwas dazu sagen?
Das Plattmachen der Box mit Recover, etc. geht natürlich. Allerdings übernimmt die Konfigurations-Wiederherstellung einen Großteil der Telefoneinstellungen nicht. Ich muss dann immer sechs Handteile nicht nur neu anmelden, sondern alles individuelle, wie z. B. die separaten Klingeltöne neu einrichten - und das dauert...

Fürs Erste versuche ich erst einmal, die paar Zeilen Code prinzipiell ans Laufen zu kriegen. Danach kann ich mich um korrektes Aufsetzen der verschiedenen notify's und das Auslagern in eine Subroutine kümmern.

Ich melde mich nachher mit den Ergebnissen.

Danke noch einmal,
LCN-FHEM-User

LCN-User

Hhm, keine Ausgabe ins Logfile. Irgendwo mache ich einen Denkfehler mit dem Trigger.
Das define des notify ist jetzt
define DisplayFensterBadWC notify DisplayFensterBadWC {
Log 3,"Fensterstatus wird geprüft";
   my $vmTransfer   = 0b00000000
   my $vmTransfer43 = 0b00001100
   my $WindowState  = Value("FensterBadWC")
   my $VM = ""
   $WindowState = Value("FensterBadWC")
   { if($WindowState eq "closed")
       ($vmTransfer43 = 0b00000000) }
   { elsif($WindowState eq "tilted")
       ($vmTransfer3 = 0b00000100) }
   $vmTransfer = $vmTranfer43  vmTransfer21 ;
   $VM = sprintf %d, $vmTransfer
Log 3,"String ist zusammengebaut: $VM";
   { GetHttpFile("192.168.178.5:8000", "/vm_bin?sgmt=0&module=216&value=$VM");0 }
}

"FensterBadWC" ändert seine Einstellung open/tilted/closed korrekt, wenn ein Griff der insgesamt sechs zugehörigen Fenster gedreht wird. Wenn ich jetzt "Trigger DisplayFensterBadWC" eingebe, kriege ich keine Ausgabe ins Log.

Wo denke ich falsch?

LCN-User

Und wenn wir schon bei den Seltsamheiten der "neuen" AVM-Labor sind:  Nach Einspielen der Labor 22317 bleibt der Event-Monitor leer. Öffnen/Schließen der Fenster wird korrekt in die einzelnen Logs der Sensoren geschrieben, lediglichim Event-Monitor-Fenster ist nichts zu sehen, wenn man einen Griff dreht.

Das Ganze trat unmittelbar nach dem Einspielen, also noch vor dem Update auf 5.4 auf. Lässt sich das irgendwo einstellen?