FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: tomster am 18 April 2015, 18:06:02

Titel: DOIF und sprintf
Beitrag von: tomster am 18 April 2015, 18:06:02
Servus zusammen,

ich bin gerade schier am Verzweifeln. Ich versuche nun seit 3 Tagen eine DOIF-Definition zur Berechnung des Windchills einzurichten. Die Formel funktioniert auch prinzipiell einwandfrei. Nur erhalte ich dann einen Wert mit 10 Dezimalstellen. Also dachte ich zur Formatierung an sprintf. Allerdings scheint DOIF nicht mit sprintf zusammenarbeiten zu wollen. Ich habe inzwischen schon sämtliche Varianten zur Klammersetzung (und Tips aus Threads) durchprobiert, aber FHEM meckert immer "no right bracket".
Hat jemand einen Erleuchtungsstupser für mich?

([Wetterstation:temperature] < 5 and [Wetterstation:windSpeed] > 5) (set windchill ({(sprintf("%.1f",(13.12 + 0.6215 * [Wetterstation:temperature] -  11.37 * [Wetterstation:windSpeed]**0.16 + 0.3965 * [Wetterstation:temperature] *[Wetterstation:windSpeed]**0.16 )))})) DOELSE  (set windchill [Wetterstation:temperature])
Titel: Antw:DOIF und sprintf
Beitrag von: Puschel74 am 18 April 2015, 19:11:06
sprintf verwende ich in stateFormat und das klappt einwandfrei - da kann ich dir nicht helfen.
DOIF ist Damian und sollte unter Automatisierung gepostet werden.

Damian liest zwar auch hier mit aber
Zitat von: Wernieman am 18 April 2015, 17:46:49
Und da wir hier privat Support leisten, sollte man alles Probiern, um es für den Supporteistenden einfacher lesbar zu machen ;o)
der Satz bringt es eigentlich auf den Punkt.
Nicht nur einfacher lesbar sondern auch einfacher helfbar.

@Allgemein:
Achtet doch bitte drauf wo ihr Eure Fragen postet.
Es gibt die Forenbereiche ja nicht umsonst - sonst hätten wir ja auch bei der google-group bleiben können.
Danke.

Den Beitrag kannst du auch selbst verschieben - auch hier danke.
Titel: Antw:DOIF und sprintf
Beitrag von: tomster am 18 April 2015, 19:20:13
Sorry, war mir eigentlich sicher, dass ich in Automatisierung gepostet hatte. War wohl ned so...
Titel: Antw:DOIF und sprintf
Beitrag von: Puschel74 am 18 April 2015, 19:35:25
Zitat von: tomster am 18 April 2015, 19:20:13
Sorry, war mir eigentlich sicher, dass ich in Automatisierung gepostet hatte. War wohl ned so...
Kein Problem - kann ja mal passieren.
Ich würd ja gern helfen da ich aber DOIF nicht verwende kann ich dir beim Syntax nicht unter die Arme greifen.
Titel: Antw:DOIF und sprintf
Beitrag von: flurin am 18 April 2015, 19:37:32
Zitat von: tomster am 18 April 2015, 18:06:02
Servus zusammen,

ich bin gerade schier am Verzweifeln. Ich versuche nun seit 3 Tagen eine DOIF-Definition zur Berechnung des Windchills einzurichten. Die Formel funktioniert auch prinzipiell einwandfrei. Nur erhalte ich dann einen Wert mit 10 Dezimalstellen. Also dachte ich zur Formatierung an sprintf. Allerdings scheint DOIF nicht mit sprintf zusammenarbeiten zu wollen. Ich habe inzwischen schon sämtliche Varianten zur Klammersetzung (und Tips aus Threads) durchprobiert, aber FHEM meckert immer "no right bracket".
Hat jemand einen Erleuchtungsstupser für mich?

([Wetterstation:temperature] < 5 and [Wetterstation:windSpeed] > 5) (set windchill ({(sprintf("%.1f",(13.12 + 0.6215 * [Wetterstation:temperature] -  11.37 * [Wetterstation:windSpeed]**0.16 + 0.3965 * [Wetterstation:temperature] *[Wetterstation:windSpeed]**0.16 )))})) DOELSE  (set windchill [Wetterstation:temperature])


