DS2423 Counter mit Ultraschallsensor am usb9097 pcsensor

Begonnen von Franz Tenbrock, 19 Februar 2014, 19:08:43

Vorheriges Thema - Nächstes Thema

Franz Tenbrock

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   >:(
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

#31
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
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Joachim

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232


Franz Tenbrock

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
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

@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

cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

eldrik

#36
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

Franz Tenbrock

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.
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Joachim

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Franz Tenbrock

#39
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.
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Franz Tenbrock

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:
}

cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Joachim

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
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Prof. Dr. Peter Henning

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

Franz Tenbrock

@ 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
cubi3, Cul 868, ESA2000WZ, EM1000GZ,  FS20, dashboard, 1-Wire, Max Thermos, Max Wandthermo, Max Lan, Fritzbox callmonitor, , nanocul, HM Led16, HM Bewegungsmelder, HM Schalter, RPi, banana, ESP8266, DoorPi

Joachim

FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232