FHEM Forum

FHEM => Automatisierung => Thema gestartet von: dieter56 am 12 Juni 2019, 11:56:58

Titel: Fragen zu lambda-script
Beitrag von: dieter56 am 12 Juni 2019, 11:56:58
Zitat

Die Nachricht, die an dich gesendet wurde:

Hallo Dieter,

das mit dem setReading habe ich gefunden: habe leichtsinnigerweise ein Test-Lambda-Script 'setReading' genannt: das hat lambda-script dann als fhem-device eingelesen ...

den Rest probier ich jetzt erst mal aus.

Soll ich den Schriftwechsel lieber im Forum führen, kenne mich leider mit den Gepflogenheiten überhaupt nicht aus.

Freundliche Grüße !
Reiner

Hallo Reiner,

Danke für deine Rückmeldung.
Das Kommando setReading funktioniert auch dann, wenn ein Device setReading existiert. Du musst nur vor setReading ein Hochkomma setzen.

'setReading temperature 12 door "closed";

Dadurch wird die Auswertung des Symbols verhindert.
Ich habe noch einen entsprechenden Hinweis in die Sprachbeschreibung eingefügt.
http://lambda-script.org/handbuch.php#3.1

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 12 Juni 2019, 18:37:58
Hallo Dieter,

schon wieder eine Frage:

warum funktioniert:   x := x + 1;    problemlos,

aber nicht:

x := 0;

always {
x := x + 1;
setReading xzahl x;
wait 0,10;
};

Fehlermeldung: Funktion nicht definiert: x + 'number';



noch ein Problem, ich kopiere das script:

   
__________________________
always {
   wait 00:01;     #zum Testen :)
   case [08:00 12:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud09]'toNumber / 100};
   case [12:00 15:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud12]'toNumber / 100};
   case [15:00 18:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud15]'toNumber / 100};
   case [18:00 20:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud18]'toNumber / 100};
   setReading akt faktor;
};
_________________________

Fehlermeldung: Funktion nicht definiert: setReading akt faktor;


was muss ich tun, damit das geht ?

Danke und Grüße ! Reiner
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 12 Juni 2019, 20:44:12
habe es jetzt doch noch rausgefunden, wer lesen kann ist klar im Vorteil:

es benötigt für jede Art von Rechnung oder Zuweisung eine Art Schablone (Funktion):

die Schablone kann auch so was einfaches sein wie x := 1  ...  oder ich muss die vorher auf diese Art definierte Variable mit in die Schleif reingeben:  always x {
...
setReading dingsda x;
}

damit funktioniert es jetzt jedenfall :)
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 13 Juni 2019, 16:53:13
Zitatwarum funktioniert:   x := x + 1;    problemlos,

aber nicht:

x := 0;

always {
x := x + 1;
setReading xzahl x;
wait 0,10;
};

Richtig ist:

x := 0;

always [b]x[/b] {
  x := x + 1;
   setReading xzahl x;
   wait 0,10;
}

oder wenn kein weiter Code folgt geht auch:

x := 0;
repeat  {
  x := x + 1;
   setReading xzahl x;
   wait 0,10;
}
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 13 Juni 2019, 17:00:04
Zitatnoch ein Problem, ich kopiere das script:

   
__________________________
always {
   wait 00:01;     #zum Testen :)
   case [08:00 12:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud09]'toNumber / 100};
   case [12:00 15:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud12]'toNumber / 100};
   case [15:00 18:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud15]'toNumber / 100};
   case [18:00 20:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud18]'toNumber / 100};
   setReading akt faktor;
};
_________________________

Fehlermeldung: Funktion nicht definiert: setReading akt faktor;

faktor ist nur innerhalb der Blöcke {...} definiert. So müßte es gehen:

faktor := 0;
always faktor {
   wait 00:01;
   case [08:00 12:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud09]'toNumber / 100};
   case [12:00 15:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud12]'toNumber / 100};
   case [15:00 18:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud15]'toNumber / 100};
   case [18:00 20:00] {
      faktor := 0.5 + [ProplaWetter fc0_cloud18]'toNumber / 100};
   setReading akt faktor;
};
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 14 Juni 2019, 18:13:59
danke !

was ich noch nicht verstehe: anscheinend kann ich ja Funktionsdefinitionen irgendwo hinschreiben und ggf. in einen Block oder eine Subfunktion übergeben;

an welcher Stelle geht das _nicht _? Sonst wäre ja die Fehlermeldung: Funktion nicht definiert nicht möglich. Also, mir ist nicht klar, an welcher Stelle ich Funktionen definieren 'darf' und wo nicht.

Sind case-Blocks auch eigene Gültigkeitsbereiche ? Wie übergebe ich Variablen an case-Blocks ?

kann man > 1 Variable an einen Block geben ? space, komma, semicolon ?
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 15 Juni 2019, 10:19:53
Hallo,

Ich bin begeistert davon, wie du dich reinhängst.

Funktionen müssen vor ihrer Verwendung definiert werden.
Beispiel: Ein Funktion summiert die Quadrate der beiden Parameter (number). Der Aufruf soll so sein:
z := qrt 2 5;
z soll dann den Wert 2 *2 + 5*5 = 29 haben.

'(qrt number'a number'b) {a a + b b};

z := qrt 2 5;
log z;

siehe auch hier: http://lambda-script.org/handbuch.php#6.2


Funktionen, Variable und Klassen gelten in dem Block in dem sie definiert sind und allen Blöcken die in diesem enthalten sind.
D.h.: Eine Variable, die außerhalb des case-Kommandos definiert wurde gilt auch in den Blöcken die Bestandteil des Kommandos case sind.

Eine Außnahme bilden threads. (always erzeugt einen Thread)
Innerhalb eines Threads kann nur auf externe Variable zugegriffen werden, wenn diese explizit übergeben wurden.
Vorher definierte Klassen und Funktionen sind immer (auch in threads) erreichbar.

siehe auch hier: http://lambda-script.org/handbuch.php#5.4

Ich hoffe, ich konnte ein wenig helfen.
Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 16 Juni 2019, 15:47:51
ja danke, das hilft schon mal weiter. Bin erst mal dazu übergegangen, Dinge in einzelne threads zu schreiben, da braucht man dann eher nicht so viele Variable ...

was neues:
Beim Überprüfen eines Zeitwechsels, zB Monats- oder Jahresende:

funktioniert:

uhrzeit := 22:11;
setReading richtig (uhrzeit = 22:11);


die beiden funktionieren nicht:

uhrzeit := 22:22;
setReading richtig (uhrzeit > 11:11);

oder:

z := now - year;
#setReading zeit z;
setReading richtig (z > 164/0);

Funktion nicht definiert

gleich funktioniert, die anderen nicht. Was ist zu tun ?
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 16 Juni 2019, 16:12:21
Hallo,

22:22 und 11:11 etc. sind ein Werte vom Datentyp timespan. Diese Datentypen lassen sich nicht miteinander vergleichen(siehe dazu: http://lambda-script.org/handbuch.php#6.3.4)

Um zu testen, ob die aktuelle Uhrzeit in einem bestimmten Intervall liegt kannst du z.B. [6:00 13:00] oder so ähnlich beutzen (siehe http://lambda-script.org/handbuch.php#6.3.5)

Oder willst du etwas anderes Vergleichen? Dann beschreib mal dein Problem genau.

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 17 Juni 2019, 17:57:01
Hallo Dieter,
das hat auch schon mal weiter geholfen. Kann jetzt so ziemlich schreiben was ich will, auch wenn vielleicht ein großer Teil der Möglichkeiten bisher ungenutzt bleibt.

Weil mir bestimmte Dinge zunächst Probleme gemacht und die einfache Nutzung der script-Sprache erschwert haben, hier folgende Fragen:

sind 2 Typen string erforderlich ?
sind 2 Typen Zeit erforderlich, wäre es nicht möglich, moment als timespan mit Dauer eine Sekunde zu definieren ?
könnte man dem Compiler beibringen, die runden Klammern bis zu den jeweiligen Grundfunktionen 'selbst' zu setzen ?

Grüße, Reiner.
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 17 Juni 2019, 18:36:10
Hallo,

Zitatsind 2 Typen string erforderlich ?
Es gibt nur einen Typ string. Der steht für jede beliebige Zeichenkette. Diese Zeichenketten können jedes Zeichen (auch Leerzeichen, Zeilenumbrüche, usw. - auch ganze Texte) enthalten.
Manchmal, z.B. bei Indizes einer collection sind nur Zeichenketten die keine Leerzeichen enthalten zulässig. (z.B. Namen von readings oder Namen von Devices). Deshalb wurde eine Unterklasse word eingeführt. Jeder Wert von Typ word ist auch ein string. Man kann einer Variablen von Typ string auch einen Wert von Typ word zuweisen. Der wird automatisch konvertiert. (siehe http://lambda-script.org/handbuch.php#4.2) Eigentlich dürften so beim praktische Programmieren kaum Probleme auftreten. Wenn doch, kannst du mir mal ein konkretes Beispiel schicken.

Zitatsind 2 Typen Zeit erforderlich, wäre es nicht möglich, moment als timespan mit Dauer eine Sekunde zu definieren ?
moment und timespan sind völlig verschiedene Dinge:

moment: Die Klasse moment repräsentiert Objekte, die einen bestimmten Zeitpunkt definieren. (siehe http://lambda-script.org/handbuch.php#4.1.6) Konkrete Zeitpunkte sind: Der Beginn und das Ende eines Fußballspiels, oder der Moment in dem der erste Mensch den Mond betreten hat.

timespan: Die Klasse timespan repräsentiert Objekte, die eine bestimmte Zeitspanne beschreiben. Eine Zeitspanne ist die Differenz zwischen zwei Objekten von Typ moment. So ist die aktuelle Uhrzeit ein timespan und genau die Zeitspanne vom Beginn des heutigen Tages bis jetzt. (siehe auch: http://lambda-script.org/handbuch.php#4.1.7) Konkrete Zeitspannen sind: 90 Minuten Spieldauer, oder die Zeit die man braucht, um von der Erde bis zum Mond zu fliegen.

Zitatkönnte man dem Compiler beibringen, die runden Klammern bis zu den jeweiligen Grundfunktionen 'selbst' zu setzen ?
Hier weiß ich nicht genau was du meinst.
Der zentrale Begriff bei der Programmierung in lambda-script ist "Kommando". Ein Kommando ist eine Folge von Symbolen und Werten und eventuell Blöcken. Es beginnt mit dem ersten Zeichen und endet mit einem Semikolon.
Manchmal ist ein Wert auch wieder ein berechneter Ausdruck. Dann wird das Kommando, das diese Berechnung ausführt, in runde Klammern eingeschlossen an die Stelle des Wertes geschrieben. (siehe http://lambda-script.org/handbuch.php#3.6) Diese Klammern muss man schon selbst setzten. Auch der Rechner weiß nicht, was du berechnen möchtest.
1 + (3 + 3) * 7; ist etwas anderes als 1 + (3 + 3 * 7);
Ich gebe dir Recht, wenn du beklagst, das der Editor der in FHEM eingebaut ist, keine IDE für lambda-script darstellt. So etwas wie Typkontrolle während des Schreibens und Autovervollständigung wären schon praktisch. Auch ein Debugger wäre toll. Das ist das Nächste was ich, wenn lambda-script 1.1 fertig ist, angehe.

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 17 Juni 2019, 19:40:58
danke !!

dann hier meine (vorerst) letzte Frage:
könntest Du einrichten, dass die device-Liste bei Änderung von vorhanden devices neu eingelesen wird ? Es dauert bei mir immer mal ne Weile, bis ich merke, das lambda-script zB neu hinzugefügte devices noch nicht kennt.

Jedenfalls verstehe ich mehr, wenn ich meine Fragen stellen kann und Du die so geduldig beantwortest :)

... und das mit der IDE wäre natürlich genial
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 17 Juni 2019, 19:57:24
Hallo,

das automatische Einlesen von neuen Devices steht schon auf meiner ToDo-Liste. Wenn ich es fertig habe schreibe ich es hier.

Ich freue mich über Fragen. Dann weiß ich wenigstens was ich im Handbuch noch besser erklären muss.

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 18 Juni 2019, 10:04:35
:) dann hier gleich die nächsten:

wie überprüfe ich auf Monatswechsel, also 1. eines jeden Monats um 0:10 - 0:23,
habe (wahrscheinlich fast) jede Kombination von x/x/x:yy,zz durch,

außer bei: setReading richtig [xx:zz  yy:zz]        mit true wenn now dazwischen liegt

kommt bei:  setReading richtig [x/x/x:xx,zz  x/x/x:yy,zz]      in jeder Kombination false raus.

Beispiel tasmota-Verbrauchszähler:
always {
   setReading Gerade [WZ  ENERGY_CURRENT];
   setReading Heute [WZ  ENERGY_Today];
   setReading Gestern [WZ  ENERGY_Yesterday];
   case [0:0 0:20] {
      setReading MonatkWh ([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Monat€ (([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);
      setReading JahrkWh ([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Jahr€ (([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);
      };
   setReading Insgesamt [WZ  ENERGY_Total];
   >>>>>>>>>case [1/0:00 1/0:20] {setReading Monat " "};
   >>>>>>>>>case [1/1/0:00 1/1/0:20] {setReading Jahr " "};
   wait 0:15;
};
an der markierten Stelle hätte ich gerne dass der jeweilige Zähler zurückgesetzt wird. Wenn ich das entsprechend mit der aktuellen Zeit versuche, funktioniert das nicht.



apropos Handbuch: jedes weitere Beispiel ist eine echte zusätzliche Hilfe !


und:


gibt es eine Möglichkeit, bei einer Funktion mit mehr als 1 Parameter einen Rückgabewert, zB string, zu bekommen ?

Danke und Gruß !
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 19 Juni 2019, 12:03:39
Hallo,

Zitatalways {
   setReading Gerade [WZ  ENERGY_CURRENT];
   setReading Heute [WZ  ENERGY_Today];
   setReading Gestern [WZ  ENERGY_Yesterday];
   case [0:0 0:20] {
      setReading MonatkWh ([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Monat€ (([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);
      setReading JahrkWh ([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Jahr€ (([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);
      };
   setReading Insgesamt [WZ  ENERGY_Total];
   >>>>>>>>>case [1/0:00 1/0:20] {setReading Monat " "};
   >>>>>>>>>case [1/1/0:00 1/1/0:20] {setReading Jahr " "};
   wait 0:15;
}

Ich verstehe die Problematik so: Du hast Reading, die periodisch aktualisiert werden soll. - manche all 15 Minuten (kleinstes Intervall), manche mit dem Start eines neuen Tages und andere mit Beginn eines neuen Monats ...
Ich würde das so lösen:


always {
   # Aktualisierung der 15Min Readings
   setReading
      r1 wert1
      r2 wert2
      ....
   ;
   wait 15,0;
};

# Starten eines weiteren Threads der die tägliche Arbeit verrichtet, Wartet bis 0:00 Uhr des nächsten Tages
always {
   wait tomorrow;
   setReading
      r1 wert1
      r2 wert2
      ....
   ;
   ....
}

# Starten eines weiteren Threads der die monatliche Arbeit verrichtet, Wartet bis 0:00 Uhr des nächsten Montasersten
always {
   wait (month + 1/0/0);
   setReading
      r1 wert1
      r2 wert2
      ....
   ;
   ...
}


Zitatkommt bei:  setReading richtig [x/x/x:xx,zz  x/x/x:yy,zz]      in jeder Kombination false raus.
Das Kommand [xx:yy xx:yy] funktioniert nur mit Uhrzeiten. Das ist so gewollt. Ich werde im Handbuch noch einen Hinweis aufnehmen.

Zitatgibt es eine Möglichkeit, bei einer Funktion mit mehr als 1 Parameter einen Rückgabewert, zB string, zu bekommen ?
Selbstverständlich geht das. Schildere dein Problem genauer und ich helfe gern.

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 19 Juni 2019, 17:30:50
Hallo,

ja, das ist eine gute Lösung.

Funktion mit mehreren Parametern und Rückgabe:

      setReading MonatkWh ([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Monat€ (([StromkostenWZ  MonatkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);
      setReading JahrkWh ([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber);
      setReading Jahr€ (([StromkostenWZ  JahrkWh]'toNumber + [StromkostenWZ  Gestern]'toNumber) * [EurkWh]);

     die string-Bastelei würde ich gerne von einer Funktion erledigen lassen, die ich an mehreren Stellen benutzen könnte.

habe versucht, einen leeren string mitzugeben, der hat sich aber bei der Rückgabe totgestellt

also verkürzt etwa so:

'(string'str1 string'str2 ergebnisstr StringBasteln) {
ergebnisstr := str1 str2;
};

Aufruf:
[fhemDx infostrA] [fhemDx infostrB] leererString StringBasteln;

leererString ist auch bei der Rückgabe leer.

so hatte ich das versucht.

Grüße !  Reiner
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 19 Juni 2019, 18:28:26
Hallo Reiner,

Zitat
'(string'str1 string'str2 ergebnisstr StringBasteln) {
ergebnisstr := str1 str2;
};

Aufruf:
[fhemDx infostrA] [fhemDx infostrB] leererString StringBasteln;

Vom Prinzip schon richtig! Aber,
  1. Den ergebnisstr musst du nicht als Parameter übergeben.
  2. Der Rückgabewert ist das Ergebnis der letzten Operation. Bei dir str1 str2;

Damit wäre die Funktion richtig definiert mit:

'(string'str1 string'str2 StringBasteln) {str1 str2};

ergebnisstr := "string1" "string2" StringBasteln;



Damit hast du eine Funktion definiert, die zwei Strings zusammenfügt. Diese Funktion gibt es aber schon. (Einfach die beiden Strings hintereinander schreiben.)

ergebnisstr := "strting1" "string2";

liefert dasselbe. Du willst etwas anderes: Du möchtest zwei readings lesen, in Zahlen umwandeln, etwas berechnen und das Ergebnis dem ersten Reading wieder zuweisen. Eine Funktion die das macht, wäre:


'(word'read1 plus word'read2 * number'faktor) {
   sum := (((StromkostenWZ'readings read1) val) toNumber);
   val := (((StromkostenWZ'readings read2) val) toNumber);
   sum := sum + val * faktor';
   setReading read1 sum;
};

#Aufrufe wären dann so
"MonatkWh" plus "Gestern" * 1;
"Monat€" plus "Gestern" * [EurkWh]'toNumber;


Das Sternchen in der Definition der Funktion und im Aufruf könnte man weglassen. Aber man sieht dann besser was gemacht wird.
Ich hab's nicht getestet. Aber im Prinzip müsste es so gehen.

Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 20 Juni 2019, 07:42:18
Hallo,

Seit der letzten Version (1.010 vom 19.06.2019 20:01:08) gibt es in jedem Script ein Variable "my". Sie enthält das zum Script gehörende fhemDevice.
So lässt sich das Auslesen der eigenen Readings unabhängig vom Namen des Scriptes realisieren.
Für obiges Beispiel wäre das so:


'(word'read1 plus word'read2 * number'faktor) {
   reads := my readings;
   sum := (reads read1) val;
   val := (reads read2) val;
   setReading read1 (sum'toNumber + val'toNumber * faktor);
};


Gruß
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 21 Juni 2019, 17:10:25
Hallo Dieter, falls ich mich nicht irre, ist die lambda.pm, die man von der Seite lambda-script.org bekommt, Version 1.007, die my-Funktion geht damit noch nicht ?
Grüße ! Reiner
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 31 Oktober 2019, 20:56:18
Hallo Dieter,
bei der Verwendung einer Kopie von

'(fhemDevice'Lampe1 -> fhemDevice'Lampe2) {
   always {
      wait [Lampe1];
      case ([Lampe1] ~ /on/)
         {case ([Lampe2] !~ /on/) {set Lampe2 on}}
         {case ([Lampe2] !~ /off/) {set Lampe2 off}}
   }
};

'(fhemDevice'Lampe1 <-> fhemDevice'Lampe2) {
   Lampe1 -> Lampe2; Lampe2 -> Lampe1
};

fhd1 -> fhd2;
fhd3 <-> fhd4;

kommt seit 1.100 die Fehlermeldung:

Funktion nicht definiert: 'list 'block;

bei 1.017 tritt das nicht auf, wie krieg ich das weg ?

Grüße, Reiner.
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 05 November 2019, 11:08:19
Hallo,

und ich bitte um Entschuldigung für meine späte Antwort.
(Urlaub mache ich immer ohne PC.)

Das System ist noch in der Entwicklung und ich muss immer mal wieder kleine Änderungen in der Syntax vornehmen.

Die Definition einer Funktion lautet jetzt:

'(list) := {block};

D.h.: Die Zeile
'(fhemDevice'Lampe1 -> fhemDevice'Lampe2) {

muss jetzt

'(fhemDevice'Lampe1 -> fhemDevice'Lampe2) := {

lauten.

Bitte verwende die Version 1.103. (Hier sind einige Bugs beseitigt.)

Beste Grüße
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 04 Dezember 2019, 21:43:50
Hallo Dieter,
habe seit einigen Versionen Schwierigkeiten damit, dass wait nur sporadisch auf fhemdevices reagiert, also das Programm bei Eintritt des Ereignisses nicht fortsetzt. Ist unabhängig davon ob ich auf das device warte oder auf den String.

Bin schon mehrmals nach 1.017 zurückgekehrt, würde aber gerne die neueren Sachen auch ausprobieren ..

Vielleicht gibt es eine Erklärung. In jedem Fall vielen Dank für die viele Arbeit, die Du darein steckst !

Gruß, Reiner.

PS: Mir ist die Verwendung von wait mit devices noch nicht so klar. Wovon hängt ab, ob das auf das device, den state-string oder ein Reading wartet, um zu 'feuern'.
Wäre es denkbar, eine wait auf mehrere devices warten zu lassen, bisher wohl auf eine Zeit und ein device.
Danke !
Titel: Antw:Fragen zu lambda-script
Beitrag von: dieter56 am 12 Dezember 2019, 12:07:53
Hallo rhabarber,

irgendwie bekomme ich keine Nachricht wenn mir jemand im Forum schreibt. Ich habe ein eMail (info@lambda-script.org) hinterlegt aber bei mir kommt nichts an. Zufällig bin ich auf deine Anfrage gestoßen. Du kannst mir auch direkt an die Mailadresse schreiben.

Zu deiner Anfrage:
Aktuell ist die Version 1.112.

Die Funktion verschiedener Varianten des Befehls wait ist hier http://www.lambda-script.org/handbuch.php#wait-Wartekommandos (http://www.lambda-script.org/handbuch.php#wait-Wartekommandos) beschrieben.

Zu deiner Frage ob auf Device oder String gewartet wird:

Nehmen wir an, dein Device ist ein Thermostat und heisst WZ_TH.

Das Kommando "wait WZ_TH" wird beendet, wenn sich irgendein Reading des Thermostats ändert, denn, ändert sich ein Reading ändert sich der Zustand des Devices.

Das Kommando "wait [WZ_TH]" wird beendet, wenn sich das Reading state des Thermostats ändert, denn [WZ_TH] gibt das Reading state zurück.

Das Kommando "wait [WZ_TH readingname]" wird beendet, wenn sich das Reading mit Namen readingname des Thermostats ändert. Z.B.: wartet "wait [WZ_TH measured_temp]" darauf, dass sich die gemessene Temperatur ändert.

Wie du der oben beschriebenen Anleitung entnehmen kannst, kannst du beliebig viele Objekte in einen wait-Befehl aufnehmen. Der wait-Befehl wird beendet, wenn sich ein Objekt ändert bzw. die Zeit (falls angegeben) abgelaufen ist.

Beste Grüße
Dieter
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 02 Mai 2020, 14:46:31
Hallo Dieter,
bei mir war die letzte stabile Version 1113, mit späteren ist fhem nicht gestartet.
Jetzt habe ich 1118, startet, aber die Scripte starten nicht: Fehlermeldung: Unzulässige Einheit: ...
Was hat sich da geändert ?

Hier Beispiel:
always {
   wait 5,0 [LueftungPlus];
   if ([LueftungPlus]  ~ /on/) {
      set LueftungStD on;
      setReading Zustand [LueftungStD] start now;
      wait [LueftungPlus] [LueftungMinuten]'toNumber'minutes;
      set LueftungPlus off;
      setReading Zustand [LueftungStD] start "auto";
   };
};   

always {   
   wait 5,0;
      if (([LueftungPlus]  !~ /on/)) {
         if (([netatmo_M03_00_00_02_7e_10 co2]'toNumber > [co2set]'toNumber) |
         ([netatmo_M03_00_00_05_97_00 co2]'toNumber > [co2set]'toNumber) |
         ([netatmo_D70_ee_50_17_d7_f8 co2]'toNumber > [co2set]'toNumber) |
         ([netatmo_M03_00_00_04_75_78 co2]'toNumber > [co2set]'toNumber)) {
         set LueftungStD on;
      }
      {   set LueftungStD off;
      };
      setReading Zustand [LueftungStD] start "auto";      
   };
   if ([LueftungStD] ~ /ON/) {setReading ZustProzent 100} {setReading ZustProzent 0};
};
Titel: Antw:Fragen zu lambda-script
Beitrag von: rhabarber am 02 Mai 2020, 14:50:12
.... hat sich von selbst abgeschickt :)
Was geht da nicht ?
Danke, fG ! R.