Regenwasser-Zisterne und Umrechung von Werten

Hallo zusammen,

basierend auf diesem Posting hier versuche ich seit ein paar Tage (nicht am Stück :wink: ) 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.

  1. die Entfernung zur Wasseroberfläche bis 100% voll; also quasi kommend von Tankboden „Wasserinhalt (max.)+leerer Raum zwischen voll und untere Kante Sensor“ und
  2. 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?

wie wäre es damit?


<?

function calc_level($dist_cur) {

	$dist_full = 5; // Entfernung in cm = 100% = voll
	$dist_empty = 105; // Entfernung in cm = 0% = leer
 	$volumen = 1000; // Volumen des Behälters
	
	$dist_real = $dist_cur - $dist_full; // reale Höhe
	
	$dist_max = $dist_empty - $dist_full; // Differenz von empty/full in cm
	$perc_faktor = ($dist_empty - $dist_full) / 100; // Faktor für 1% in cm
	
	$perc = ($dist_real > 0) ? ($dist_real / $perc_faktor) : 0; // Prozent Füllzustand
	$vol = $volumen / 100 * $perc; // Volumen
 
 	echo "dist_cur=$dist_cur, dist_real=$dist_real, dist_max=$dist_max, perc_faktor=$perc_faktor => perc=$perc, vol=$vol
";
}

calc_level(5);
calc_level(55);
calc_level(105);
 
?>

ergibt


dist_cur=5, dist_real=0, dist_max=100, perc_faktor=1 => perc=0, vol=0
dist_cur=55, dist_real=50, dist_max=100, perc_faktor=1 => perc=50, vol=500
dist_cur=105, dist_real=100, dist_max=100, perc_faktor=1 => perc=100, vol=1000

Habe ich die Aufgabenstellung richtig verstanden?

Hallo demel42,

vielen, lieben Dank für die schnelle Unterstützung. Leider ist das nicht das was ich gesucht habe. :frowning:
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.

Die Ausgabe auf:

calc_level(5);
calc_level(55);
calc_level(105);

müsste also eigentlich folgende sein:

dist_cur=5, dist_real=100, dist_max=100, perc_faktor=1 => perc=100, vol=1000
dist_cur=55, dist_real=50, dist_max=100, perc_faktor=1 => perc=50, vol=500
dist_cur=105, dist_real=0, dist_max=100, perc_faktor=1 => perc=0, vol=0

Na dann rechnest halt:
Ergebniss = 100 - Ergebniss :rolleyes:

bb

.

sorry, hab beim Testen irgendwann falsch herum gedacht; diese Zeile muss so lauten:


$perc = ($dist_real > 0) ? 100 -  ($dist_real / $perc_faktor) : 100; // Prozent Füllzustand

ergibt

dist_cur=5, dist_real=0, dist_max=100, perc_faktor=1 => perc=100, vol=1000
dist_cur=55, dist_real=50, dist_max=100, perc_faktor=1 => perc=50, vol=500
dist_cur=105, dist_real=100, dist_max=100, perc_faktor=1 => perc=0, vol=0

… sehe gerade bbernhard hat’s auch schon geschrieben … :slight_smile:

SUPER GUT! Vielen, lieben Dank.
So passt es perfekt.

Hier nochmal den kompletten Code:

<?

$distanz = GetValue(42242 /*[Sonoff\Zisterne\SR04 Distance]*/); //vom Sensor gemeldete Distanz in cm
$fuellung = GetValue(17472 /*[Regenzisterne\Füllstand Prozent]*/); //Füllung in Prozent
$fuellung_liter=GetValue(21544 /*[Regenzisterne\Füllstand Liter]*/ ); //Füllung in Liter
$wassertemp=GetValue(29329 /*[Garten\Außenthermometer\Temperatur]*/ ); //Wassertemperatur (temp. ein beliebig anderer Temperatursensor)

function calc_level($dist_cur) {

	//diese Werte ggf. anpassen
	$dist_full = 5; //Entfernung bis Unterkante Sensor in cm = 100% = voll
	$dist_empty = 105; //Entfernung bis Boden Tank in cm = 0% = leer    
    $volumen = 3000; //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(21544 /*[Regenzisterne\Füllstand Liter]*/, $vol); //setzt Variable Füllstand in Liter
	SetValue(17472 /*[Regenzisterne\Füllstand 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>
        <font size='+1'>Wassertemperatur: ".$wassertemp." °C</td>
    </tr>
    <tr>
        <td height=11 width=150 align='left' style='background-image:url(/user/zisterneunten.gif);'>
    </tr>
  </table>
";

SetValue(37554 /*[Regenzisterne\Regenzisterne]*/ ,$html); //baut das HTML auf

?>

Und hier noch die Dateien/Bilder, falls es jemand nachbauen möchte:

Wasser

Zisterne oben

Zisterne unten

Hallo,

vielen Dank erst mal für diese idee.

Gibt es dazu eine kleine Anleitung wie man vorgeht`?

weil einfach nur das script zu kopieren scheint wohl nicht alles zu sein,

Was benötige ich für Instantzen usw.?

Den Sensor habe ich soweit gebaut und funktioniert auch.

Muss nur noch schauen wie ich den Wert in IPS bekomme.

Danke

Das „Woher komme ich und wohin will ich?“ befindet sich hinter dem link im ersten Posting zu diesem Thema.

Sent from my mobile using Tapatalk

Hallo,

erst mal danke für das script :slight_smile:

läuft soweit bei mir alles.

Ich habe aber eine kleine Frage.

Wenn ich das script ausführe wird alles richtig ausgerechnet.

Leider steht bei mir im Webfront sowohl bei Liter als auch bei %

Z.b 1150,23568745236 Liter
25,23547862541%

In meinen Variablen die zum Speicher dienen steht aber 1150,23L und 25,23%

mir wird nach dem Komma mehr als 2 Zeichen im WF angezeigt.

Habe die Variablen schon mehrmals neu angelgt, Profiel zugewiesen usw.

leider keine abhilfe gebracht. Wie kann ich das Webfront auf 2 stellen nach dem Komma begrenzen?

Danke

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

Hi,

ich hab so gelöst.

$we_analog_1 = round(GetValue($id_analog_1), 2);

Hallo,

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

?> 
$fuellung_liter = round(GetValue(19646),2);

Vielleicht solltet ihr darüber nachdenken den Befehl GetValueFormatted — IP-Symcon :: Automatisierungssoftware zu benutzen.

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.

Danke

wibo050447

dass war es :slight_smile:

Hallo zusammen,

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); 

?>

Hallo
Das hier rausnehmen oder kommentieren

echo "dist_cur=$dist_cur, dist_offen=$dist_offen, dist_max=$dist_max, perc=$perc %";
// echo "dist_cur=$dist_cur, dist_offen=$dist_offen, dist_max=$dist_max, perc=$perc %";

Danke @1007 das macht in der Tat Sinn ! :smiley: Tomaten auf den Augen