Autor Thema: Fragen zu lambda-script  (Gelesen 1492 mal)

Offline rhabarber

  • New Member
  • *
  • Beiträge: 13
Antw:Fragen zu lambda-script
« Antwort #15 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

Offline dieter56

  • Jr. Member
  • **
  • Beiträge: 93
    • lambda-script für FHEM
Antw:Fragen zu lambda-script
« Antwort #16 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
« Letzte Änderung: 19 Juni 2019, 19:02:36 von dieter56 »
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.”

Offline dieter56

  • Jr. Member
  • **
  • Beiträge: 93
    • lambda-script für FHEM
Antw:Fragen zu lambda-script
« Antwort #17 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
« Letzte Änderung: 20 Juni 2019, 08:07:32 von dieter56 »
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.”

Offline rhabarber

  • New Member
  • *
  • Beiträge: 13
Antw:Fragen zu lambda-script
« Antwort #18 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

Offline rhabarber

  • New Member
  • *
  • Beiträge: 13
Antw:Fragen zu lambda-script
« Antwort #19 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.

Offline dieter56

  • Jr. Member
  • **
  • Beiträge: 93
    • lambda-script für FHEM
Antw:Fragen zu lambda-script
« Antwort #20 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
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.”

Offline rhabarber

  • New Member
  • *
  • Beiträge: 13
Antw:Fragen zu lambda-script
« Antwort #21 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 !
« Letzte Änderung: 09 Dezember 2019, 18:15:17 von rhabarber »

Offline dieter56

  • Jr. Member
  • **
  • Beiträge: 93
    • lambda-script für FHEM
Antw:Fragen zu lambda-script
« Antwort #22 am: Gestern um 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 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.”

 

decade-submarginal