Versuchs mal so:


([Wetterstation:temperature] < 5 and [Wetterstation:windSpeed] > 5)
({ my $var = sprintf("%.1f",13.12 + 0.6215 * [Wetterstation:temperature] -  11.37 * [Wetterstation:windSpeed]**0.16 + 0.3965 * [Wetterstation:temperature] *[Wetterstation:windSpeed]**0.16 );;
fhem("set windchill $var")})
DOELSE  (set windchill [Wetterstation:temperature])


Gruss
flurin

Edit:

Vermutlich muss man noch [Wetterstation:temperature] mit ReadingsVal ersetzen:


ReadingsVal("Wetterstation","temperature","")


Dito für andere Readings.

=>


([Wetterstation:temperature] < 5 and [Wetterstation:windSpeed] > 5)
({ my $temp = ReadingsVal("Wetterstation","temperature","");;
my $speed = ReadingsVal("Wetterstation","windSpeed","");;
my $var = sprintf("%.1f",13.12 + 0.6215 * $temp -  11.37 * $speed**0.16 + 0.3965 * $temp *$speed**0.16 );;
fhem("set windchill $var")})
DOELSE  (set windchill [Wetterstation:temperature])
Titel: Antw:DOIF und sprintf
Beitrag von: Icinger am 18 April 2015, 19:52:29
Hmmm, mal ne blöde Frage: Wäre es in dem Fall nicht sinnvoller, das direkt im Wetterstations-Device mittels Userreading zu lösen?
Wozu brauchst da extra ein DOIF dafür?
Titel: Antw:DOIF und sprintf
Beitrag von: Puschel74 am 18 April 2015, 20:04:59
Auch ne blöde Frage: Wozu ein UserReading  ???
Direkt im Device sollte sich das doch per stateFormat lösen lassen.
Titel: Antw:DOIF und sprintf
Beitrag von: tomster am 18 April 2015, 20:30:39
Blöde Fragen hin oder her ;-) Das ist wohl wie mit den vielen Wegen, die angeblich nach Rom führen sollen...

Das Script von flurin formatiert nun nach Wunsch. Vielen Dank hierfür!
Titel: Antw:DOIF und sprintf
Beitrag von: Puschel74 am 18 April 2015, 20:37:36
Zitat von: tomster am 18 April 2015, 20:30:39
Das Script von flurin formatiert nun nach Wunsch. Vielen Dank hierfür!
Das ist die Hauptsache.
Titel: Antw:DOIF und sprintf
Beitrag von: inesa394 am 23 April 2015, 13:13:18
Ich habe das bei mir mit sprintf so gelöst aber einfach zu viele Klammern
([17:00])( (set pushbullet_xxxx message Es sind [Feuchtesensor:temperature] Grad im Garten Die durchschnittliche Temperatur im Haus beträgt {(sprintf("%.0f",([sensor_bad:temperature]+[keller_sensor:temperature] + [schlafzimmer_sensor:temperature]) /3))} Grad ) )

Wenn ich aber versuche das hier nachzubauen rechnet er mir lediglich die Summe der 3 Temperaturen das /3 ignoiert er
([17:00]) ({ my $temp1 = ReadingsVal("Feuchtesensor","temperature","");;
my $temp2 = ReadingsVal("sensor_bad","temperature","");;
my $temp3 = ReadingsVal("keller_sensor","temperature","");;
my $haus = sprintf("%.1f", $temp * $temp2 * $temp3 /3 );;
fhem("set pushbullet_xxxx message  Es sind [Feuchtesensor:temperature] Grad draußen Die Durchschnittstemperatur im Haus beträgt $haus")})

Wo liegt mein Fehler?
Titel: Antw:DOIF und sprintf
Beitrag von: flurin am 23 April 2015, 15:08:26
Zitat von: inesa394 am 23 April 2015, 13:13:18
Ich habe das bei mir mit sprintf so gelöst aber einfach zu viele Klammern
([17:00])( (set pushbullet_xxxx message Es sind [Feuchtesensor:temperature] Grad im Garten Die durchschnittliche Temperatur im Haus beträgt {(sprintf("%.0f",([sensor_bad:temperature]+[keller_sensor:temperature] + [schlafzimmer_sensor:temperature]) /3))} Grad ) )

Wenn ich aber versuche das hier nachzubauen rechnet er mir lediglich die Summe der 3 Temperaturen das /3 ignoiert er
([17:00]) ({ my $temp1 = ReadingsVal("Feuchtesensor","temperature","");;
my $temp2 = ReadingsVal("sensor_bad","temperature","");;
my $temp3 = ReadingsVal("keller_sensor","temperature","");;
my $haus = sprintf("%.1f", $temp * $temp2 * $temp3 /3 );;
fhem("set pushbullet_xxxx message  Es sind [Feuchtesensor:temperature] Grad draußen Die Durchschnittstemperatur im Haus beträgt $haus")})

Wo liegt mein Fehler?

Versuchs mal so:


my $haus = sprintf("%.1f", ($temp + $temp2 + $temp3) / 3 );;


Gruss
flurin
Titel: Antw:DOIF und sprintf
Beitrag von: inesa394 am 23 April 2015, 16:31:15
Danke so gehts   :) :)  Punkt-vor-Strich-Regel
Titel: Antw:DOIF und sprintf
Beitrag von: Damian am 24 April 2015, 21:53:49
Zitat von: inesa394 am 23 April 2015, 13:13:18
Ich habe das bei mir mit sprintf so gelöst aber einfach zu viele Klammern
([17:00])( (set pushbullet_xxxx message Es sind [Feuchtesensor:temperature] Grad im Garten Die durchschnittliche Temperatur im Haus beträgt {(sprintf("%.0f",([sensor_bad:temperature]+[keller_sensor:temperature] + [schlafzimmer_sensor:temperature]) /3))} Grad ) )

Wenn ich aber versuche das hier nachzubauen rechnet er mir lediglich die Summe der 3 Temperaturen das /3 ignoiert er
([17:00]) ({ my $temp1 = ReadingsVal("Feuchtesensor","temperature","");;
my $temp2 = ReadingsVal("sensor_bad","temperature","");;
my $temp3 = ReadingsVal("keller_sensor","temperature","");;
my $haus = sprintf("%.1f", $temp * $temp2 * $temp3 /3 );;
fhem("set pushbullet_xxxx message  Es sind [Feuchtesensor:temperature] Grad draußen Die Durchschnittstemperatur im Haus beträgt $haus")})

Wo liegt mein Fehler?

Oder mit der gleichen Anzahl von Klammern (als funktionierende Lösung), aber ein paar Zeilen kürzer:

([17:00]) ({ my $haus = sprintf("%.1f", ([Feuchtesensor:temperature]+[sensor:temperature]+[keller_sensor:temperature])/3);;
fhem("set pushbullet_xxxx message  Es sind [Feuchtesensor:temperature] Grad draußen Die Durchschnittstemperatur im Haus beträgt $haus")})


Ich sehe dennoch keinen Vorteil (wegen zwei Klammern) gegenüber der ursprünglichen funktionierenden Lösung als Einzeiler.

Gruß

Damian
Titel: Antw:DOIF und sprintf
Beitrag von: balki am 01 Juni 2015, 18:40:08
Nabend zusammen

Dann will ich mal zur allgemeinen Belustigun beitragen :-)

Fummel mir ja immer irgendwas zusammen  und irgendwann klappt  es ja  auch . Nur dadurch lernt man 
So habe das Problem das zum einen meine Gartenbeleuchtung  per Twilight  geschaltet wird  klappt verzüglich  ..

([08:00-23:00] and [myTL:twilight_weather] <50) (set Gartenlicht on) DOELSE (set Gartenlicht off)

Nun dachte ich mir  wenn ich mal nach 23:00  Uhr nach hause komme mach ich es über nen Fensterkontakt  am Gartentor  .. 

([test] eq "opened" and [myTL:twilight_weather] <50) (set Gartenlicht on) DOELSEIF ([test] ne "on")(set Gartenlicht off)

Ich denke mal das beisst sich . Brauch da mal nen wink mit dem Zaunphal.
Und nicht  du kannst die Fensterkontakte  nicht draussen betreiben .. der Sender  ist im Schrumpfschlauch und hat externe 3 V   und als Reedkontakt benutze ich welche von Schmersal

Gruss Markus
oha  denke mal falscher thread  bitte verschieben :-(