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
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
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?
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
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.
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.
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
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
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
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
Ü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.
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
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
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?
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?
Hallo,
ZitatUnd wenn wir schon bei den Seltsamheiten der "neuen" AVM-Labor sind
Fragen diesbezüglich bitte an AVM stellen und deren Antwort hier posten - auch Rudi ist neugierig inwieweit die Ihre Labor supporten (nämlich gar nicht).
Also bitte das fhem-5.4-image einspielen und nicht mit der Labor von AVM rumfrickeln.
Grüße
Ich bin für die Hilfe dankbar - aber hier liest du nicht, was ich geschrieben habe.
In diesem Thread steht mindestens vier Mal, dass ich die 5.4 eingespielt habe - zuletzt direkt in meinem letzten Posting. Die 5.4 läuft seit gestern früh 8.30 Uhr und alles bezieht sich darauf.
Zitat2013.05.05 18:47:17 0: Server started with 76 defined entities (version Fhem 5.4 (DEVELOPMENT), $Id: fhem.pl 3128 2013-04-28 12:40:28Z rudolfkoenig $, pid 3326)
Wenn also das Update auf 5.4 die AVM-Version ersetzt: warum bleibt der Event-Monitor leer, obwohl alle Sensoren korrekt protokolliert werden und der Zustand im Webfrontend richtig angezeigt wird?
Gruß,
LCN-FHEM-User
Hallo,
dann hab ich hier
ZitatUnd wenn wir schon bei den Seltsamheiten der "neuen" AVM-Labor sind: Nach Einspielen der Labor 22317 bleibt der Event-Monitor leer.
wirklich was überlesen - sorry.
Grüße
Never mind.
Ich habe jetzt ein wenig im Forum gesucht und bin nicht allein. Da bei den Betroffenen das System aber ansonsten funktioniert, hat dies keine Auswirkung auf den Notify. Um den Event-Monitor werde ich mich separat kümmern.
Also hole ich noch einmal meine Frage von oben hervor: muss bei Eingabe von "Trigger DisplayFensterBadWC" die Routine durchlaufen und entsprechende log-Einträge erzeugt werden? Wie gesagt, ich sehe nichts.
Gruß.
Zunächst
define DisplayFensterBadWC notify DisplayFensterBadWC {...
Das ist nicht korrekt!
Das Notify darf nicht genau wie das auslösende Device lauten!!!!!
z.B. so könnte es gehen:
define Pruef_Festerzustand notify DisplayFensterBadWC {....
Wobei "DisplayFensterBadWC" angenommen das Device ist, bei welchem die Events kontrolliert werden.
Es sind noch Syntaxfehler im nachfolgenden Code - teste ich gerade, aber das Notify löst erstmal aus.
MfG, MisterEltako
Hi Mr. Eltako,
ich drehe am Rad.
DEF des Notify sieht im Webfrontend jetzt so aus:
define DisplayBadWC notify FensterBadWC {
...}
In der FHEM.CFG steht aber folgendes:
define DisplayFensterBadWC notify define DisplayBadWC notify FensterBadWC {\
...
Ich habe die Zeile im DEF-Fenster geändert, save eingegegeben und später noch einmal "save fhem.cfg" angeklickt.
Wieso sind die Inhalte nicht identisch? Wie können sie überhaupt verschieden sein?
Zitat von: MisterEltako schrieb am So, 05 Mai 2013 19:04Zunächst
Das Notify darf nicht genau wie das auslösende Device lauten!!!!!
Ich habe zwar keine Ahnung, möchte aber doch widersprechen. Genau dieser Fall steht als explizites Beispiel im Manual "Heimautomatisierung mit fhem - für Einsteiger". Das beschriebene Beispiel lautet
"define Abends notify Abends set ..". und wird getriggert mit "Trigger Abends".
Grüße,
LCN-FHEM-User
Zitat von: LCN-FHEM-User schrieb am So, 05 Mai 2013 19:36Wieso sind die Inhalte nicht identisch? Wie können sie überhaupt verschieden sein?
Das ist so gewollt.
Man könnte nun lange erklären, warum in fhem.cfg Semikola gedoppelt werden müssen und Zeilenumbrüche mit einem backslash geschützt werden - man kann es aber auch einfach akzeptieren. Sprich: Is halt so.
Im Webfrontend wurde als feature eingebaut, dass diese beiden eigentlich unschönen Sonderheiten den user nicht belasten sollen.
Deshalb weichen die beiden Darstellungen gewollt voneinander ab.
=8-)
Zitat von: LCN-FHEM-User schrieb am So, 05 Mai 2013 19:36DEF des Notify sieht im Webfrontend jetzt so aus:
define DisplayBadWC notify FensterBadWC {
...}
In der FHEM.CFG steht aber folgendes:
define DisplayFensterBadWC notify define DisplayBadWC notify FensterBadWC {\
...
Scheint ein Feature zu sein. Im DEF-Fenster steht nur der Teil ab dem Notify. Das "define 'Name'" wird nicht angezeigt. Das notify ist also von der Definition im Prinzip OK. Mögliche Syntaxfehler ausgenommen.
das beispiel mit den device das so heisst wie das notify ist für den fall gedacht das das notify nicht an einem wirklichen device hängt und auf events reagiert sondern fuer ein notify das nur von hand per trigger aufgerufen wird. der name des device ist in dem fall eigentlich egal solange es nicht wirklich existiert. der einfachste fall sicherzustellen das es nicht exisitiert und auch später nicht aus versehen angelegt wird ist halt es genau so zu nennen wie das notify.
gruss
andre
Versuche folgendes:
1. Loesche die DEF deines Notifys und speichern
2. Oeffne unter "Edit Files" deine Notify-Definition in der fhem.cfg und speichern
3. Oeffne wieder fhem.cfg und kopiere nachfolgendes in die Datei:
define DisplayFensterBadWC notify FensterBadWC {\
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"){\
my $vmTransfer3 = 0b00000100;;\
}\
$vmTransfer = "$vmTransfer43"."vmTransfer3";;\
$VM = sprintf ("%%d",$vmTransfer);;\
Log 3,"String ist zusammengebaut: $VM";;\
GetHttpFile("192.168.178.5:8000", "/vm_bin?sgmt=0&module=216&value=$VM");;\
}
4. trigger FensterBadWC und Enter
MfG, MisterEltako
So, dieser aus dem DEF-Fenster gezogene Code macht als proof-of-concept, was er soll.
FensterBadWC {
my $vmTransfer = 0b00000000;
my $vmTransfer43 = 0b00001100;
my $WindowState = Value("FensterBadWC");
my $VM = "";
{ if ($WindowState eq "closed") {
($vmTransfer43 = 0b00000000) ; }
elsif ($WindowState eq "tilted") {
($vmTransfer43 = 0b00000100); }
}
$vmTransfer = $vmTransfer43 ;
$VM = sprintf("%%d", $vmTransfer);
{ GetHttpFile("192.168.178.5:8000", "/vm_bin?sgmt=0&module=216&value=$VM");0 }
}
Danke an alle. Habe heute viel über Perl-Deklarationen und geschweifte Klammern gelernt!
Zitat von: MisterEltako3. Oeffne wieder fhem.cfg und kopiere nachfolgendes in die Datei:
Das hat sich überschnitten. Genau die Lösung, die ich inzwischen alleine hinbekommen habe - nach deinem vorherigen Input.
SChade, dass du mir das nicht früher geschickt hast :-)