Hallo an alle
um den ursprünglichen Thread zum alternativen DS2423 Counter oder uch DougieCounter nicht durcheinander zu bringen
will ich hier mal meine Erfahrungen mit dem Counter berichten.
Im Moment habe ich noch einige Probleme, ich hoffe aber das mit Hilfe des Forum das Ganze dann doch klappt.
Wenn dann alles soweit funktioniert werde ich eine Zusammenfassung für Anfänger schreiben..
Wo stehe ich gerade.
einiges davon ist in diesem Thread :
http://forum.fhem.de/index.php/topic,10962.msg140122.html#new
Die Platine von Dougie habe ich schnell bekommen, den Warenkorb von Reichelt auch. Das zusammenlöten war auch nicht weiter schwierig und sollte für jeden realisierbar sein.
Dann den von Dougie empfohlenen Ultraschallsensor bestellt und ein paar Tage gewartet.
Heute dann gekommen.
Da ich kein Flachbandkabel und auch nicht die Klemmstecker zur Verfügung hatte, aber ein altes Floppy Kabel habe ich erst einmal einen provisorischen Stecker gelötet.
Siehe Bild vom gesamten Aufbau. Ich hoffe die Pinbelegung ist richtig und nicht Ursache meines Problems gerade.
(http://owx5.jpg)
(http://owx6.jpg)
Die fhem.cfg die automatisch erzeugt wurde ( bis auf die Überschrift )
#########################################################
####### Dougi counter #############
#########################################################
define OWX_1D_A2D987000002 OWCOUNT DS2423 A2D987000002
attr OWX_1D_A2D987000002 IODev USB9097
attr OWX_1D_A2D987000002 model DS2423emu
attr OWX_1D_A2D987000002 nomemory 1
attr OWX_1D_A2D987000002 room OWX
leider bekomme ich auchmit get ... keine Entfernungsmessung.
Also noch etwas experimentiert.
Wenn ich den IPC Stecker entferne und das ganze als Counter benutzen möchte, um zB einen REED Kontakt anzuschließen , dann sollte ich soweit ich das alles verstanden habe
x3 - 1 und GND kurzschließen, das sollte einen REED schließer nachahmen ??
wenn ich das mache und dann in fhem einen get Befehl sende
dann sehe ich auf einmal das sich was tut , da kam bei mir was erst von 160 dann von 180.
Was das bedeutet weiß ich leidr noch nciht
so ist das halt als Anfänger :( >:(
...hast du denn auch die richtige Firmware auf den Tiny geflashed? Laut Beschriftung und 1W Seriennummer hast du einen Prozessor mit Standard-Software.
den hast du geflasht ...
hatte dir aber auch nicht geschrieben das ich das mit dem U Sensor machen will.
Anfängerfehler...??
Habe 2 Stück davon die beide wohl auch funktionieren ( siehe anderer Thread)
Kann ja einen verkaufen und dann einen neuen bei dir bestellen..
dann aber so programmiert das ich damit den U Sensor auslesen kann
a kommt mir gerad noch eine Idee.
Das Ganze soll ja in die Zisterne um den Wasserstand zu messen, da steht auch eine Wasserpumpe, könnte man die Betriebstunde dann auf dem anderen Kanal mit überwachen. Da müsste man dann sicher einen 1Phasenwechselstromzähler mit Ausgang anschließen ?!
Apropos falsche Firmware. Welches ist die aktuelle Version, die man flashen muss, um die EEPROM
Funktionalität zu nutzen ? Ist das die Version 1.2, oder gibt es noch eine neuere ?
Gruß, Marc
mein U-Sensor ist an obiger ISP Zeichnung ausgehend an Pin 2,4,6,1 angeschlossen.
Wenn man mit sowas bastelt sollte man schon selbst einen USB-Programmer besitzen.... hab ich mir extra dafür für 25€ von myAVR zugelegt...
Dougi wird sich schon melden
hab Platinen und Prozessoren zusammen bestellt, wußte aber nicht das die für den Entfernungsmesser anders sind.
Werde dann halt noch einmal einen counter löten dann mit richtigem patch. War mir nur nicht absolut sicher wegen der Pinbelegung. hatte halt kein Flachbandstecker, wo die Pinbelegung automatisch stimmt.
Bin schonmal froh da FHEM den Counter erkennt und das der auch was registriert wenn ich die kOntakte kurzschließe.
wird schon
Kann mir jemand verraten wo es den C Code für die SFR02 - I2C Version gibt ?
Bei meiner Suche lese ich immer wieder das dougie die AVRs vekauft finde allerdings in den ganzen Therads oder der Mini HP jeder Menge Bilder aber keinen direkten Link auf das C Programm.
Zwischenbilanz
Heute ist der neue Prozessor von Dougie gekommen, einfach super wie das klappt.
Eingelötet und das Ganze dann ins Gehäuse eingebaut
Dann die ersten Funktionstest
und siehe da
das Ding misst richtig.
so sieht die Zeile aus
OWX_1D_A2D993000002
A: 16.0 cts A_rate: 685.71 cts/h B: 252.0 cts B_rate: 8228.57 cts/h
wobei am Counter A nichts angeschlossen ist.
Abder die Entfernung zur Decke die ich messe ist mit 252 cm richtig.
Habe mit anderen Massen probiert und das Mass für B stimmt.
Das Ganze werde ich dann morgen ev in die Zisterne einbauen. Das Legen des Kabels wird noch lustig :P
Später soll dann noch über ein Relais ein Betriebsstundenzähler für die Pumpe angeschlossen werden.
Wahrscheinlich brauche ich aber noch etwas Hilfe um den Wasserstand zu berechnen., am besten wäre es dann ja das ganze in Litern anzugeben, das wäre die Krönung...
Schön, das es so problemlos klappt.
Wegen dem Eingang A: dort einfach einen 10k Widerstand vom Eingang nach Masse legen (Pull-Down), der zählt dann erst weiter, wenn du einen High-Pegel (5V) mit deinem Relais anlegst.
Momentan zählt er die in der Luft liegende Brummspannung.
Wenn der Querschnitt deiner Zisterne einigermassen konstant ist, berechnest du das Volumen ja einfach mit Fläche x Füllstand. Dafür legst du sinnvollerweise ein UserReading an oder lässt es in einem kleinen PerlProgamm in der MyUtils berechnen.
VG
Ralf
Hallo,
das hört sich immer so einfach an.
Wenn man so ein Perlprogramm mal selber gemacht hat und das alles verstanden hat mag das ja auch so sein.
Ist noch etwas komplizierter da ich einen 5m langen und ca 1,5 m im Durchmesser flach im Boden liegenden Tank habe. Das heißt je nach Füllstand sind die Änderungen immer anders.
Muss meinen Sohn mal fragen was man da für eine Formel benötigt, und die muss dann ja noch in FHEM integriert werden. Werde dann mal die Forumsuche aktivieren was es da schon gibt.
Aber als erstes muss das Kabel mal in den Tank.
War eigentlich für heute geplant da ist dann aber ein Termin
Telematik im Gesundheitswesen dazwischengekommen.
Wird also nächste Woche werden, in der Zwischenzeit werde ich dann mal ein Relais bestellen.
so was in der Art?!
http://www.ebay.de/itm/Eltako-Schaltrelais-R91-100-230V-1Schliesser-/281273779082?pt=LH_DefaultDomain_77&hash=item417d39438a
und der Mini braucht ja auch noch sein hinteres Bodenblech und arbeiten muss man ja auch noch.
Zitat von: Franz Tenbrock am 26 Februar 2014, 07:47:02
und der Mini braucht ja auch noch sein hinteres Bodenblech
Ein echter (alter) Mini??? :-)
ist der neue ein Mini???
doch eher nicht
klar das alte Modell, hab deine Seite gesehen, :-)
mini Bj 98 1300
Hab dir mal ein Bild von meinem Spartan gemailt, du erinnerst dich sicherlich. Zur Zeit halt Mini für meinen Sohn dran. Der hatte die hässlichen Überbräter an den Schwellern. Die haben wir glücklicherweise entfernt, darunter war es dann schon gut am gammeln. Vorne ist das Blech schon drin hinten warte ich auf das Blech. Schicke dir mal ein paar Fotos bevor wir den Aussenschweller draufmachen.
Zitat von: Franz Tenbrock am 26 Februar 2014, 07:47:02
Ist noch etwas komplizierter da ich einen 5m langen und ca 1,5 m im Durchmesser flach im Boden liegenden Tank habe. Das heißt je nach Füllstand sind die Änderungen immer anders.
1.5m Durchmesser und 5m lang dann hat der so ca. 8836 Liter.
Berechnung des Kreisabschnittes ist dein Freund : http://de.wikipedia.org/wiki/Kreissegment ( da die vierte Formel zur Berechnung des Segments ) siehe Anhang - allerdings unter der Annahme das er exakt waagerecht im Boden liegt :)
Das Forum hier ist echt mein Freund....
ich hab euch alle lieb.
super wie einem hier geholfen wird
werde weiter berichten.
Verkabelung benötigt noch ein paar Tage
8) ;)
A=r^{2}\arccos {\left(1-{\frac {h}{r}}\right)}-{\sqrt {2rh-h^{2}}}(r-h)
in dieser Formel alles drin was ich habe
Radius ist ja bekannt und Höhe kann ich berechnen.
Das Ganze dann multipliziert mit der Länge des Tanks
und das Ganze dann so verpacken das FHEM versteht.
wird schon
das
Im Rahmen der Messgenauigkeit bliebe man auch mit einer einfachen polynomialen Näherung.
LG
pah
Hallo
so das Teil ist im Dom der Zisterne eingebaut
und ds beste es kommt auch ein vernünftiger Wert zurück.
So jetzt muss ich das noch loggen und auch mit FHEM rechnen
Hab ich noch nie gemacht.
Die Wasserspeicherkapazität im Dom werde ich vernachlässigen.
Die Formel steht ja oben
Hier erst mal ein Schaubild vom Aufbau:
(http://zisterne.jpg)
ev hilft mir ja wieder jemand. Wie man das dann im Dashboard darstellt das weiß ich ja mittlerweile
Gerade den Fritzboxanrufbeantworter da integriert. :-)
http://forum.fhem.de/index.php/topic,17216.msg144777.html#msg144777
So etwas weiter aber leider noch nicht schlauer
Mathe ist 30 Jahre her.. in meinem Beruf nicht gerade gefragt.
Hab die Zeichnung erweitert, aber das Problem wird das mit dem acuscosinus sein, den fhem wahrschelinlich nciht berechnen kann.
Hab das mal aktuell berechnet und komme auch zu einem glaubhaften Ergebniss.
Ich kann mir schon vorstellen was PAH mit
einer einfachen polynomialen Näherung.
meint.
Das heisst man hat ne Formel ohne diesen arcuscosinus.
Hab aber bei Tante G bisher nichts dazu gefunden...
bis auf diese Peiltabelle
http://www.tankanlagen.com/wp-content/uploads/2010/10/peiltabelle10000liter.pdf
(http://zisterne2.jpg)
8)
Wobei so ganz schlimm ist das nicht, denn ich kann anhand der Füllhöhe schon erkennen was da passiert
Bin aber schon mal froh das das Ganze überhaupt geklappt hat.
Es schmerzt mich zutiefst, dass man "30 Jahre" als Entschuldigung vorbringt, das bisschen elementare Schulmathematik verlernt zu haben.
Also mit der Aufforderung, sich heftig zu schämen:
Sei x der in m gemessene Abstand zur Wasseroberfläche. Dann ist die Wassermenge im Tank gegeben durch
V (in Kubikmetern) = (Tanklänge in m) * (2.01062 + 0.00274162 Sqrt[x-0.32] * (208.272 - 685.388 x + 104.58 x^2 + 9.89217 x^3 + 1.52889 x^4 + x^5))
Die Formel gilt, solange der Wasserpegel sich nicht im Dom befindet (dafür müsste man die Maße des Doms kennen), also ab etwa x > 0.4 m und wird etwas ungenauer bei x > 1.6 m
LG
pah
Sorry
Aber ich beschäftige mich jetzt schon einige Stunden damit.
Ich denke FHEM wird wohl kaum einen Arcuscosinus berechnen können, daher wohl ja auch die polynominale Annäherung
Jetzt habe ich schon eine Hilfestellung bekommen aber lösen kann ich es damit immer noch nicht.
im übrigen fehlt zumindest 1 schließende Klammer, soweit eichen meine Mathekenntnisse ( Sorry ;) )
Das man über die Fläche * Tasnklänge zum Volumen kommt ist klar.
Die 0,32 ergeben sich aus dem Abstand Sensor zur theoretischen Oberkante des Tanks 192 cm - 160 cm
[ o,88 m - 0,32m ]
SQRT hab ich bei Google nachgesehen ist die Quadratwurzel
was ich noch nicht verstehe ist zB 685,388 x soll das heissen 685,388 * 0,88
wobei wenn ich von einer kreisberechnung ausgehe und den Dom immer vernachlässige dann müsste ich doch immer mit 0,56 cm rechnen
Ich grübel gerade mit einem Bekannten darüber.
Ich bin im allgemeinen ja nicht abgeneigt fehlendes Wissen durch Suchen etc zu Vervollständigen, aber so trivial ist das sicher nicht.
Die nächste Hürde mit viel Recherche für mich wird ja sein wie packe ich das dann in FHEM ein
also noch viel grübelei..
gibt es ev einen Link der mich in die Annäherungstheorie einführt ?
Fehlende Klammer stimmt - ist ergänzt.
Natürlich kann FHEM einen ArcCos rechnen - denn FHEM kann alles, was Perl kann. So ist es aber einfacher einzugeben ...
685.388 x bedeutet 685.388 MAL x. In Perl code:
V (in Kubikmetern) = (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(x-0.32) * (208.272 - x*( 685.388 - x*(104.58 + x*( 9.89217 + x*(1.52889 + x)))))
pah
Thanks..
dann will ich mal sehen wie ich das eingebaut bekomme, auch da fehlt mir noch ein wenig Wissen
was Perl kann oder nicht ??
da muss ich noch viel lernen.
Als erstes brauche ich da wohl mal ein Logfile mit den richtigen Readings.
das wird dann erst einmal die nächste Aufgabe sein.
und dann werde ich mal weitersehen
Zitat
dann will ich mal sehen wie ich das eingebaut bekomme,
--> userReadings
attr <mein Sensor> userReadings Volumen { (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(("<mein Sensor>","höhe",0)-0.32) * (208.272 - ("<mein Sensor>","höhe",0)*( 685.388 - ("<mein Sensor>","höhe",0)*(104.58 + ("<mein Sensor>","höhe",0)*( 9.89217 + ("<mein Sensor>","höhe",0)*(1.52889 + ("<mein Sensor>","höhe",0)))))) }
mal so aus der Hüfte, ohne Garantie
Gruß Joachim
da sind einfach noch zu viele Dinge von denen ich noch keine Ahnung habe
aber bisher habe ich die anderen Dinge nach mehr oder weniger langer zeit und entsprechender Unterstützung auch hinbekommen.
also das ist mein Code der aber leider noch nicht das macht was ich will
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BUnit cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
attr Zisterne userReadings wasserstand:counters.B {ReadingsVal("wasserstand","counters.B,0")}
define FileLog_Zisterne FileLog ./log/Zisterne-%Y.log Zisterne|B:*
attr FileLog_Zisterne logtype text
attr FileLog_Zisterne room OWX
define SVG_FileLog_Zisterne_1 SVG FileLog_Zisterne:SVG_FileLog_Zisterne_1:CURRENT
attr SVG_FileLog_Zisterne_1 room OWX
fangen wir oben an
attr Zisterne BUnit cm
im Wiki habe ich gelesen, dass man damit eine Einheit für Unit B angeben kann, dachte ich zumindest
klappt leider so nicht, kommt aber auch keine Fehlermeldung
dann hatte ich versucht die Formel einzugeben, klappt so noch nicht, war irgendwie klar, einfahc noch zu hoch für mich.
dann habe ich mal versucht ein userReadings zu definieren
klappt so natürlich auch noch nicht da
get Zisterne counters
das hier bringt
OWCOUNT: Zisterne.counters => A: 3754.0 cts A_rate: 600.00 cts/h B: 90.0 B_rate: 0.00 /h
Ich brauche aber nur das hier
B: 90.0
(http://zisterne4.jpg)
Muss ich die Readings
Wasserstand und Volumen in der FHEM.save löschen oder geht das auch irgendwie leichter - bestimmt :(
Hab im Wiki und in der command ref gelesen, komme damit aber einfach noch nicht weiter
bevor ich also so eine komplexe Formel berechne scheint es mir sinnvoller erst mal ne ganz einfach Berechnung zu machen
ein Problem hab ich mit der commandref dann gelöst
mit diesem Kommando verschwindet das nicht benötigte reaing :-)
lesen hilft halt
deletereading Zisterne Wasserstand
:)
und mit dieser Zeile
attr Zisterne BOffset -32
bekomme ich H gleich richtig gesetzt, also 56 cm ( Wasser sind schon raus )
32 wr ja die Höhe vom Ultraschallsensor bis oberkante des Wassertanks ohne Dom
wenn ich jetzt 160 cm was ja mein Durchmesser vom Wassertank ist minus 56 cm nehme
dann hätte ich zumindest den aktuellen Wasserstand im Tank
das ist der Wert den mir auch meine manuelle Tankanzeige anzeigt.
so und noch was weiter
8)
OWCOUNT: Zisterne.counters => A: 4585.0 cts A_rate: 600.00 cts/h USensor: 58.0 cm USensor_rate: 0.00 cm0/h
lesen hilft doch .. was rot ist hab ich heute abend geschafft in dem ich mir nühsam die INfos zusammengesucht habe, mit dem Verständnis für die Syntax hapert es zwar noch aber soweit hab ich es verstanden
für den nächsten schritt Berechnung der Wasserhöhe im Tank wäre Hilfe schön..
als 16o cm minus USensor
160 - 58
wobei 160 fester Wert und 58 = USensor variabel
so jetzt Feierabend.
define Zisterne OWCOUNT DS2423 A2D993000002 600
[color=red]attr Zisterne BName USensor[/color]
[color=red]attr Zisterne BOffset -32[/color]
[color=red]attr Zisterne BUnit cm|cm[/color]
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
attr Zisterne userReadings wasserstand:counters.B {ReadingsVal("wasserstand","counters.B,0")}
Dann will ich mal schauen ob ich heute Abend mit diesme Link
http://de.selfhtml.org/perl/sprache/operatoren.htm
weiterkomme.
Die deutlich verbesserte Einsteiger PDF hab ich noch mal gelesen, leider aber zum Rechnen mit FHEM / Perl nichts brauchbares gefunden.
Also werde ich mich doch mit den Grundlagen von Perl auseinanderzusetzen haben.
Da mein Schulter leider vom Skifahren etwas lädiert ist muss der Garten dann halt noch was warten.
Ist ja scheinbar auch ein dickes Brett an das ich mich als Anfänger gewagt habe.
Ich scheiter im Moment noch ein individuelles Log zu machen,
hab mal wieder viel gelesen aber irgendwas stimmt noch nicht
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define FileLog_Zisterne FileLog ./log/Zisterne-%Y.log Zisterne|B:*
define FileLog_wasserstand FileLog ./log/wasserstand-%Y.log wasserstand|USensor:.*(USensor).*
Beim 2. Filelog will ich eigentlich nur folgendes stehen haben
2014-03-04_12:20:26 USensor: 58.0 cm
der Rest interessiert ja nicht, warum also loggen.
Irgendwie brauche ich ja USensor als Variable um damit dann im nächsten Schritt zu rechnen.
sehe in der command ref etc den Wald irgendwie vor Bäumen nicht. Auch aus anderen Beispielen hier im Forum hab ich wohl das entscheidende übersehen
Hilf dir selbst ...
so ein Problem hab ich nun ganz anders gelöst als gedacht.
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand room OWX
define FileLog_Wasserstand FileLog ./log/Wasserstand-%Y.log Wasserstand
in der commandref habe ich denBefehl
readingsProxy
gefunden, hab ich bisher in keinem Beispiel gefunden, fand ich aber ganz elegant.
mal sehen ob ich damit auch meine EM1000GZ endl
ich so hinbekomme wie ich das möchte ??
und damit kann ich dann mein Log so schreiben wie gewollt, ob ich dann damit rechnen kann, mal sehen..
so sieht die Zeile im Log aus.
2014-03-04_13:31:13 Wasserstand 58
2014-03-04_13:33:03 Wasserstand 58
2014-03-04_13:33:06 Wasserstand 58
jetzt sollte ich wenn die Readings immer gleich sind, weil ja nciht Wasser in Massen verbraucht wird die Logs noch reduzieren
aber auch da fehlt mir wieder etwas Syntax , also lesen...
attr Wasserstand event-on-change-reading ???????
das ist der Perl Code der mir zumindest die aktuelle Füllhöhe, leider noch mit negativem Vorzeichen ausgibt
wenn ich das in der Kommandozeile eingeben, der Code ist somit richtig, das muss nun oben in die Definition rein, da hapert es noch
{ ReadingsVal("Zisterne", "USensor", "160")-160 }
so jetzt kasper ich schon wieder rum
jetzt kann ich zwar schon was rechnen aber FHAM versteht es noch nciht,, Syntax??
define Wasserspiegel dummy
set Wasserspiegel { ReadingsVal("Zisterne", "USensor", "160")-160 }
attr Wasserspiegel room OWX
Zwischenstand :) :D
mit diesem Code
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand room OWX
define FileLog_Wasserstand FileLog ./log/Wasserstand-%Y.log Wasserstand
attr Wasserstand userReadings Test { ReadingsVal("Zisterne", "USensor", "160")-160 }
bin ich schon mal ein wenig weiter.
So sieht es jetzt aus:
(http://wasserspiegel.jpg)
also auch vom Verständnis ein wenig weiter.
geht sicher eleganter,
auch das negative Vorzeichen stört noch was
so sehe ich aber das der Wasserspiegel noch 1,01 hoch ist, also noch mehr als die Hälfte drin ist.
aber gnaz schön mühsam, wenig einfache Beispiele in der command ref und im Anfänger PDF, dort alles immer schon stark verschachtelt, für Profis sicher so ok, aber für Anfänger schwierig da rein zu kommen
doch noch geschafft ( Teilziel 1 )
;D 8)
(http://zisterne5.jpg)
und das ist der Code
durch die Hintertür ??
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand group Zisterne
attr Wasserstand room OWX
attr Wasserstand valueFn { ReadingsVal("Zisterne", "USensor", "160")-160 }
define FileLog_Wasserstand FileLog ./log/Wasserstand-%Y.log Wasserstand
Filelog muss geändert werden
und dann noch die Formel von PAH
Kann man das so machen ??
hab hier kein FHEM zum testen
Formel von PAH:
V (in Kubikmetern) = (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(x-0.32) * (208.272 - x*( 685.388 - x*(104.58 + x*( 9.89217 + x*(1.52889 + x)))))
Wasserstand ist -101 statt 101 !! also negatives Vorzeichen
Tanklänge ist 5m
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand group Zisterne
attr Wasserstand room OWX
attr Wasserstand valueFn { ReadingsVal("Zisterne", "USensor", "160")-160 }
define Tankinhalt dummy
attr Tankinhalt valueFn {5 * (2.01062 + 0.00274162 *sqrt(Wasserstand) * (208.272 - Wasserstand*( 685.388 - Wasserstand*(104.58 + Wasserstand*( 9.89217 + Wasserstand*(1.52889 + Wasserstand)))))}
define FileLog_Tank FileLog ./log/Tank-%Y.log Tankinhalt
geht das so überhaupt??
wie baut man dann das neg Vorzeichen vom Wasserstand ein ?
noch einige Nüsse zu knacken >:(
So der Wasserstand wird nun auch mit dem richtigen Vorzeichen angezeigt.
ich weiß zwar leider nicht mehr ganz genau wie ich das geschafft habe
aber erst einmal egal
valueFN hab ich irgendwo gefunden und durch probieren dann hinbekommen :o
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BFactor -1
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand group Zisterne
attr Wasserstand room OWX
attr Wasserstand valueFn { ReadingsVal("Zisterne", "USensor", "160")+160 }
define FileLog_Wasserstand FileLog ./log/Wasserstand-%Y.log Wasserstand
so nun wird der Wasserstand im Dashboard richtig angezeigt
jetzt noch etwas Tuning da die Einheit noch fehlt und die 3 Stellen kann man sich auch sparen
ev erbarmt sich ja nun einer mir bei der Formel zu helfen
wie das eingebaut wird.
:(
darauf erst mal ein Blondes
Zitatev erbarmt sich ja nun einer mir bei der Formel zu helfen
Wenn Du die Antworten lesen würdest, die man Dir gibt, wärst Du wahrscheinlich fertig!
Gruß Joachim
ROFL
LG
pah
dannn werde ich morgen noch mal lesen
ich ahn da schon was
mit dem Wissenstand von gestern konnte ich damit aber noch nichts anfangen.
n8
@Joachim
"
--> userReadings
attr <mein Sensor> userReadings Volumen { (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(("<mein Sensor>","höhe",0)-0.32) * (208.272 - ("<mein Sensor>","höhe",0)*( 685.388 - ("<mein Sensor>","höhe",0)*(104.58 + ("<mein Sensor>","höhe",0)*( 9.89217 + ("<mein Sensor>","höhe",0)*(1.52889 + ("<mein Sensor>","höhe",0)))))) }
mal so aus der Hüfte, ohne Garantie
Gruß Joachim
"
Hab das Wiki, die commandref und das Einsteige PDf mehrfach gelesen und versucht zu verstehen. Für einen Nerd sicher wesentlich einfacher als für einen Anfänger... :-(
Das hat leider noch nicht hingehauen
Ich denke ich kann das in {} stehende mit entsprechenden Variablen zb USensor Zisterne etc in der Kommandozeile eingeben. dann kommen aber immer wieder Fehlermeldungen
Für einen Anfänger der ich nun mal noch bin ist es nicht so einfach die Syntax mit " , ) }, Ich kenne mich zwar recht gut mit Windows und PCs aus, hab aber noch nie vorher programmiert und da macht wie man im Forum hier ja auch bei anderen sehen kann die Syntax erhebliche Probleme. Sorry!
"Wenn Du die Antworten lesen würdest, die man Dir gibt, wärst Du wahrscheinlich fertig!"
Hab ich gelesen und auch versucht die Variablen zu ersetzen.
zB
attr <mein Sensor> userReadings Volumen { (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(("<mein Sensor>","höhe",0)-0.32) * (208.272 - ("<mein Sensor>","höhe",0)*( 685.388 - ("<mein Sensor>","höhe",0)*(104.58 + ("<mein Sensor>","höhe",0)*( 9.89217 + ("<mein Sensor>","höhe",0)*(1.52889 + ("<mein Sensor>","höhe",0)))))) }
für<mein Sensor> Zisterne gesetzt
für Tanklänge 5
für Höhe USensor
leider bisher ohne Erfolg, hab geprüft ob die Anzahl der abschließenden Klammern stimmt, also mehrfach eingegeben etc.
das hatte ich auch versucht als mir der String vorgeschlagen wurde.
Hab im Spät Nachmittag noch mal was Zeit zum lesen, verstehen? testen!
Herzlichen dank für den Vorschlag
@PAH
ich hoffe gut gelacht zu haben
im übrigen hat ein E Technik Igenieur und Programmierer die triviale Formel auch nicht verstanden, so trivial war es dann wohl auch nicht, selbst für ausgewachsenen Ingenieure
so ganz am Rande
http://www.t-online.de/computer/internet/id_47914726/lol-rofl-imho-internet-abkuerzungen-und-ihre-bedeutung.html
ROFL finden Deutsche gar nicht lustig
Die unbeliebteste Abkürzung in Deutschland war laut der Umfrage "ROFL", was für "Rolling On the Floor Laughing" steht und übersetzt in etwa Kugelt sich vor Lachen bedeutet. 35 Prozent der befragten deutschen Internetnutzer konnten diese Abkürzung nicht ausstehen.
???
aber
ich bekomm das schon noch hin
Hi,
also wenn man einen Editor verwendet, der z.B. ein wenig die Syntax prüft (z.B. Crimson Editor *free*), dann fällt einem auf, dass die folgende Klammer z.B. keinen Partner hat
{ (Tanklänge in m) * (2.01062 + 0.00274162 *sqrt(("<mein Sensor>","höhe",0)-0.32) * (208.272 - ("<mein Sensor>","höhe",0)*( 685.388 - ("<mein Sensor>","höhe",0)*(104.58 + ("<mein Sensor>","höhe",0)*( 9.89217 + ("<mein Sensor>","höhe",0)*(1.52889 + ("<mein Sensor>","höhe",0)))))) }
Ferner würde es wohl helfen, wenn du die Formel und die fehlenden Angaben sowie die Fehlermeldungen einmal aufführst, die du in dem Zusammenhang erhältst.
Greetz
Eldrik
Hallo
bei der Arbeit, Geld verdienen für die nächsten Bauteile :-)
Fehlermeldungen kommen noch, hab auch schon bei den vielen Klammern daran gedacht und ja auch geschrieben...
Im Einsteiger PDF wurde auch darauf hingewiesen das Notepad ++ eine Syntax Kontrolle hat, hab auch danach gesucht aber nicht gefunden, mit Link wäre das wohl super einfach gewesen.
Solche Beispiele in der Command ref sind halt nicht ganz trivial:
o userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}
aber wird schon
Den wasserstand hab ich ja schon, und mehr kann ich bisher auf dem manuellen Teil auch nicht sehen.
Moin Franz,
tröste Dich, ich bin auch kein Nerd, aber hartnäckig, was FHEM betrifft.
Da Grundsystem von userReadings hast Du ja schon verwndet, jetzt muss es "nur" noch mir der Formel verheiratet werden.
Das wird leider sehr schnell unübersichtlich, weshalb ich immer ersteinmal in einem vernünftigem Editor, z.B. Notepad++, versuche diese Formel blockweise korrekt aufzubauen, danach alle Blöcke verheiraten, und ganz zum Schluss das "x" ersetze.
Also in etwa so:
attr Wasserstand userReadings Volumen { 5 * (2.01062 + 0.00274162 *sqrt(("Wasserstand","state",0)-0.32)) }
| sollte klar sein | das auch | neuer Name| Formelteil zum Testen | das reading was für x eingesetzt wird | Rest der Formel |
wobei die "0" hier ("Wasserstand","state",0) angibt, welcher Wert zu setzen ist, wenn "state" undefiniert ist.
Diesen Formelteil kann man jetzt in FHEM einsetzen, und mittels Taschenrechner o.ä. überprüfen, ob er richtig ist. Wenn FHEM Fehlermeldungen wirft, ergründen, was sie bedeuten.
Dann den nächsten Formelteil, bis alle kleinen Happen funktionieren. Danach alles verheiraten.
Gruß Joachim
mit den Happen hab ich dann ja probiert
und so schlecht hab ich das ja bis zur Formel auch nicht hinbekommen ( muss mich selber mal loben, auch wenn andere das vielleicht anders sehen)
Notepad ++ hab ich ja, mir fehlt aber leider wohl eine Erweiterung die ich bisher noch nicht gefunden habe, es gab da zumindest ein Hinweis im Einsteiger PDF.
Danke schon einmal
werde heute im Spätnachmittag noch mal einen Anlauf wagen.
so doch geschafft
;D
habe dann doch die Formel aus dem Wiki genommen und erst einmal die Restfläche berechnet
im Code ist jeder Schritt einzeln erklärt und dann auskommentiert
Ich habe also Joachims Hinweis befolgt und Schritt für Schritt die Formel zusammengesetzt
vor lauter Klammern raucht mir jetzt der Kopf :P
Ein kleiner Schönheitsfehler noch , es wäre schön wenn das Ergebniss formatiert angezeigt wird
also in Litern bzw cm
und dann werde ich die zeit für das intervall noch hochsetzen, dürfte 1x in der Stunde reichen
dazu hab ich heute aber keine Lust mehr.
Mein Code hier mit Erklärungen in meiner echten fhem.cfg ist das jetzt raus, ist ja hier gespeichert.
Ich hoffe dem einen oder anderen hilft es
ich habe zumindest gelernt wie das mit dem Rechnen funktioniert
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand group Zisterne
attr Wasserstand room OWX
attr Wasserstand valueFn { (-1*(ReadingsVal("Zisterne", "USensor", "160")-160)) }
###################################################
###### Berechnung schrittweise #########
###################################################
define Tankinhalt readingsProxy Zisterne:USensor
attr Tankinhalt room OWX
#
# h- = (ReadingsVal("Zisterne", "USensor", "160")+0) h zur Zeit 60
# erst mal Tankinhalt für (1-h / r) h/80 in cm Rechnungen immer mit 60 und r = 80 cm
# attr Tankinhalt valueFn { (1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)) }
# Ergebnis 0,25
# r2*acos(1-h/r) alles in cm ! Ergebniss 8435.94 stimmt
# attr Tankinhalt valueFn { (6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))) }
# Ergebniss 8435.94 stimmt
# um ( r - h ) also - 20 ergänt also bis hierher r2*acos(1-h/r)-(r-h)
# attr Tankinhalt valueFn { ((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(80-(ReadingsVal("Zisterne", "USensor", "160")+0)))) }
# also 8435 - 20 = 8415,92 ok
# jetzt Wurzel aus 6000 das ist das Ergebniss aus 2*r*h-h2 testen sollte 77,45 sein
# attr Tankinhalt valueFn { sqrt(6000) }
# Ergebniss stimmt
# jetzt r2*acos(1-h/r)- (Wurzel aus 6000) *(r-h) das ist die Fläche die fehlt !
attr Tankinhalt valueFn { ((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(6000)*(80-(ReadingsVal("Zisterne", "USensor", "160")+0))))) }
# Ergebniss = 6886.74
# Gesamtfläche minus Fehlfläche = Fläche Wasser also r2*Pi = 20106,24 cm2 - 6886.74 cm2 = 13219,49 cm2
#attr Tankinhalt valueFn { (20106-((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(6000)*(80-(ReadingsVal("Zisterne", "USensor", "160")+0)))))) }
# Ergebniss = 13219,49 cm2 stimmt
# Volumen berechnen erst in m3 bei 500 cm Länge also mit 0,5 multiplizieren
#attr Tankinhalt valueFn { (0.5*(20106-((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(6000)*(80-(ReadingsVal("Zisterne", "USensor", "160")+0))))))) }
# Ergebniss 6600 Liter stimmt
# jetzt noch die Wurzel aus 6000 berechnen, also 2rh-h2 zuerst mal h2
#attr Tankinhalt valueFn {((ReadingsVal("Zisterne", "USensor", "160")+0)**2)}
#jetzt noch die Wurzel aus 6000 ausrechnen, also 2rh-h2
#attr Tankinhalt valueFn {(160*(ReadingsVal("Zisterne", "USensor", "160")+0)-((ReadingsVal("Zisterne", "USensor", "160")+0)**2))}
# so den Rest (6000) unter der Wurzel zusammenbauen
attr Tankinhalt valueFn { (0.5*(20106-((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(160*(ReadingsVal("Zisterne", "USensor", "160")+0)-((ReadingsVal("Zisterne", "USensor", "160")+0)**2))*(80-(ReadingsVal("Zisterne", "USensor", "160")+0))))))) }
#define FileLog_Wasserstand FileLog ./log/Wasserstand-%Y.log Wasserstand
so jetzt in der fhem.cfg
#######################################################################################
#### Zisterne ####
#### http://forum.fhem.de/index.php?action=post;topic=20480.0;last_msg=144944 ####
#######################################################################################
define Zisterne OWCOUNT DS2423 A2D993000002 600
attr Zisterne BName USensor
attr Zisterne BOffset -32
attr Zisterne BUnit cm|cm
attr Zisterne IODev USB9097
attr Zisterne model DS2423emu
attr Zisterne nomemory 1
attr Zisterne room OWX
define Wasserstand readingsProxy Zisterne:USensor
attr Wasserstand group Zisterne
attr Wasserstand room OWX
attr Wasserstand valueFn { (-1*(ReadingsVal("Zisterne", "USensor", "160")-160)) }
define Tankinhalt readingsProxy Zisterne:USensor
attr Tankinhalt group Zisterne
attr Tankinhalt room OWX
attr Tankinhalt valueFn { (0.5*(20106-((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(160*(ReadingsVal("Zisterne", "USensor", "160")+0)-((ReadingsVal("Zisterne", "USensor", "160")+0)**2))*(80-(ReadingsVal("Zisterne", "USensor", "160")+0))))))) }
und so sieht es im Dashboard jetzt aus, leidernoch ohne schöne Formatierung
(http://zisterne6.jpg)
jetzt das
ROFL
auf meiner Seite
Thanks an alle die mir auf die Sprünge geholfen haben
@PAH
ist das hier die Grundlage für die PN ?
sub acos {
# Polynomial approximation of acos
# Error <= 2E-8
#
# C. Hastings, Jr., "Approximations for digital computers",
# Princeton Univ. Press, 1955.
$a0 = 1.5707963050;
$a1 = -0.2145988016;
$a2 = 0.0889789874;
$a3 = -0.0501743046;
$a4 = 0.0308918810;
$a5 = -0.0170881256;
$a6 = 0.0066700901;
$a7 = -0.0012624911;
return (1-$x)**0.5 *($a0
+ $a1 * $x
+ $a2 * $x**2
+ $a3 * $x**3
+ $a4 * $x**4
+ $a5 * $x**5
+ $a6 * $x**6
+ $a7 * $x**7
);
Quote:
}
attr Tankinhalt valueFn { int((0.5*(20106-((6400*(acos(1-((ReadingsVal("Zisterne", "USensor", "160")+0)/80)))-(sqrt(160*(ReadingsVal("Zisterne", "USensor", "160")+0)-((ReadingsVal("Zisterne", "USensor", "160")+0)**2))*(80-(ReadingsVal("Zisterne", "USensor", "160")+0)))))))) }
dann ist es ohne Kommastellen
Nein, die polynomiale Approximation ist die der gesamten Formel (bis auf die Wurzel) aus einem zweiminütigen Anwerfen von Mathematica.
Kann man auch selber überprüfen in WolframAlpha.
LG
pah
@ Joachim
mit dem int war ja schon auf der richtigen Spur, aber die Syntax :-(
wird ja schon besser
aber da sieht man was man noch lernen muss / will
mit den Angaben Liter und cm hab ich mit einem Alias etwas getrickst - wenn man nicht weiß wie es geht.....
(http://zisterne7.jpg)
so das wars
Glückwunsch
ja
war auch ein harter zeitaufwendiger Kampf.
und das Logfile mit SVG Plot ist nun auch fertig ( das konnte ich ja schon )
Thanks a lot
Setze den Tread dann bitte auf gelöst.
Gruß Joachim