Fragen zu lambda-script

Begonnen von dieter56, 12 Juni 2019, 11:56:58

Vorheriges Thema - Nächstes Thema

rhabarber

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

dieter56

#16
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
Wilhelm II (deutscher Kaiser): "Ich glaube an das Pferd. Das Automobil ist eine vorübergehende Erscheinung." Gottlieb Daimler (Autoerfinder): "Die weltweite Nachfrage nach Kraftfahrzeugen wird eine Million nicht überschreiten – allein schon aus Mangel an verfügbaren Chauffeuren."

dieter56

#17
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
Wilhelm II (deutscher Kaiser): "Ich glaube an das Pferd. Das Automobil ist eine vorübergehende Erscheinung." Gottlieb Daimler (Autoerfinder): "Die weltweite Nachfrage nach Kraftfahrzeugen wird eine Million nicht überschreiten – allein schon aus Mangel an verfügbaren Chauffeuren."

rhabarber

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

rhabarber

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.

dieter56

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
Wilhelm II (deutscher Kaiser): "Ich glaube an das Pferd. Das Automobil ist eine vorübergehende Erscheinung." Gottlieb Daimler (Autoerfinder): "Die weltweite Nachfrage nach Kraftfahrzeugen wird eine Million nicht überschreiten – allein schon aus Mangel an verfügbaren Chauffeuren."

rhabarber

#21
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 !

dieter56

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 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
Wilhelm II (deutscher Kaiser): "Ich glaube an das Pferd. Das Automobil ist eine vorübergehende Erscheinung." Gottlieb Daimler (Autoerfinder): "Die weltweite Nachfrage nach Kraftfahrzeugen wird eine Million nicht überschreiten – allein schon aus Mangel an verfügbaren Chauffeuren."

rhabarber

#23
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};
};

rhabarber

.... hat sich von selbst abgeschickt :)
Was geht da nicht ?
Danke, fG ! R.