Proportional nachgeführte Ansteuerung

Begonnen von Schorsch, 13 April 2013, 19:18:02

Vorheriges Thema - Nächstes Thema

Schorsch

Hi,

ich steh gerade auf dem Schlauch und würde mich über Tipps freuen.
Ziel ist es, ein über 0-10V steuerbares Ladegerät nach Solaranlagenleistung anzusteuern. Muss nichtmal stufenlos sein.

Als Solarleistung bekomme ich vom Device "sv" ein Reading "currentPower" von 0...3500 geliefert.
Die 0-10V des Laders spreche ich über ein Device "1W_0_10V" an, das konfiguriere ich über das Command "PIO.BYTE" mit den Werten "0" für 0V bis "255" für 10V.

Das einzige, was mir einfällt, ist ein stufiges Notify wie (hier mal nur 4 Stufen):

define n_ChgIfPwr notify sv:currentPower.* {\
 if (ReadingsVal("sv","currentPower",0) < 1000) {\
     fhem("set 1W_0_10V PIO.BYTE 0");;\
   }\
 } else {\
 if (ReadingsVal("sv","currentPower",0) < 2000) {\
     fhem("set 1W_0_10V PIO.BYTE 150");;\
   }\
 } else {\
 if (ReadingsVal("sv","currentPower",0) < 3000) {\
     fhem("set 1W_0_10V PIO.BYTE 200");;\
   }\
 } else {\
      fhem("set 1W_0_10V PIO.BYTE 255");;\
 }\
}


Mal abgesehen davon, dass der Code noch fehlerhaft ist und nicht läuft (manuell kann ich die Werte aber setzen), gefällt mir die Lösung nicht, denn ich müsste schon 10 Stufen oder so bauen.

Kennt Ihr schlauere Alternativen? Man kann von Linearität ausgehen, daher überlege ich, ob man nicht einfach einen Faktor setzen sollte (Wert von currentPower * 0,06 z.B.) - aber wie schreibt man das? Ich brauche Ganzzahlen, die würde ich aber wohl mit sprintf bekommen...

PID und THRESHOLD funktionieren für meine Anwendung glaube ich nicht, nach dem, was ich so gelesen habe.

Danke und viele Grüße!
Schorsch

Damian

Hallo Schorsch,

im Prinzip sollte es mit einem Notify stufenlos gehen. Wenn dezimale Voltzahlen angegeben werden können:

define n_ChgIfPwr notify sv:currentPower.* {my $cp=ReadingsVal("sv","currentPower",0);;my $Volt=$cp/13.725;;fhem("set 1W_0_10V PIO.BYTE $Volt")}

Wenn dezimale Voltzahlen nicht funktioniern, dann muss man vorher noch runden.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

Zum Beispiel so (natuerlich ungetestet):


define n_ChgIfPwr notify sv:currentPower.* { fhem "set 1W_0_10V PIO.BYTE ".int($EVENT1*0.07286) }


$EVENT1 entspricht in diesem Fall ReadingsVal("sv","currentPower",0)

Schorsch

Vielen Dank Euch beiden! Es läuft. Habe Rudolfs Zeile genommen und bin immer wieder fasziniert, wie kurz man schreiben kann, wenn man kann. Hatte mit Dummy und userReadings rumprobiert heute morgen...

Lediglich $EVENT1 ging nicht (vielleicht wäre es $EVENT0 gewesen), habe jetzt aber
define n_ChgIfPwr notify sv:currentPower.* { fhem "set 1W_0_10V PIO.BYTE ".int(ReadingsVal("sv","currentPower",0)*0.07286) } geschrieben, damit ich später noch weiß, was ich gemacht habe.

Jetzt lädt das Auto nach Sonneneinstrahlung :-)

Schönen Sonntag!