Probleme mit notify und at

Begonnen von Achim, 20 März 2014, 21:43:29

Vorheriges Thema - Nächstes Thema

Achim

Hallo,

ich bekomme die Zeile einfach nicht zum funktionieren:

define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 {fhem ("set Therme_Steuerung Value("Heizung_Hauptschalter")")}

Ich möchte beim Hochfahren von FHEM das HCS Modul (Therme_Steuerung) nach Status des "Heizung_Hauptschalter" ein/ausschalten. Der Eingang "Heizung_Hauptschalter" ist an einem Arduino über Firmata ins FHEM eingebunden. Dieser Eingang ist beim Hochfahren von FHEM nicht sofort verfügbar, deshalb die Verzögerung mit at von 40sek.

Die Fehlermeldung im LOG ist:
ZitatTherme_Steuerung_at1: syntax error at (eval 48) line 1, near ""set Therme_Steuerung Value("Heizung_Hauptschalter"

Auf der Kommandozeile von FHEM erscheint noch folgender Fehler:
ZitatBareword found where operator expected at (eval 48) line 1, near ""set Therme_Steuerung Value("Heizung_Hauptschalter"
        (Missing operator before Heizung_Hauptschalter?)
String found where operator expected at (eval 48) line 1, near "Heizung_Hauptschalter")""

Wie kann ich den STATE des Eingangs "Heizung_Heuptschalter" verwenden, um mit dessen Status HCS (Therme_Steuerung) zu setzen. Wahrscheinlich funktioniert es, wenn ich eine IF-Abfrage einbaue, da müsste ich aber zwei NOTIFYs für "on" und "off" verwenden. Aber irgendwie sollte das doch auch mit einem gehen.

Viele Grüße
Achim
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

betateilchen

define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 { my $v = Value('Heizung_Hauptschalter'); fhem ("set Therme_Steuerung $v") }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Achim

Hallo,

funktioniert leider nicht.

Wenn ich den Teil
{ my $v = Value("Heizung_Hauptschalter");; fhem ("set Therme_Steuerung $v");;}
in der Kommandozeile von FHEM eingebe, wird der Status richtig gesetzt (Ich habe noch ein paar ";" eingefügt).

Die komplette Zeile
define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 { my $v = Value("Heizung_Hauptschalter");; fhem ("set Therme_Steuerung $v");;}

bringt im Logfile folgende Fehlermeldung:
Zitat2014.03.21 20:30:58 3: Therme_Steuerung_Set1 return value: Unknown command fhem, try help.
[...]
2014.03.21 20:31:38 3: Therme_Steuerung_at1: Unknown command {, try help.

Ich probiere jetzt schon über einer Stunde verschiedene Syntax, immer andere Fehler. Ich finde einfach den Fehler nicht.

Viele Grüße
Achim
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

Damian

Zitat
Ich probiere jetzt schon über einer Stunde verschiedene Syntax, immer andere Fehler. Ich finde einfach den Fehler nicht.

Bevor du weitere Stunden probierst und herausfindest, dass du noch ein paar fehlende Semikolons einbauen musst  ;)
, probiere einfach:

define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 {fhem ("set Therme_Steuerung ".Value("Heizung_Hauptschalter"))}

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Achim

Hallo Damian,

funktioniert. Vielen Dank !!!!!

Viele Grüße
Achim
1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

betateilchen

Alles was im Ausführungsteil mehr als EIN normales set ist, gehört m.E. grundsätzlich als Funktion in die 99_myUtils und dann wird im notify nur noch die Funktion aufgerufen. Das ist sehr viel einfacher und über Anzahl von Semikolon muss man sich auch keine Gedanken machen (muss man übrigens auch nicht, wenn man nicht versucht, die fhem.cfg manuell zu bearbeiten)

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: betateilchen am 22 März 2014, 14:14:04
Das ist sehr viel einfacher und über Anzahl von Semikolon muss man sich auch keine Gedanken machen (muss man übrigens auch nicht, wenn man nicht versucht, die fhem.cfg manuell zu bearbeiten)

Das stimmt nicht.

Wenn du mit FHEM-Befehlen hantierst, musst du dir immer Gedanken über die Schachtelungstiefe machen.

In seinem Fall war er bereits in der dritten, hätte also vier Semikolons angeben müssen.

define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 { my $v = Value("Heizung_Hauptschalter");;;; fhem ("set Therme_Steuerung $v")}

Wenn du in der Myutil einen FHEM-define benutzt, der mehrere FHEM-Befehle ausführen soll, musst du genauso darauf achten, ob du ein Semikolon verdoppeln musst oder nicht.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

Zitat von: betateilchen am 22 März 2014, 15:09:13
wenn Du meinst.

Ich wäre mir nicht so sicher, wenn ich nicht schon (für die IF-Programmierung) den FHEM-Parser gedanklich zerlegt hätte.  ;)

