Nachkommastellen von FHT?

Hallo liebe Designer,

ich habe eben im Forum nach Lösungen für Rundung etc. gesucht und teilweise auch fündig geworden. Grund war, daß meine FHT-Temp.anzeige im Designer ZWEI Stellen nach dem Komma hat.
Jetzt habe ich festgestellt, daß die Variable in IPS eigentlich nur EINE Nachkommastelle hat. Also das was ich brauche. Wieso habe ich in meinem Designer-Feld denn ZWEI Stellen???
Ein weiteres Problem ergibt sich vielleicht auch noch: Bei geraden Werten (also z.B. 21,0) habe ich gar keine Nachkommastellen- also z.B. nur 21.
Ich brauche also wohl ein Script, welche ALLE FHT-Variablen in Fix-Kommastellen umwandelt.

$roundedFloat = round($bigFloat, 1)

habe ich schon gefunden, weiß aber nicht, wie ich das in ein Script gebacken bekomme (für 24 Var.) und wie und wann ich dieses Script aufrufen muß. Habe ich nach der Umwandlung dann 24 neue Variablen? (=48:eek:)
Den http://www.ip-symcon.de/forum/f28/feste-nachkommastellen-php-2594/-Beitrag habe ich auch gelesen, bekomme das aber nicht hin.

Für Vorschläge bin ich schonmal sehr dankbar, wäre aber für genaue Erklärung der Befehle noch dankbarer- wills ja irgendwann mal alleine können;)
Gruß
Ralf

Hallo Ralf,

number_format könnte da behilflich sein.

Sieht dann etwa so aus.

$Temp = number_format($Temp, 1, ".", ".");

Bei Float-Variablen, die i.d.R. 14 Stellen haben sollten, werden bei der Ausgabe als String standardmäßig alle leeren Stellen nach dem Komma nicht angezeigt.
Damit man immer passend formatierte Ausgaben in PHP hat sollte man sprintf (PHP: sprintf - Manual) benutzen.


<?
$wert1 = 123.4;

// % sagt der Funktion, dass hier eine Variable ausgegeben werden soll,
// . sagt, dass der Teil nach dem . behandelt werden soll
// 4 ist die Anzahl der Stellen nach dem Punkt
// f steht dafür, dass die Variable $wert1 für eine Fließkommazahl steht

$wert1_text = sprintf("%.4f", $wert1);

// Ausgabe: aktueller Wert: 123.4000
echo "aktueller Wert: ".$wert1_text;
?>

sprintf akzeptiert beliebig viele Variablen, die nacheinander ausgegeben werden. printf() ist echo sprintf().


<?
$wert1 = 123.4;
$wert2 = 2.34567;
$wert3 = 0.03;
$wert4 = 5;

// %.4f    : 4 Stellen nach dem Komma
// %010.3f : 0  = am Anfang, wenn erforderlich, mit Nullen auffüllen;
//           10 = zehnstellige Zahl;
//           .3 = drei Stellen nach dem Komma
// %.0f    : 0 Stellen nach dem Komma
// %02d    : zweistellige Zahl, d Steht für Dezimalzahl; nützlich bei Datumsangabe o.ä.
// Ausgabe: 1: 123.4000 - 2: 000002.346 - 3: 0 - 4: 05
printf("1: %.4f - 2: %010.3f - 3: %.0f - 4: %02d", $wert1, $wert2, $wert3, $wert4);
?>

Danke Horst und Rainer für die schnelle und ausführliche Beschreibung.
Muß leider nochmal eine grobe Verständnisfrage stellen:
Ein Beispiel - 3 Variablen:Temp1, Temp2, Ventil3. In meinem IPS-Objektbaum steht: Temp1 23°C, Temp2 21,3°C, Ventil3 66,2468%
nun möchte ich die Temp.werte mit EINER Stelle und die Vent. OHNE Stelle haben.
Fange ich jetzt an mit: $Temp1 = GetValueFloat(„Temp1“);

und dann: $Temp1 = number_format($Temp, 1, „.“, „.“); //2 Stellen

und ohne Nachkomma: $Temp3 = number_format($Temp, 1,); //0 Stellen
??

Das Script nimmt sich die Variable (Get) von FHT und schreibt sie in eine neue (formatierte) Variable? Ich muß also doch die 24 neuen Variablen anlegen?
Und das Script EINMAL ausführen? Oder bei jedem Neustart von IPS?

Sorry für die blöden Fragen aber ich arbeite immer noch am PHP/IPS-Grundprinzip.

Hallo Ralf,

und noch mal, es gibt keine blöden Fragen !

nun möchte ich die Temp.werte mit EINER Stelle und die Vent. OHNE Stelle haben.
Fange ich jetzt an mit: $Temp1 = GetValueFloat(„Temp1“);

und dann: $Temp1 = number_format($Temp, 1, „.“, „.“); //2 Stellen

und ohne Nachkomma: $Temp3 = number_format($Temp, 1,); //0 Stellen

Da Du es ja lernen willst, sieh Dir bitte noch mal meinen Link an. Zur Not teste es doch einfach mal.
Damit formatierts Du alles so wie Du es haben willst.

Das was Horst gepostet hat ist einfacher aber auch schwerer zuverstehen.

Das Script nimmt sich die Variable (Get) von FHT und schreibt sie in eine neue (formatierte) Variable? Ich muß also doch die 24 neuen Variablen anlegen?
Und das Script EINMAL ausführen?

Jedes Ausgabe, sofern sie nicht doppelt ist muss separat ausgegeben werden.

Oder bei jedem Neustart von IPS?

Triggern auf das gewünschte Ereignis.
Soll nur eine Temp aktualisiert werden nur ein Ereignis, ansonsten entsprechen mehr.

Alle Variablen müssen natürlich zur Verfügung stehen.

Ich häng mal ein Script an, welches Temp und Ventilpos auswertet.

Den Rest denk dir weg :slight_smile:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : TM_Fhts.ips.php
Trigger  : Variable Fhts true/false
Interval :
*/

require "44124.ips.php";

//Schaltzustand abfragen
$Zustand = GetValue(52706 /*[.eDIP\Fhts]*/);
$Umschaltung = GetValue(26241 /*[.eDIP\Umschaltung_S_W_H_A]*/);

//wenn Schaltzustand false, Script verlassen(beenden)
if ($Zustand == false)
return;


//Schriftart Geneva10 auf INVREPL setzen
XBee_SendText($XBee, chr(27)."ZF".chr(4));
XBee_SendText($XBee, chr(27)."ZV".chr(5));


//Aktuelle Zeit anzeigen
$Zeit = GetValueString("TIME");
XBee_SendText($XBee, chr(27)."ZL".chr(25).chr(28)."$Zeit".chr(0));
XBee_SendText($XBee, chr(27)."ZL".chr(37).chr(27)."~:~".chr(0));

if ($Umschaltung == true)
return;

//Ventilpositionen abfragen
$Ven1 = GetValueFloat("ankleide_ventil_pos");
$Ven2 = GetValueFloat("bad_ventil_pos");
$Ven3 = GetValueFloat("buero_ventil_pos");
$Ven4 = GetValueFloat("kueche_ventil_pos");

//Temperaturwerte abfragen
$Temp1 = GetValueFloat("ankleide_temp_ist");
$Temp2 = GetValueFloat("ankleide_temp_soll");
$Temp3 = GetValueFloat("bad_temp_ist");
$Temp4 = GetValueFloat("bad_temp_soll");
$Temp5 = GetValueFloat("buero_temp_ist");
$Temp6 = GetValueFloat("buero_temp_soll");
$Temp7 = GetValueFloat("kueche_temp_ist");
$Temp8 = GetValueFloat("kueche_temp_soll");

//Ventilpositionswerte formatieren und nach Display schreiben
$Ven4 = number_format($Ven4, 0, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(100).chr(40)."$Ven4".chr(0));
$Ven2 = number_format($Ven2, 0, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(100).chr(50)."$Ven2".chr(0));
$Ven1 = number_format($Ven1, 0, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(100).chr(60)."$Ven1".chr(0));
$Ven3 = number_format($Ven3, 0, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(100).chr(70)."$Ven3".chr(0));

//Temperaturwerte formatieren und nach Display schreiben
if ($Temp8 == 5.5)
{
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(40)."off".chr(0));
}
else
{
 $Temp8 = number_format($Temp8, 1, ".", ".");
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(40)."$Temp8".chr(0));
}
if ($Temp4 == 5.5)
{
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(50)."off".chr(0));
}
else
{
 $Temp4 = number_format($Temp4, 1, ".", ".");
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(50)."$Temp4".chr(0));
}
if ($Temp2 == 5.5)
{
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(60)."off".chr(0));
}
else
{
 $Temp2 = number_format($Temp2, 1, ".", ".");
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(60)."$Temp2".chr(0));
}
if ($Temp6 == 5.5)
{
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(70)."off".chr(0));
}
else
{
 $Temp6 = number_format($Temp6, 1, ".", ".");
 XBee_SendText($XBee, chr(27)."ZR".chr(210).chr(70)."$Temp6".chr(0));
}

$Temp7 = number_format($Temp7, 1, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(160).chr(40)."$Temp7".chr(0));
$Temp3 = number_format($Temp3, 1, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(160).chr(50)."$Temp3".chr(0));
$Temp1 = number_format($Temp1, 1, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(160).chr(60)."$Temp1".chr(0));
$Temp5 = number_format($Temp5, 1, ".", ".");
XBee_SendText($XBee, chr(27)."ZR".chr(160).chr(70)."$Temp5".chr(0));


//Abfrage Betriebsart
$SW = GetValue(39749 /*[.eDIP\FHTs_Sommer_Winter]*/);
if ($SW) {
XBee_SendText($XBee, chr(27)."MN".chr(11));
}
else {
XBee_SendText($XBee, chr(27)."MN".chr(12));
}

$HA = GetValue(14282 /*[.eDIP\FHTs_Hand_Auto]*/);
if ($HA) {
XBee_SendText($XBee, chr(27)."MN".chr(13));
}
else {
XBee_SendText($XBee, chr(27)."MN".chr(14));
}
 

?>

OK, ich hab ja jetzt Material g

Triggern auf das gewünschte Ereignis.
Soll nur eine Temp aktualisiert werden nur ein Ereignis, ansonsten entsprechen mehr.

Triggern heißt ein Script ausführen, oder?
Zumindest in diesem Fall - einen Wert abfragen ist auch triggern, nehme ich an?!

Das heißt,wenn ich alle Variable in einem Script verarbeite, werden diese in dem Zeitabstand aktualisiert, in dem ich das Script aufrufe? Im Falle der FHT’s (bzw. FHZ) welche i.d.R. alle paar Minuten Werte liefern, wäre ein Trigger alle 3-5 Minuten sinnvoll?

Danke RWN, langsam komme ich dahinter:)

Hallo Ralf,

Triggern heißt ein Script ausführen, oder?

Richtig, z.B. über eine Variable. z.B Variable $Temp.

Das heißt,wenn ich alle Variable in einem Script verarbeite, werden diese in dem Zeitabstand aktualisiert, in dem ich das Script aufrufe? Im Falle der FHT’s (bzw. FHZ) welche i.d.R. alle paar Minuten Werte liefern, wäre ein Trigger alle 3-5 Minuten sinnvoll?

Ansichtssache, inwiefern Du die Daten benötigst.
Getriggert wird nur, wenn die entsprechenden Variable unter Ereignisse hinzu gefügt wurde.
Dann entsprechen auf „Bei Variablenänderung“ oder " Bei Variablenaktualisierung"
und weiter, je nach Gebrauch.