wie runden in einem "at" / "set"

Begonnen von Norbert.Roller, 17 Februar 2020, 20:09:15

Vorheriges Thema - Nächstes Thema

Norbert.Roller

Hi,
ich habe schon alle möglichen Varianten (Int, Round, alle Sorten Klammern) durch, aber komme nicht dahinter wie es geht.

Der wichtige Teil ist fett:

define CheckZisterne at +*00:05 {fhem("set Zisterne.24V on-for-timer 60");; fhem("sleep 50;; get Zisterne.mV;; set Zisterne.Volumen {(31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000)}")}

das funktionierte alles nicht:
set Zisterne.Volumen {round((31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000),1)}")}
set Zisterne.Volumen {int (31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000)}")}

in allen Fällen erscheint die Formel im "Zisterne.Volumen" und nicht der Wert.

Vielen Dank vorab.

Otto123

#1
Hi,

innerhalb von set geht set magic - siehe auch Doku.

Bei set magic geht so etwas [device:reading] oder Perl {}
In Perl geht sowas nicht [device:reading] - da musst Du Perl Funktionen nehmen ReadingsVal("Device","Reading","Default")
Wenn Du im set mit Perl arbeiten willst, musst Du es zusätzlich klammern -> set Device {(Perlausdruck)}

Du nimmst aber nur Perl, also musst Du alles einheitlich mit Perlfunktionen und mit ReadingsVal arbeiten.

Deine Konstrukt stirbt also schon vor dem Runden :)

sowas geht, aber meines Wissens nicht mit int (hab ich aber nie probiert)
set Zisterne.Volumen {(31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000)}
das geht sicher nur so (nicht getestet)
set Zisterne.Volumen {(int(31416*99*99*ReadingsNum("Zisterne.mV","state",99)/ReadingsNum("Zisterne_Faktor","state",99)/1000))}

Wenn das funktioniert brauchst Du auch nicht komplett in Perl zu arbeiten, aber meist ist das besser/übersichtlicher!

define CheckZisterne at +*00:05 set Zisterne.24V on-for-timer 60;;sleep 50;; get Zisterne.mV;; set {(int(31416*99*99*ReadingsNum("Zisterne.mV","state",99)/ReadingsNum("Zisterne_Faktor","state",99)/1000))}Das get verwirrt mich, das wird nicht sinnvoll sein.

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

Damian

Zitatset Zisterne.Volumen {(round((31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000),1))}

sollte klappen auch innerhalb von fhem().
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Wieder was gelernt :)
Aber genau genommen kann man sogar noch ein Klammerpaar sparen :) der Arithmetische Ausdruck an sich muss nicht nochmal komplett geklammert werden.
set Zisterne.Volumen {(round(31416*99*99*[Zisterne.mV:state]/[Zisterne_Faktor:state]/1000,1))}

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

herrmannj

Zitat von: Damian am 17 Februar 2020, 21:37:23
sollte klappen auch innerhalb von fhem().
Round ist nicht im Core. Besser int oder sprintf

Norbert.Roller

Zitat von: Damian am 17 Februar 2020, 21:37:23
sollte klappen auch innerhalb von fhem().

Vielen Dank. Genau so - rote Klammern einfügen - hat es funktioniert.