Die fehlende Klammern-Hierarchie bei FHEM-Befehlen wie at, notify und co., wird noch sehr vielen FHEM-Usern Kopfzerbrechen bereiten.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

betateilchen

Ich sag mal so: In der 99_myUtils arbeite ich so gut wie nie mit fhem() sondern immer mit den "Original"-funktionen, die hinter den fhem Befehlen stecken. Das macht vieles sehr viel einfacher, vor allem die Klammern und Semikolon.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Achim

Hallo,

welche Lösung nun die bessere ist, kann ich wirklich nicht beurteilen. Was mich aber beschäftigt ist die Anzahl der ";" Ich bin in Perl Anfänger, aber aus meinem Verständnis aus VB heraus würde ich die eine Zeile folgendermaßen "aufschlüsseln"
define Therme_Steuerung_Set1 notify global:INITIALIZED
define Therme_Steuerung_at1 at +00:00:40 {
my $v = Value("Heizung_Hauptschalter");;;;
fhem ("set Therme_Steuerung $v")
}

Wieso kann Perl den fhem-Befehl nicht richtig zuordnen, die "{}" Klammern sind doch vorhanden. Ich dachte die "{}" klammern die beiden Zeilen zusammen als "einzelnen" Befehl für "AT". Ich habe gerade auch mal das Buch "Einführung in Perl" durchgeblättert, dort habe ich nichts von mehreren ";" gefunden. Auch bei Beispielen mit Unterverschachtelung. Ist das FHEM spezifisch?

Vielleicht kann mir (dem Unwissenden) jemand das erklären oder einen Link posten, wo ich es nachlesen kann. In der Command Referenz zu FHEM habe ich nur den Teil der zwei ";;" gefunden. Das erklärt aber leider nicht die Ebenenverschachtelung.

Viele Grüße
Achim

1x RPi V1, COC, 6x FHT, 1x S300TH, 2x DS18B20, 1x KS300
1x Arduino Nano mit Firmata, 2x DS2423old, 4x DS18B20, HIH5030, verschiedene Ein/Ausgangsschaltungen am Arduino
Mysensors-Seriell Gateway, Si7021, BH1750, Relais

Damian

#11
Zitat von: Achim am 24 März 2014, 22:53:55
Hallo,

welche Lösung nun die bessere ist, kann ich wirklich nicht beurteilen. Was mich aber beschäftigt ist die Anzahl der ";" Ich bin in Perl Anfänger, aber aus meinem Verständnis aus VB heraus würde ich die eine Zeile folgendermaßen "aufschlüsseln"
define Therme_Steuerung_Set1 notify global:INITIALIZED
define Therme_Steuerung_at1 at +00:00:40 {
my $v = Value("Heizung_Hauptschalter");;;;
fhem ("set Therme_Steuerung $v")
}

Du wirst nicht der einzige FHEM-User sein, der Probleme damit hat.

Wie ich schon geschrieben habe, kennt der FHEM-Parser leider! keine Klammernhierarchie, er scannt einfach bis zum nächsten einzelnen Semikolon, welches ein Trennzeichen zwischen den FHEM-Befehlen ist, und führt sie nacheinander aus, es sei denn das Semikolon wird durch ein zweites maskierter, dann lässt er die Kommandos zusammen und halbiert die Anzahl für das nächste Kommandoebene. Und nun zum Beispiel.
Hättest du ein Semikolon oben angegeben, dann würde er ausführen wollen:

define Therme_Steuerung_Set1 notify global:INITIALIZED define Therme_Steuerung_at1 at +00:00:40 {my $v = Value("Heizung_Hauptschalter")

und sofort danach
fhem ("set Therme_Steuerung $v")}

das würde also nicht funktionieren.

Nun das obige Bespiel mit zwei! Semikolons jetzt lässt der FHEM-Parser die Kommandos zusammen und halbiert die Anzahl für das nächste Kommando (es bleibt dann eins),
damit gelingt die Definition des Notifys und es steht dann in der DEF-Zeile von at:
+00:00:40 {my $v = Value("Heizung_Hauptschalter");fhem ("set Therme_Steuerung $v")}

soweit so gut. 40-Sekunden später ist der FHEM-Parser wieder damit beschäftig deinen at-Befehl auszuführen, diesmal führt er aus:
{my $v = Value("Heizung_Hauptschalter") und sofort danach
fhem ("set Therme_Steuerung $v")}

und auch das wird wieder scheitern. So und jetzt kannst du dir schon denken, warum man ganz am Anfang vier! Semikolons angeben muss, damit am Ende bis zum Perl-Parser ankommt:

my $v = Value("Heizung_Hauptschalter");fhem ("set Therme_Steuerung $v")

Jetzt rate mal wie viele Semikolons du am Anfang angeben müsstest, wenn du eine weitere Ebene tiefer gehen wolltest.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF