basierend auf diesem Posting hier versuche ich seit ein paar Tage (nicht am Stück ) hier ein geeignetes Script zu basteln. Leider führte bisher alles in die falsche Richtung.
Hintergrund: ein Ultraschallsensor misst in einer Regenwasser-Zisterne die Entfernung bis zur Wasseroberfläche. Kurze Entfernung = sehr voll; weite Entfernung = sehr leer. Nun bekomme ich aber „nur“ die Zentimeter aus dem Modul per MQTT geliefert (große Entfernung = wenig voll, kurze Entfernung = viel voll) die Logik muss also programmatisch erfolgen.
Mein Verständnis hierzu: eigentlich brauche ich zwei zusätzliche Werte, die ich als Referenz vordefinieren muss.
die Entfernung zur Wasseroberfläche bis 100% voll; also quasi kommend von Tankboden „Wasserinhalt (max.)+leerer Raum zwischen voll und untere Kante Sensor“ und
die Strecke Tankboden bis Wasseroberfläsche (max.); also die Strecke von Wasser 100%.
Dann folgt die Rückrechnung … wenn 1. mit 5 cm definiert, dann ist gemeldete Entfernung von 5 cm = 100 % voll = x Liter Regenwasser … wenn 2. mit 100 cm definiert, dann ist gemeldete Entfernung von 105 cm = 0% voll = 0 Liter Regenwasser
Hat hier jemand eine hilfreiche Idee, wie man diese Logik am besten abbildet bzw. programmiert?
vielen, lieben Dank für die schnelle Unterstützung. Leider ist das nicht das was ich gesucht habe.
Ich messe mit dem Ultraschall-Entfernungssensor die Entfernung zu Flächen. In meinem Fall die Entfernung zur Oberkante Füllstand Zisterne. Dein Script sagt, wenn 105, dann 100 % voll.
Aber es ist genau andersherum … wenn Füllstand ganz hoch (viiiel Wasser), dann kurze Entfernung, dann ganz viel Prozent voll.
Wie sieht dein Profil aus? Zum einen kannst du dort ja die Nachkommastellen einstellen. Falls die Zahlen über eine Assoziation dargestellt werden, dann musst du diese einzeln anpassen, da dann die allgemeinen Nachkommastellen nicht greifen, also beispielsweise %f.2 statt %f
Meine Variablen benutzen die standart einstllungen also für % und Liter.
In meinem Object baum wird das auch nur mit 2 nach kommastellen angezeigt nur nicht im WF.
@ wibo wo muss ich
$we_analog_1 = round(GetValue($id_analog_1), 2);
einbauen?
mein script schaut so aus
<?
$distanz = GetValue(53448 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\SR04 Distance]*/); //vom Sensor gemeldete Distanz in cm
$fuellung = GetValue(36570 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\Zisternen Visualisierung\Zisterne Prozent]*/); //Füllung in Prozent
$fuellung_liter=GetValue(19646 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\Zisternen Visualisierung\Zisterne Liter]*/ ); //Füllung in Liter
$wassertemp=GetValue(38400 ); //Wassertemperatur (temp. ein beliebig anderer Temperatursensor)
function calc_level($dist_cur) {
//diese Werte ggf. anpassen
$dist_full = 30; //Entfernung bis Unterkante Sensor in cm = 100% = voll
$dist_empty = 177; //Entfernung bis Boden Tank in cm = 0% = leer
$volumen = 5300; //Gesamtes Volumen (ggf. kaskadierte Tanks mit gleichem max. Wasserstand) des Behälters in Liter
//ab hier nichts mehr ändern
$dist_real = $dist_cur - $dist_full; //Berechnung reale Höhe Wasser
$dist_max = $dist_empty - $dist_full; //Differenz von leer/voll in cm
$perc_faktor = ($dist_empty - $dist_full) / 100; //Faktor für 1% in cm
$perc = ($dist_real > 0) ? 100 - ($dist_real / $perc_faktor) : 100; //Füllzustand in Prozent
$vol = $volumen / 100 * $perc; //Volumen in Liter
echo "dist_cur=$dist_cur, dist_real=$dist_real, dist_max=$dist_max, perc_faktor=$perc_faktor => perc=$perc, vol=$vol
";
SetValue(19646 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\Zisternen Visualisierung\Zisterne Liter]*/, $vol); //setzt Variable Füllstand in Liter
SetValue(36570 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\Zisternen Visualisierung\Zisterne Prozent]*/, $perc); //setzt Variable Füllstand in Prozent
}
calc_level($distanz);
//calc_level(5);
//calc_level(55);
//calc_level(105);
$html="
<table border='0' cellpadding='0' cellspacing='0' widht='150' frame='void'>
<tr>
<td height=186 width=150 align='center' style='background-image:url(/user/zisterneoben.gif);' valign='bottom'>
<img src='/user/wasser.gif' width='128px' height='".$fuellung*0.62."%'>
</td>
<td width=20> </td>
<td valign='top'><font size='+2'>Füllung: ".$fuellung." % = ".$fuellung_liter." Liter<br>
</tr>
<tr>
<td height=11 width=150 align='left' style='background-image:url(/user/zisterneunten.gif);'>
</tr>
</table>
";
SetValue(13351 /*[Erweiterte Funktionen\MQTT\Geräte\Zisterne Distance\Zisternen Visualisierung\Visualisierungs Variable]*/ ,$html); //baut das HTML auf
?>
Damit bekommt ihr die Ausgabe, die auch im WebFront direkt bei der Variable steht. Dann müsste man im Gegenzug nur das „%“ und „Liter“ ausm HTML rausnehmen.
round hat den Nachteil, dass es halt bei Änderungen am Profil nicht mitzieht, also du später die Nachkommastellen noch veränderst oder dergleichen.
ist das eigentlich normal, dass bei jeder Berechnung eine gelbe „Warnung“ im Log ausgespuckt wird ? Kann man das abstellen ?
Frisst sowas eigentlich perfomance wenn ich davon 2 Stück sekündlich ausführe ?
<?
$PVWatt = GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/); //vom Sensor gemeldete Distanz in cm
$PVWattProzent = GetValue(12890 /*[PHP_Module\SMA\PV Leistung in % Balken\PV Leistung %]*/); //Füllung in Prozent
function calc_level($dist_cur) {
//diese Werte ggf. anpassen
$PVWatt = GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/); //vom Sensor gemeldete Distanz in cm
$PVWattProzent = GetValue(12890 /*[PHP_Module\SMA\PV Leistung in % Balken\PV Leistung %]*/); //Füllung in Prozent
$dist_full = 6400; //Entfernung bis Unterkante Sensor in cm = 100% = voll
$dist_empty = 0; //Entfernung bis Boden Tank in cm = 0% = leer
//ab hier nichts mehr ändern
$dist_offen = $dist_full - $dist_cur; //Berechnung offene Menge Pv Leistung
$dist_max = $dist_empty - $dist_full; //Differenz von leer/voll in cm
$perc = ($PVWatt * 100)/ 6400; //Füllzustand in Prozent
echo "dist_cur=$dist_cur, dist_offen=$dist_offen, dist_max=$dist_max, perc=$perc %";
SetValue(12890 /*[PHP_Module\SMA\PV Leistung in % Balken\PV Leistung %]*/, $perc); //setzt Variable Füllstand in Prozent
}
calc_level($PVWatt);
//calc_level(5);
//calc_level(55);
//calc_level(105);
$htmlQuellCode="
<div style='border:2px solid #FFFFFF; width:600px; height:40px; margin-left:auto; margin-right:auto; margin-top:auto; margin-bottom:auto; text-align:left;'>
<div style='background-color:#ffb200; width:".$PVWattProzent."%;height:40px;' id='balken'>
</div>
<div style='line-height:40px;margin-top:-40px;text-align:center'>
<font size='-1' color='#FFFFFF' face='Arial'>".$PVWattProzent."%</font></div></div>
";
SetValue(28384 /*[PHP_Module\SMA\PV Leistung in % Balken]*/,$htmlQuellCode);
?>