DOIF mit Perl Funktionsaufruf im set

Begonnen von Waldmensch, 14 August 2019, 17:30:47

Vorheriges Thema - Nächstes Thema

Waldmensch

Ich habe eine Funktion in myUtils die mir einen text2speach text zurückgibt. Diese erwartet 2 Parameter. Einmal den Namen des Mähroboters und einen numerischen Fehlercode. Die Funktion funktioniert wie erwartet. Jetzt würde ich sie gerne in einem DOIF aufrufen, muss aber den numerischen Fehlercode aus dem Reading übergeben. Das funktioniert aber nicht, so wie ich es gemacht hab

([stadtweg.ga.mower.fixy:error > 0])
((set speak {(speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}))


Wenn ich den Funktionsteil in die Kommandozeile eingebe kommt die korrekte Ausgabe "Fixy ist gefangen" die dem gesetzten error 1 entspricht.

{(speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}

Grund für diesen Ansatz mit der Funktion ist, dass ich 2 baugleiche Mähroboter (Fixy und Foxy) habe und diese 17 Fehlercodes generieren können. Ich wollte durch die Funktion 17 DOELSEIF in 2 DOIF sparen.

TomLee

Zitat((set speak {(speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}))

Eher OT aber wozu sind die ?  Gehts sonst nicht ?


amenomade

([stadtweg.ga.mower.fixy:error > 0])
{ fhem("set speak".{(speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))})}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Waldmensch

#3
@amenomade:

Ich habe noch ein Leerzeichen hinter "set speak" eingefügt und das innere geschweifte Klammerpaar entfernt und ein rundes Klammerpaar eingespart. Wenn ich den kompletten set Teil an der Konsole starte, wird der Dummy speak gesetzt. Wenn ich allerdings den error mit setReading setze, wird das DOIF korrekt gefeuert, aber der Dummy nicht gesetzt



([stadtweg.ga.mower.fixy:error > 0])
{ fhem("set speak ". speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}


Edit: Ich glaube, ein Notify ist hier fast bessere Wahl. Folgendes funktioniert nämlich 1A

defmod FixyError notify stadtweg.ga.mower.fixy:error.* { fhem("set speak ". speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}

Otto123

Hi,

was passiert wenn Du mal den ReadingsVal testweise weglässt? Sagen wir so?


([stadtweg.ga.mower.fixy:error > 0])
{ fhem("set speak ". speakMowerError("Fixy", 3))}

Wenn das geht, würde ich den ReadingsVal vorher in eine Variable setzen.
Bisher ist das ja ein Funktionsaufruf(funktionsaufruf(funktioniaufruf)) dann wäre es eine Ebene weniger. Ist nur so eine Idee.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Waldmensch

Ich habe das ganze jetzt in ein Notify gepackt, dort funktioniert es 1A

defmod FixyError notify stadtweg.ga.mower.fixy:error.* { fhem("set speak ". speakMowerError("Fixy", ReadingsVal("stadtweg.ga.mower.fixy","error",0)))}

amenomade

Hatte übersehen
([stadtweg.ga.mower.fixy:error > 0])
Die richtige Syntax ist:
([stadtweg.ga.mower.fixy:error] > 0)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz