Hallo zusammen!
Ich versuche mich gerade darin, die ersten "komplizierteren" Automatisierungsregeln umsetzen. Bis jetzt leider vergeblich.
KNX_0403019 {
my $wohnzimmer = Value("dy.Weihnachtsbeleuchtung.Automatik.Wohnzimmer");;
my $kueche = Value("dy.Weihnachtsbeleuchtung.Automatik.Kueche");
my $garten = Value("dy.Weihnachtsbeleuchtung.Automatik.Garten");;
my $vorgarten = Value("dy.Weihnachtsbeleuchtung.Automatik.Vorgarten");;
if($EVENT eq "true" && $hour gt 16)
{
if($wohnzimmer eq "on" )
{
fhem "set KNX_0502000 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Wohnzimmer.Off_Active at 22:00:00 set KNX_0502000 off";;
}
if($kueche eq "on" )
{
fhem "set KNX_0501004 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Kueche.Off_Active at 23:00:00 set KNX_0501004 off";;
}
if($garten eq "on" )
{
fhem "set KNX_0502004 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Garten.Off_Active at 22:00:00 set KNX_0502004 off";;
}
if($vorgarten eq "on" )
{
fhem "set KNX_0503000 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Vorgarten.Off_Active at 23:00:00 set KNX_0503000 off";;
}
}
}
Die Syntax der FHEM-Befehle habe ich schon auf unterschiedliche Weise durchprobiert:
- fhem "set KNX_0502000 on;; define Weihnachtsbeleuchtung.Automatik.Wohnzimmer.Off_Active at 22:00:00 set KNX_0502000 off"
- fhem ("set KNX_0502000 on;; define Weihnachtsbeleuchtung.Automatik.Wohnzimmer.Off_Active at 22:00:00 set KNX_0502000 off")
- fhem ("set KNX_0502000 on");fhem("define Weihnachtsbeleuchtung.Automatik.Wohnzimmer.Off_Active at 22:00:00 set KNX_0502000 off")
Für einen für euch, mit mehr Erfahrung als ich, wird der Fehler sicherlich ins Auge springen. - Ich bin blind!
Könnt ihr bitte helfen?
Vielen Dank & Grüße
NehCoy
P.S.:
Habe inzwischen auch in Erfahrung gebracht, dass es "on-until"gibt, um die beiden Befehle zusammenzufassen. Dennoch würde ich gerne für zukünftige Aufgaben wissen, wie ich mehrere beliebige Befehle bei einer Bedingung ausführen kann.
Es wäre sehr viel sinnvoller, diese Regeln in ein Perl-Programm auszulagern, das in den 99_myUtils gespeichert wird.
LG
pah
Ich mag kein raten. Sage mir mal was nicht geht und dann schauen wir mal.
Ansonsten bin ich bei pah was die myUtils an geht.
Zitat von: CoolTux am 12 Dezember 2017, 11:40:54
Ich mag kein raten. Sage mir mal was nicht geht und dann schauen wir mal.
Ganz einfach: Nix geht. Licht geht nicht an.
Zitat von: Prof. Dr. Peter Henning am 12 Dezember 2017, 11:26:28
Es wäre sehr viel sinnvoller, diese Regeln in ein Perl-Programm auszulagern, das in den 99_myUtils gespeichert wird.
Zitat von: CoolTux am 12 Dezember 2017, 11:40:54
Ansonsten bin ich bei pah was die myUtils an geht.
Aber dazu müsste der Code auch erstmal funktionieren. ;)
Na dann fangen wir doch mal an
oberste Ebene
if($EVENT eq "true" && $hour gt 16)
Wird die Bedingung erfüllt?
Ein "Merker" (eine weitere Dummy-Variable) , der diese Frage beantwortet, habe ich gestern gesetzt und warte darauf, dass das Event ausgelöst wird...
Und warum generierst Du nicht selber das Event?
Schau Dir mal trigger an
Und Du bist Dir sicher das das Event einzig allein nur aus dem String true besteht? Da dies Dein oberster Ansatz ist würde ich Deine Regex entsprechend anpassen
KNX_0403019.true {
Das löst das Notify schon mal nicht Sinnlos aus.
Das Gerät KNX_0403019 ist vom Typ "dpt1.002". Es hat also nur die States "true" oder "false".
Das dazugehörige "devStateIcon"-Attribut sieht wie folgt aus: true:10px-kreis-gruen false:10px-kreis-rot
Gruß
NehCoy
und hast schon mal trigger aus geführt
Aber dazu müsste der Code auch erstmal funktionieren.
Unsinn. Dann gibt es sehr viel mehr Möglichkeiten zum Loggen und Debuggen.
pah
Man könnte ja erstmal mit einem einfachen printf anfangen.
Zitat von: CoolTux am 12 Dezember 2017, 12:55:47
Das löst das Notify schon mal nicht Sinnlos aus.
wie kommst du auf ein notify?
aus dem geposteten code und der _aussagekräftigen_ fehlermeldung kann man eigentlich gar nichts erkennen.
(auf den threadtitel will ich mal gar nicht eingehen....)
Zitat von: nils_ am 12 Dezember 2017, 16:00:05
wie kommst du auf ein notify?
aus dem geposteten code und der _aussagekräftigen_ fehlermeldung kann man eigentlich gar nichts erkennen.
(auf den threadtitel will ich mal gar nicht eingehen....)
Hab versucht zwischen den Zeilen des Wahnsinns zu lesen.
Und der Threadersteller hat nicht protestiert. Gebe Dir aber Recht, man erkennt wenig um zu helfen.
Zitat von: CoolTux am 12 Dezember 2017, 16:08:25
Und der Threadersteller hat nicht protestiert. Gebe Dir aber Recht, man erkennt wenig um zu helfen.
guter trick um das herauszufinden :D
So, da bin ich wieder!
Guten Abend erstmal!
Kann es sein, dass FHEM damit Probleme hat, wenn da Leerzeichen am Ende der Zeile sind!?
Eine Dummy nach dem Prüfen der if-Bedingung ($EVENT eq "true" && $hour gt 16) wurde nämlich gesetzt.
Die Abfrage ob die Automatik für einen Raum aktiv ist habe ich zusätzlich erneut mit Dummys getestet.
Und irgendwann nach x-mal hin und her kopieren ging es, nachdem ich ein paar Leerzeichen nach den ";;" entfernt hatte.
Grüße
NehCoy
Und wozu die doppelten Semikolons? Eines reicht völlig. Zeig doch mal dein ganzes Notify jetzt.
Sieht genau so aus:
KNX_0403019 {
my $wohnzimmer = Value("dy.Weihnachtsbeleuchtung.Automatik.Wohnzimmer ");;
my $kueche = Value("dy.Weihnachtsbeleuchtung.Automatik.Kueche");;
my $garten = Value("dy.Weihnachtsbeleuchtung.Automatik.Garten");;
my $vorgarten = Value("dy.Weihnachtsbeleuchtung.Automatik.Vorgarten");;
if($EVENT eq "true" && $hour gt 16)
{
if($wohnzimmer eq "on" )
{
fhem "set KNX_0502000 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Wohnzimmer .Off_Active at 22:00:00 set KNX_0502000 off";;
}
if($kueche eq "on" )
{
fhem "set KNX_0501004 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Kueche.Off_Active at 22:00:00 set KNX_0501004 off";;
}
if($garten eq "on" )
{
fhem "set KNX_0502004 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Garten.Off_Active at 23:00:00 set KNX_0502004 off";;
}
if($vorgarten eq "on" )
{
fhem "set KNX_0503000 on";;
fhem "define Weihnachtsbeleuchtung.Automatik.Vorgarten.Off_Active at 23:00:00 set KNX_0503000 off";;
}
}
}
Die Doppelsemikolon kommen daher:
https://wiki.fhem.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen
Geht nun also sagst?
am besten NICHT in der cfg rumpinseln... dann können solche Fehler nicht passieren.
Empfehlung ist komplett über das FHEMWEB Frontend zu arbeiten.
Zitat von: CoolTux am 12 Dezember 2017, 21:04:01
Geht nun also sagst?
Das zeigt sich morgen Abend!
Anstelle KNX_0403019 einen Dummy zu verwenden hat funktioniert. Bei der Verwendung von KNX_0403019 kam die Ausführung über die erfolgreiche Prüfung von
if($EVENT eq "true" && $hour gt 16) hinaus.
Zitat von: Frank_Huber am 12 Dezember 2017, 22:03:00
am besten NICHT in der cfg rumpinseln... dann können solche Fehler nicht passieren.
Habe das notify mit dem Webfront-End editiert.
Zitat von: NehCoy am 12 Dezember 2017, 22:09:42
Habe das notify mit dem Webfront-End editiert.
Dann hätte das mit der Leerstelle aber nicht passieren dürfen. das WebIF meckert bei sowas.
Zitat von: Frank_Huber am 12 Dezember 2017, 22:13:33
... das WebIF meckert bei sowas.
Das Web Front End hat auf jeden Fall bei falsch gesetzten Klammern und/oder Anführungszeichen gemeckert.
Beim testen hatte ich auch andere merkwürdiges Verhalten, was ich in diesem Post (https://forum.fhem.de/index.php/topic,80921.msg729811.html#msg729811) angesprochen hatte, bevor ich diesen eröffnet habe.
Zitat if($test eq "on" )
{
fhem ("set dy.test on;; define Weihnachtsbeleuchtung.Automatik.Off_Active at +00:00:20 set dy.test off")
}
Das Dummy-Gerät dy.test hat den Wert/Status
on; define Weihnachtsbeleuchtung.Automatik.Off_Active at +00:00:20 set dy.test off
Und nicht "on"!
Das "at" wird jedoch richtig angelegt, so dass nach 20 Sekunden Dummy-Gerät dy.test auf "off" gesetzt wird.
Für mich noch alles sehr komisch ...
Auch die Unterschiede (mit Klammern, oder ohne; ein Semikolon, oder zwei; Zwei FHEM-Befehle in einem Aufruf, oder zwei,...)
Grüße
NehCoy
https://fhem.de/commandref_DE.html#perl
sorry, aber aus deinen fehlerbeschreibungen werd ich echt nicht schlau.
das list vom notify biste auch noch schuldig geblieben (CoolTux scheint zumindest damit richtig geraten zu haben :) )
Möglicherweise bin ich ja ungeduldiger, als Andere - aber das hier setzt doch dem Fass die Krone auf.
Der zweimal von Experten gegebenen Tipp, das doch bitte mit einem ordentlichen Perl-Code in einer Programmdatei statt mit einer Mischung aus FHEM-Befehlen und Perl-Code in der Konfiguration zu machen, wird einfach ignoriert.
Stattdessen schreibt er dann weiter von "merkwürdigem Verhalten", und wie "komisch" das doch alles sei - aber liefert keine klaren Informationen.
Meine Güte ...
pah
Moin zusammen!
Erstmal danke, dass ihr euch dennoch bemüht mir zu helfen!
Zu euren Anmerkungen:
Also wenn man als Noob daher kommt und sich in der FHEM-Wiki umschaut, findet man zunächst erstmal Beispiele die rein auf notfiy und at fundieren.
An diesen habe ich mich eben orientiert. Weniger hilfreich ist hierbei, dass auch hier die Syntax von Bsp. zu Bsp. divergiert. FHEM-Befehl in Klammer, mal nicht.
Trennung mit Doppel-Semikolon, mal mit einem ...
Auch wenn Perl, wie ihr es darstellt, der bessere Weg ist, muss
a) at und notify prinzipiell auch funktionieren, oder nicht?
b) ich erst mal Perl programmieren können; ich wüsste gerade nicht mal ansatzweise, wie ich den Code des notify in Perl umsetzen müsste!
Zitat von: nils_ am 13 Dezember 2017, 08:10:57
https://fhem.de/commandref_DE.html#perl
Selbst in dem Kapitel zu Perl in in der Referenz steht "Wenn Sie einige Aufgaben automatisieren wollen, dann sollten Sie die Befehle at oder notify nutzen.".
Zitat von: nils_ am 13 Dezember 2017, 08:10:57
sorry, aber aus deinen fehlerbeschreibungen werd ich echt nicht schlau.
Was ist denn unklar?
Zitat von: nils_ am 13 Dezember 2017, 08:10:57
das list vom notify biste auch noch schuldig geblieben (CoolTux scheint zumindest damit richtig geraten zu haben :) )
Habe doch die Definition des "notify" erneut gepostet.
Zitat von: nils_ am 13 Dezember 2017, 08:10:57
(CoolTux scheint zumindest damit richtig geraten zu haben :) )
Was denn?
Zitat von: Prof. Dr. Peter Henning am 13 Dezember 2017, 08:30:23
Der zweimal von Experten gegebenen Tipp, das doch bitte mit einem ordentlichen Perl-Code in einer Programmdatei statt mit einer Mischung aus FHEM-Befehlen und Perl-Code in der Konfiguration zu machen, wird einfach ignoriert.
siehe a) und insbesondere b)
Zitat von: Prof. Dr. Peter Henning am 13 Dezember 2017, 08:30:23
Stattdessen schreibt er dann weiter von "merkwürdigem Verhalten", und wie "komisch" das doch alles sei - aber liefert keine klaren Informationen.
Ist es auch meines Erachtens noch immer. Wenn ein klare Syntax definiert ist, dann sollte der Code auch mit notify und at funktionieren.
Die Vielzahl von Optionen machen es da aber einem nicht leicht:
- fhem "..." (https://wiki.fhem.de/wiki/Notify#notify_Befehl)
- fhem "...;;... " (https://wiki.fhem.de/wiki/Notify#notify_Befehl_2)
- fhem ("...") (https://wiki.fhem.de/wiki/If-condition)
- fhem ("...;; ...") (https://wiki.fhem.de/wiki/If-condition)
- fhem ("... ;; ...") (https://wiki.fhem.de/wiki/Trick_der_Woche#Struktur_von_.22else_if.22_Verzweigungen)
Zitat von: nils_ am 12 Dezember 2017, 16:00:05
(auf den threadtitel will ich mal gar nicht eingehen....)
Ich ging eben von einer klaren Syntax und daher davon aus, dass jemand der schon ein paar "notify" und "at" verwendet/programmiert/angelegt hat einen Fehler sieht und sagt, du musst es nach Schema XY machen.
Danke & Grüße
NehCoy
Noch einmal:
http://wiki.selfhtml.org/wiki/Perl
LG
pah
Zitat von: NehCoy am 13 Dezember 2017, 09:44:20
Habe doch die Definition des "notify" erneut gepostet.
Deine Hausaufgaben musst schon
Du machen.
Wonach hat CoolTux gefragt (genau lesen!) ?
Eine Möglichkeit
KNX_0403019.true {
my $wohnzimmer = Value("dy.Weihnachtsbeleuchtung.Automatik.Wohnzimmer ");;
my $kueche = Value("dy.Weihnachtsbeleuchtung.Automatik.Kueche");;
my $garten = Value("dy.Weihnachtsbeleuchtung.Automatik.Garten");;
my $vorgarten = Value("dy.Weihnachtsbeleuchtung.Automatik.Vorgarten");;
if($hour > 16)
{
if($wohnzimmer eq "on" )
{
fhem "set KNX_0502000 on";
fhem "define Weihnachtsbeleuchtung.Automatik.Wohnzimmer .Off_Active at 22:00:00 set KNX_0502000 off";
}
if($kueche eq "on" )
{
fhem "set KNX_0501004 on";
fhem "define Weihnachtsbeleuchtung.Automatik.Kueche.Off_Active at 22:00:00 set KNX_0501004 off";
}
if($garten eq "on" )
{
fhem "set KNX_0502004 on";
fhem "define Weihnachtsbeleuchtung.Automatik.Garten.Off_Active at 23:00:00 set KNX_0502004 off";
}
if($vorgarten eq "on" )
{
fhem "set KNX_0503000 on";
fhem "define Weihnachtsbeleuchtung.Automatik.Vorgarten.Off_Active at 23:00:00 set KNX_0503000 off";
}
}
}
Geht auch
KNX_0403019.true {
my $wohnzimmer = Value("dy.Weihnachtsbeleuchtung.Automatik.Wohnzimmer ");;
my $kueche = Value("dy.Weihnachtsbeleuchtung.Automatik.Kueche");;
my $garten = Value("dy.Weihnachtsbeleuchtung.Automatik.Garten");;
my $vorgarten = Value("dy.Weihnachtsbeleuchtung.Automatik.Vorgarten");;
if($hour > 16)
{
if($wohnzimmer eq "on" )
{
fhem("set KNX_0502000 on");
fhem("define Weihnachtsbeleuchtung.Automatik.Wohnzimmer .Off_Active at 22:00:00 set KNX_0502000 off");
}
if($kueche eq "on" )
{
fhem("set KNX_0501004 on");
fhem("define Weihnachtsbeleuchtung.Automatik.Kueche.Off_Active at 22:00:00 set KNX_0501004 off");
}
if($garten eq "on" )
{
fhem("set KNX_0502004 on");
fhem("define Weihnachtsbeleuchtung.Automatik.Garten.Off_Active at 23:00:00 set KNX_0502004 off");
}
if($vorgarten eq "on" )
{
fhem("set KNX_0503000 on");
fhem("define Weihnachtsbeleuchtung.Automatik.Vorgarten.Off_Active at 23:00:00 set KNX_0503000 off");
}
}
}
Und noch tausend andere Möglichkeiten. In Perl kann man viel machen. Das doppelte Semikolon hingegen brauchst Du so gut wie gar nicht wenn Du über das Webfrontend arbeitest. Warum/Wann man ein doppeltes Semikolon oder @ braucht findest Du im verlinkten Text von pah.