Hallo
ich kämpfe nun schon länger mit fhem. Die syntax Eigenheiten sind teilweise schwierig, zudem gibt es im im WiKi zB zu notify falsche code Beispiele ('set reading...' statt 'setreading...'). Egal, wird schon klappen...
Nun zum meinem Problem:
Ich habe zwei dummy devices für THAussen und THSchlaf, jeweils mit Temperture und Humidity. Dann ein weiteres dummy device lueften_ja. THSchlaf und THAussen werden per telnet befüllt, da meine TFA Sensoren (Cresta Protokol) nicht unterstützt werden.
define THAussen dummy
attr THAussen group Temp_Feuchte
attr THAussen room Aussen,Temperaturen
attr THAussen stateFormat T: Temperature H: Humidity
define FileLog_THAussen FileLog ./log/THAussen.log THAussen
define THSchlaf dummy
attr THSchlaf group Temp_Feuchte
attr THSchlaf room Schlaf,Temperaturen
attr THSchlaf stateFormat T: Temperature H: Humidity
define FileLog_THSchlaf FileLog ./log/THSchlaf.log THSchlaf
define lueften_ja dummy
attr lueften_ja room Schlaf,Aussen
attr lueften_ja stateFormat T: Temperature H: Humidity S: state
define TH.lueften notify (THAussen:.*|THSchlaf:.*)\
{\
my $TempAussen = ReadingsVal("THAussen","Temperature",0);;\
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);;\
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);;\
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);;\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);;\
my $innentempberechnet=($TempInnen+$TempAussen)/2;;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ('setreading lueften_ja state on');;\
} else {\
fhem ('setreading lueften_ja state off');;\
}\
fhem ('setreading lueften_ja Temperature $innentempberechnet');;\
fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet');;\
}
attr TH.lueften room Schlaf
Das Problem ist, dass das notify nicht ausgelöst wird und somit auch lueften_ja nicht aktualisiert wird.
In FHEM Web wird das notify TH.lueften seltsam angezeigt:
(http://www.hjgode.de/temp/TH.lueften.png)
Was mache ich falsch?
Zur Not befülle ich lueften_ja ebenfalls via telnet aus meinem php code der die TFA Sensoren über einen Android via get auf den Apache2 server sendet.
Hardware: Linux Debian auf D2550 mit Dual Core Atom Prozessor, 4GB RAM, 1TB Platte. Apache2, fhem 5.6, ein nanoCUL 866 MHz, ein JeeLink und ein fhemduino.
fheminfo:
Fhem info:
Release : 5.6
OS : linux
Arch : i586-linux-gnu-thread-multi-64int
Perl : v5.20.2
uniqueID : 16e4879cd728502febf0092c5fc2467e
upTime : 09:23:28
Defined modules:
CUL : 1
CUL_WS : 1
EC3000 : 4
FHEMWEB : 3
FRM : 1
FS20 : 1
FileLog : 29
HMS : 1
IT : 7
JeeLink : 1
SVG : 12
TCM : 1
autocreate : 1
dewpoint : 1
dummy : 5
eventTypes : 1
notify : 5
structure : 1
telnet : 1
Defined models per module:
CUL : CUL
FS20 : fs20st
IT : itswitch
Wofür hast denn die Klammern?
(THAussen:.*|THSchlaf:.*)
Nimm die weg, und das notify sollte triggern :)
OK, die Klammern habe ich aus dem WiKi: http://www.fhemwiki.de/wiki/Notify (http://www.fhemwiki.de/wiki/Notify)
Jetzt wird notify ausgelöst, aber nun gibt es 'unknow command' Fehler:
2015.03.18 18:31:35 5: Cmd: >{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)<
2015.03.18 18:31:35 5: Cmd: >my $HumiAussen = ReadingsVal("THAussen","Humidity",0)<
2015.03.18 18:31:35 5: Cmd: >my $TempInnen = ReadingsVal("THSchlaf","Temperature",0)<
2015.03.18 18:31:35 5: Cmd: >my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0)<
2015.03.18 18:31:35 5: Cmd: >my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen)<
2015.03.18 18:31:35 5: Cmd: >my $innentempberechnet=($TempInnen+$TempAussen)/2<
2015.03.18 18:31:35 5: Cmd: >if ($innenfeuchteberechnet < $HumiInnen) {
fhem ('setreading lueften_ja state on')<
2015.03.18 18:31:35 5: Cmd: >} else {
fhem ('setreading lueften_ja state off')<
2015.03.18 18:31:35 5: Cmd: >}
fhem ('setreading lueften_ja Temperature $innentempberechnet')<
2015.03.18 18:31:35 5: Cmd: >fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet')<
2015.03.18 18:31:35 5: Cmd: >}<
2015.03.18 18:31:35 3: TH.lueften return value: Unknown command {
, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command if, try help.
Unknown command }, try help.
Unknown command }
, try help.
Unknown command fhem, try help.
Unknown command }, try help.
2015.03.18 18:31:35 5: Cmd: >setreading THAussen H 65<
2015.03.18 18:31:35 5: Triggering THAussen (1 changes)
2015.03.18 18:31:35 5: Notify loop for THAussen H: 65
2015.03.18 18:31:35 5: Triggering TH.lueften
2015.03.18 18:31:35 4: TH.lueften exec
{
my $TempAussen = ReadingsVal("THAussen","Temperature",0);
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);
my $innentempberechnet=($TempInnen+$TempAussen)/2;
if ($innenfeuchteberechnet < $HumiInnen) {
fhem ('setreading lueften_ja state on');
} else {
fhem ('setreading lueften_ja state off');
}
fhem ('setreading lueften_ja Temperature $innentempberechnet');
fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet');
}
2015.03.18 18:31:35 5: Cmd: >{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)<
2015.03.18 18:31:35 5: Cmd: >my $HumiAussen = ReadingsVal("THAussen","Humidity",0)<
2015.03.18 18:31:35 5: Cmd: >my $TempInnen = ReadingsVal("THSchlaf","Temperature",0)<
2015.03.18 18:31:35 5: Cmd: >my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0)<
2015.03.18 18:31:35 5: Cmd: >my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen)<
2015.03.18 18:31:35 5: Cmd: >my $innentempberechnet=($TempInnen+$TempAussen)/2<
2015.03.18 18:31:35 5: Cmd: >if ($innenfeuchteberechnet < $HumiInnen) {
fhem ('setreading lueften_ja state on')<
2015.03.18 18:31:35 5: Cmd: >} else {
fhem ('setreading lueften_ja state off')<
2015.03.18 18:31:35 5: Cmd: >}
fhem ('setreading lueften_ja Temperature $innentempberechnet')<
2015.03.18 18:31:35 5: Cmd: >fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet')<
2015.03.18 18:31:35 5: Cmd: >}<
2015.03.18 18:31:35 3: TH.lueften return value: Unknown command {
, try help.
Pack den ganzen Schmonzes in eine Sub in der 99_myUtils, und gut is :)
Und dann rufst im Notify nur die Sub auf.
Zitat von: hjgode am 18 März 2015, 17:33:20
zudem gibt es im im WiKi zB zu notify falsche code Beispiele ('set reading...' statt 'setreading...').
Könntest Du bitte genau den Link und Stelle posten, wo das im Wiki falsch ist? Nur dann kann man das korrigieren. Brauchen ja schließlich nicht noch andere darüber stolpern....
Jetzt hört doch mal auf, über WIKI zu diskutieren oder Vorschläge mit der Auslagerung in eine Sub zu machen (die auch nicht funktionieren würden!) wenn das Problem doch ein völlig anderes ist. Nämlich ein Syntaxproblem:
falsch:
fhem ('setreading lueften_ja Temperature $innentempberechnet');;\
fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet');;\
richtig:
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");;\
Zitat von: Icinger am 18 März 2015, 18:44:04
Pack den ganzen Schmonzes in eine Sub in der 99_myUtils, und gut is :)
Und dann rufst im Notify nur die Sub auf.
Ich hab sogar schon eine Sub() in einer eigenen 99er pm Datei. Ich weiß nur nicht, wie ich die über notify aufrufen soll.
Zitat von: krikan am 18 März 2015, 18:53:34
Könntest Du bitte genau den Link und Stelle posten, wo das im Wiki falsch ist? Nur dann kann man das korrigieren. Brauchen ja schließlich nicht noch andere darüber stolpern....
Zum Beispiel hier http://www.fhemwiki.de/wiki/Notify:
(http://www.hjgode.de/temp/wiki-notify.png)
Das Problem ist wohl eher dass es unterschiedliche Syntax gibt je nachdem wo man was reinschreibt. Zum Beispiel in die fhem.cfg oder über die Web Eingabezeile oder in einem Perl fhem Modul. Das ist leider in allen bisherigen Fundstellen meist nicht spezifiziert.
Die Klammer um die regexp ist grundsätzlich nicht falsch.
Zitat von: betateilchen am 18 März 2015, 18:54:50
Jetzt hört doch mal auf, über WIKI zu diskutieren oder Vorschläge mit der Auslagerung in eine Sub zu machen (die auch nicht funktionieren würden!) wenn das Problem doch ein völlig anderes ist. Nämlich ein Syntaxproblem:
falsch:
fhem ('setreading lueften_ja Temperature $innentempberechnet');;\
fhem ('setreading lueften_ja Humidity $innenfeuchteberechnet');;\
richtig:
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");;\
Danke für Dein Mitgefühl.
Wann nimmt man den doppelte und einfach Anführungszeichen?
meine fhem.cfg sieht jetzt so aus, geändert, da ich gelsen habe das für Perl Zeilen ein einfaches Semikolon reicht:
define lueften_ja dummy
attr lueften_ja room Schlaf,Aussen
attr lueften_ja stateFormat T: Temperature H: Humidity S: state
define TH.lueften notify THAussen:.*|THSchlaf:.* \
{\
my $TempAussen = ReadingsVal("THAussen","Temperature",0);\
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);\
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);\
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);\
my $innentempberechnet=($TempInnen+$TempAussen)/2;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ("setreading lueften_ja state on");;\
} else {\
fhem ("setreading lueften_ja state off");;\
}\
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");;\
}
attr TH.lueften room Schlaf
und das Log zeit dann:
2015.03.18 19:05:22 4: Connection accepted from telnet:192.168.0.40:53637
2015.03.18 19:05:22 5: Cmd: >setreading THSchlaf T 13.2<
2015.03.18 19:05:22 5: Triggering THSchlaf (1 changes)
2015.03.18 19:05:22 5: Notify loop for THSchlaf T: 13.2
2015.03.18 19:05:22 5: Triggering TH.lueften
2015.03.18 19:05:22 4: TH.lueften exec
{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)
2015.03.18 19:05:22 5: Cmd: >{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)<
2015.03.18 19:05:22 3: TH.lueften return value: Unknown command {
, try help.
2015.03.18 19:05:22 5: Cmd: >setreading THSchlaf H 69<
2015.03.18 19:05:22 5: Triggering THSchlaf (1 changes)
2015.03.18 19:05:22 5: Notify loop for THSchlaf H: 69
2015.03.18 19:05:22 5: Triggering TH.lueften
2015.03.18 19:05:22 4: TH.lueften exec
{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)
2015.03.18 19:05:22 5: Cmd: >{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)<
2015.03.18 19:05:22 3: TH.lueften return value: Unknown command {
, try help.
Zitat von: hjgode am 18 März 2015, 19:09:17
Wann nimmt man den doppelte und einfach Anführungszeichen?
Einfach mal ein gutes Perl Programmierhandbuch lesen, das sind ABSOLUTE Grundlagen.
Zitat von: hjgode am 18 März 2015, 19:09:17
meine fhem.cfg sieht jetzt so aus, geändert, da ich gelsen habe das für Perl Zeilen ein einfaches Semikolon reicht:
Dito - Du hast offenbar nicht den blassesten Schimmer, was Du tust. Mach die doppelten Semikolon wieder rein, solange Du nicht verstanden hast, wann es um perl und wann es um fhem (das perl benutzt) geht.
Zitat von: betateilchen am 18 März 2015, 19:12:25
Einfach mal ein gutes Perl Programmierhandbuch lesen, das sind ABSOLUTE Grundlagen.
Dito - Du hast offenbar nicht den blassesten Schimmer, was Du tust. Mach die doppelten Semikolon wieder rein, solange Du nicht verstanden hast, wann es um perl und wann es um fhem (das perl benutzt) geht.
Na dann, wie wäre es denn richtig? Ich bin ja lernwillig...
fhem.cfg jetzt:
define lueften_ja dummy
attr lueften_ja room Schlaf,Aussen
attr lueften_ja stateFormat T: Temperature H: Humidity S: state
define TH.lueften notify THAussen:.*|THSchlaf:.* \
{\
my $TempAussen = ReadingsVal("THAussen","Temperature",0);;\
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);;\
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);;\
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);;\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);;\
my $innentempberechnet=($TempInnen+$TempAussen)/2;;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ("setreading lueften_ja state on");;\
} else {\
fhem ("setreading lueften_ja state off");;\
}\
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");;\
}
attr TH.lueften room Schlaf
log dazu:
2015.03.18 19:26:16 4: TH.lueften exec
{
my $TempAussen = ReadingsVal("THAussen","Temperature",0);
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);
my $innentempberechnet=($TempInnen+$TempAussen)/2;
if ($innenfeuchteberechnet < $HumiInnen) {
fhem ("setreading lueften_ja state on");
} else {
fhem ("setreading lueften_ja state off");
}
fhem ("setreading lueften_ja Temperature $innentempberechnet");
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");
}
2015.03.18 19:26:16 5: Cmd: >{
my $TempAussen = ReadingsVal("THAussen","Temperature",0)<
2015.03.18 19:26:16 5: Cmd: >my $HumiAussen = ReadingsVal("THAussen","Humidity",0)<
2015.03.18 19:26:16 5: Cmd: >my $TempInnen = ReadingsVal("THSchlaf","Temperature",0)<
2015.03.18 19:26:16 5: Cmd: >my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0)<
2015.03.18 19:26:16 5: Cmd: >my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen)<
2015.03.18 19:26:16 5: Cmd: >my $innentempberechnet=($TempInnen+$TempAussen)/2<
2015.03.18 19:26:16 5: Cmd: >if ($innenfeuchteberechnet < $HumiInnen) {
fhem ("setreading lueften_ja state on")<
2015.03.18 19:26:16 5: Cmd: >} else {
fhem ("setreading lueften_ja state off")<
2015.03.18 19:26:16 5: Cmd: >}
fhem ("setreading lueften_ja Temperature $innentempberechnet")<
2015.03.18 19:26:16 5: Cmd: >fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet")<
2015.03.18 19:26:16 5: Cmd: >}<
2015.03.18 19:26:16 3: TH.lueften return value: Unknown command {
, try help.
Unknown command my, try help.
Unknown command my, try help.
Du bist nicht lernwillig, du versuchst try-and-error ohne zu wissen, was dahintersteckt. Und würdest Du Dein notify einfach im Frontend definieren anstatt permanent die fhem.cfg zu vergewaltigen, hättest Du es viel einfacher.
Bei mir lässt sich das notify so problemlos - und ohne Fehlermeldung - anlegen:
define TH.lueften notify THAussen:.*|THSchlaf:.* { my $TempAussen = ReadingsVal("THAussen","Temperature",0);;\
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);;\
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);;\
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);;\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);;\
my $innentempberechnet=($TempInnen+$TempAussen)/2;;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ("setreading lueften_ja state on");;\
} else {\
fhem ("setreading lueften_ja state off");;\
}\
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");; }
Zitat von: betateilchen am 18 März 2015, 20:05:46
Du bist nicht lernwillig, du versuchst try-and-error ohne zu wissen, was dahintersteckt. Und würdest Du Dein notify einfach im Frontend definieren anstatt permanent die fhem.cfg zu vergewaltigen, hättest Du es viel einfacher.
Bei mir lässt sich das notify so problemlos - und ohne Fehlermeldung - anlegen:
define TH.lueften notify THAussen:.*|THSchlaf:.* { my $TempAussen = ReadingsVal("THAussen","Temperature",0);;\
my $HumiAussen = ReadingsVal("THAussen","Humidity",0);;\
my $TempInnen = ReadingsVal("THSchlaf","Temperature",0);;\
my $HumiInnen = ReadingsVal("THSchlaf","Humidity",0);;\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);;\
my $innentempberechnet=($TempInnen+$TempAussen)/2;;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ("setreading lueften_ja state on");;\
} else {\
fhem ("setreading lueften_ja state off");;\
}\
fhem ("setreading lueften_ja Temperature $innentempberechnet");;\
fhem ("setreading lueften_ja Humidity $innenfeuchteberechnet");; }
DANKE
Auflösung:
Das Hauptproblem war, dass die erste geschweifte Klammer direkt nach der RegEx stehen muss, nicht in einer neuen Zeile, egal ob mit \ oder ohne.
Das dummy device heisst jetzt THLueften und das notify dazu nTHLueften
In fhem sieht das jetzt so aus:
THAussen:.*|THSchlaf:.* { my $TempAussen = ReadingsVal("THAussen","Temperature",0);\
my $HumiAussen = ReadingsVal("THAussen","H",0);\
my $TempInnen = ReadingsVal("THSchlaf","T",0);\
my $HumiInnen = ReadingsVal("THSchlaf","H",0);\
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);\
my $innentempberechnet=($TempInnen+$TempAussen)/2;\
if ($innenfeuchteberechnet < $HumiInnen) {\
fhem ("setreading THLueften State Ja");\
} else {\
fhem ("setreading THLueften State Nein");;\
}\
fhem ("setreading THLueften Temperature $innentempberechnet");;\
fhem ("setreading THLueften Humidity $innenfeuchteberechnet");; }
In der fhem.cfg:
define THLueften dummy
attr THLueften room Schlaf,Aussen
attr THLueften stateFormat T: Temperature H: Humidity S: State
define nTHLueften notify THAussen:.*|THSchlaf:.* { my $TempAussen = ReadingsVal("THAussen","Temperature",0);;\ \
my $HumiAussen = ReadingsVal("THAussen","H",0);;\ \
my $TempInnen = ReadingsVal("THSchlaf","T",0);;\ \
my $HumiInnen = ReadingsVal("THSchlaf","H",0);;\ \
my $innenfeuchteberechnet=$HumiAussen-3*($TempInnen-$TempAussen);;\ \
my $innentempberechnet=($TempInnen+$TempAussen)/2;;\ \
if ($innenfeuchteberechnet < $HumiInnen) {\ \
fhem ("setreading THLueften State Ja");;\ \
} else {\ \
fhem ("setreading THLueften State Nein");;;;\ \
}\ \
fhem ("setreading THLueften Temperature $innentempberechnet");;;;\ \
fhem ("setreading THLueften Humidity $innenfeuchteberechnet");;;; }\
Danke an alle Helfer
Und wenn du das ganze Perl-Zeug in direkt in der Def bearbeiten würdest, bräuchtest du dich um keine Backslashes, maskierten Strichpunkte, Zeilenpositionen oder sonstiges kümmern. Das würde dir dann alles FHEM abnehmen.