Seite 1 von 2
Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 10:02
von sonic
Guten morgen ihr lieben,
zur Berechnung der Füllmenge in meinem Heizöltank benötige ich bitte etwas Hilfe bei der Umsetzung.
Zum Setting:
Ich nutze eine NodeMCU mit Tasmota 8.2 (sensors). Verbunden ist die NodeMCU mit einem Ultraschallsensor HC-SR04.
Diese Kombination läuft tadellos. Verbaut ist beides einfach in einer Abzweigdose. Unten 2 Löcher für den Sensor reingebohrt. Gleiche Löcher einfach in den Öltank gebohrt, Abzweigdose eingesetzt und zur Sicherheit alles nochmal mit Silikon abgedichtet. Funktioniert prima.
IMG_9953.JPG
Bildschirmfoto 2020-05-15 um 09.56.26.png
Die Daten werden via MQTT an mein Openhab gesendet und ich stelle diese dann auf der Sitemap dar.
Wie gesagt, das funktioniert auch soweit ganz Prima. Ich sehe also den Abstand in CM vom Sensor bis zur Oberfläche vom Öl.
Diese Darstellung ist natürlich nicht sonderlich schön und mir kam die Idee entweder die verbleibenden Liter zu berechnen, ODER einfach die % die sich noch im Tank befinden.
Von folgenden Daten können wir ausgehen:
Fassungsvermögen Öltank:
10000 Liter
Abstand Sensor zu Öloberfläche wenn der Tank komplett voll ist:
10cm
Abstand Sensor wenn der Tank komplett leer ist:
175cm
Es kommt bei der ganzen Geschichte auch nicht auf ein paar Liter an, Ziel soll es lediglich sein einen Überblick zu bekommen.
Hat vielleicht jemand von euch eine Idee wie man dies realisieren könnte?
besten Dank schonmal und liebe Grüße
Bernhard
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 10:09
von udo1toni
Na ja, mathematisch ist das keine große Herausforderung...
Füllstand in % = 100 - (Messung - 10)/(175 - 10)*100
Die Frage ist eher, wo Du die Berechnung vornimmst, in einer openHAB Rule oder in einer Tasmota Rule.
Letzteres hätte den Vorteil, dass Du den Wert auch unabhängig von openHAB direkt ablesen kannst.
Gesendet von meinem SM-G973F mit Tapatalk
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 11:06
von sonic
vielen Dank für die Gleichung.
Als Tasmota Rule ist natürlich die schönere Art, da hast Du recht.
Ich werde es mal versuchen und bei Erfolg auch das Ergebniss posten
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 12:36
von sonic
Ich habe doch eine Möglichkeit gefunden die Liter zu berechnen und versuche das in OpenHab erstmal zu testen.
Ich gehe folgendermaßen vor:
oeltank.items
oeltank.rules
Code: Alles auswählen
rule "Berechnung Öl"
when
Oeltank_Full_Status changed
val min = 10 // [cm abstand zu sensor wenn tank voll]
val max = 175 // [cm abstand zu sensor wenn tank leer]
val vol = 10000 // [fassungsvermögen in liter]
//Oeltank_Full_Status ist das number item mit dem abstand in cm vom sensor
then
var Number a = max-Oeltank_Full_Status
var Number b = a*1000
numItem.postUpdate(OelFull)
end
sitemap
Code: Alles auswählen
Text item=Oeltank_Full_Status label="Heizöltank [%.1f cm von oben zum Öl] " icon=oil
Text item=OelFull label="Heizöltank [%.1f Liter Heizöl im Tank] " icon=oil
Das erste item (alt) wird korrekt angezeigt, also die cm Abstand vom Sensor.
das zweite item (OelFull) zeigt leider nichts an.
Ist vielleicht doch die rules falsch?
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 12:54
von Darkwin101
Du beschreibst in deiner rule die Variable OelFull gar nicht mit irgendeinem Wert wie soll dann etwas angezeigt werden
Zudem sollte es bei a = max-Oeltank_Full_Status.state as Number heissen wenn der Status noch die Einheit enthält eher a = max-(Oeltank_Full_Status.state as Number).floatValue
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 13:06
von sonic
oh ja stimmt, also eher
Code: Alles auswählen
var Number a = max-Oeltank_Full_Status.state as Number
var Number b = a*1000
numItem.postUpdate(OelFull, b)
bringt leider auch keinen erfolg
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 13:09
von Darkwin101
Code: Alles auswählen
var Number a = max-Oeltank_Full_Status.state as Number
var Number b = a*1000
OelFull.postUpdate(b)
Beachte auch das die Rule erst ausgeführt wird wenn sich der Füllstand auch ändert eventuell würde für den ersten Test ein received Update sich anbieten so wird die Regel ausgeführt sobald du einen neuen Status von dem Sensor erhälst
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 13:29
von udo1toni
Das liegt daran, dass die ganze Rule keinen gültigen Code darstellt.
Ob man nun Liter oder Prozent haben möchte, spielt natürlich keine Rolle, 100% entsprechen ja einfach 10.000 Litern, man muss also nur mit dem passenden Faktor multiplizieren.
Wenn es per openHAB Rule passieren soll, sieht das Ganze so aus:
Code: Alles auswählen
// globale Variablen und Konstanten Zu beginn der Datei definieren
val aMin = 10 // [cm Abstand zu Sensor wenn Tank voll]
val aMax = 175 // [cm Abstand zu Sensor wenn Tank leer]
val vMax = 10000 // [Fassungsvermögen in Liter]
rule "Berechnung Öl"
when
Oeltank_Full_Status changed
then
if(!(Oeltank_Full_Status.state instanceof Number)) { // falls Status keine gültige Zahl
logWarn("oelstand","Öltanksensor liefert keinen Messwert! ({})",Oeltank_Full_Status.state)
numItem.postUpdate(NULL)
return;
}
if((Oeltank_Full_Status.state as Number) < aMin) { // falls Status kleiner aMin
logWarn("oelstand","Öltanksensor liefert zu kleinen Messwert! ({} cm)",Oeltank_Full_Status.state)
numItem.postUpdate(NULL)
return;
}
if((Oeltank_Full_Status.state as Number) > aMax) { // falls Status größer aMax
logWarn("oelstand","Öltanksensor liefert zu großen Messwert! ({} cm)",Oeltank_Full_Status.state)
numItem.postUpdate(NULL)
return;
}
var Number vTeil = vMax-((Oeltank_Full_Status.state as Number) - aMin)/(aMax-aMin)*vMax
numItem.postUpdate(vTeil)
end
Die Formel sollte nachvollziehbar sein.
Bei Maximalfüllung wird der Ausdruck über dem Bruch 0, da Status == aMin. Bei leerem Tank ist der Status aMax. aMax - aMin ist die maxiamle Strecke. Bei maximal geleerten Tank ist der Bruch also == 1, bei minimal geleertem Tank ist der Bruch == 0, dazwischen ist der Bruch zwischen 0 und 1, und zwar proportional zum Füllstand. Multipliziert mit vMax bekommen wir die entnommene Menge in Litern, die wir vom Maximalinhalt abziehen müssen, um den Rest zu erhalten.
Die ersten drei Abfragen schützen vor Sensorfehlern und setzen die Anzeige auf NULL (das ergibt bei einem Number Item dann einen Strich)
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 13:54
von sonic
Vielen Dank, ja die Formel ist nachvollziehbar. Ich muss mich noch etwas an die OH Syntax gewöhnen, sorry dafür.
Leider funktioniert es so aber auch nicht. Zum Debug habe ich die von dir freundlicherweise eingebundenen Abfragen zu Sensorfehlern noch raus gelassen um sicher zu gehen das die Rechung funktioniert. Diese scheint aber nicht zu klappen.
rules:
Code: Alles auswählen
// globale Variablen und Konstanten Zu beginn der Datei definieren
val aMin = 10 // [cm Abstand zu Sensor wenn Tank voll]
val aMax = 175 // [cm Abstand zu Sensor wenn Tank leer]
val vMax = 10000 // [Fassungsvermögen in Liter]
rule "Berechnung Öl"
when
Oeltank_Full_Status changed
then
var Number vTeil = vMax-((Oeltank_Full_Status.state as Number) - aMin)/(aMax-aMin)*vMax
OelFull.postUpdate(vTeil)
end
Ich habe auch statt dem when .... Oeltank_Full_Status changed mal einen Lichtschalter eingebaut, damit der "then" bereich auf jedenfall greift. Aber auch hier kein Erfolg leider.
items:
sitemap:
Code: Alles auswählen
Text item=OelFull label="Heizöltank [%.1f im Tank] " icon=oil
Text item=OelFull
Es gibt in den Logs keinen Error.
Frage: Kann es sein, dass eventuell mit Oeltank_Full_Status nicht gerechnet werden kann? Dieses Item ist via PaperUI angelegt als Number Item und empfängt vom mqtt folgendes:
mit:
in der Tasmota Console:
Code: Alles auswählen
MQT: tele/oeltank/SENSOR = {"Time":"2020-05-15T12:54:11","SR04":{"Distance":19.982}}
Re: Berechnung Füllstand Heizöltank
Verfasst: 15. Mai 2020 14:09
von udo1toni
Moment... Wie heißen denn die Items nun wirklich?
Sind Thing und Channel korrekt angelegt? Ist das Item mit dem Channel verknüpft?
Die von mir eingebauten If() Statements solltest Du übrigens nicht weg lassen, denn sie geben im Zweifel Fehlermeldungen aus, wenn es irgendwo klemmt.