FHEM Forum

FHEM - Entwicklung => Wunschliste => Thema gestartet von: MadCat am 24 November 2014, 17:13:53

Titel: Tackt Modul
Beitrag von: MadCat am 24 November 2014, 17:13:53
Guten Tag,

zur Steuerung meiner Solarpumpe Wünschte ich mir ein Tackt Steuerung.
Derzeit lasse ich die Solarpumpe über das Tresholdmodul laufen, das funktioniert auch soweit, aber durch die Hysteresesteuerung kommt es zu extremen Temperaturschwankungen und sehr langen Taktzyklen der Pumpe, was den Ertrag schmälert und zu Verwirbelungen im Schichtenspeicher führt.

Ich bräuchte eine Steuerung die abhängig von den Temperatursensoren (bei mir zwei) die Pumpe Taktet um einen voreingestellten Sollwert zu erreichen.

Also Istwert zu niedrig = Taktrate verringern
Istwert zu hoch = Taktrate erhöhen

Leider weiß ich nicht wie für fhem ein Modul erstellt wird und in Perl kenne ich mich noch nicht aus, sonnst würde ich das einmal versuchen auf die Beine zu stellen.

LG Ralph
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 25 November 2014, 14:19:54
Hi Ralph,

eigentlich würde ich dir eher empfehlen, dafür einen autarken Solarregler zu nehmen. Mir wär das zu heiß, im Sommer bei voller Sonne ggf. keine Zirkulation zu haben.

Du brauchst dafür erst mal kein extra Modul. Such dir am Besten in etwa passende Codebeispiele im WIKI und setzte das Ganze in für dich angepasster Form in die "99_myUtils.pm". Wie das geht, steht auch im Wiki. Taste dich einfach ran, wie z.B.: "Wenn Sensor A größer X und Sensor B kleiner Y dann Pumpe ein..." Ensprechend auch wieder für aus. Dabei verstehst du den einfachen Perl- Kram und entwickelst das Ganze nach und nach dahin, wo du es hin haben möchtest.
Wenn das dann läuft aber ziemlich groß geworden ist, gibt es im WIKI eine Anleitung, wie man sowas in ein Modul packt.

Gruß

Frank
Titel: Antw:Tackt Modul
Beitrag von: Wuppi68 am 25 November 2014, 14:31:17
es gibt doch auch den PID Regler ... da kannst Du doch die Parameter selber tunen
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 25 November 2014, 21:31:36
@fiedel

Fehlende Zirkulation ist kein Problem, ich habe die Anlage sogar bewusst so ausgelegt das Ihr das nix ausmacht "Stemback" bei Bedarf kann ich den Solarkreislauf auch jeder Zeit vollständig entlehren, da ich ohne Glykol fahre.
Danke für den Hinweis, auf das 99_myUtils.pm bin ich Heute auch schon gestoßen und habe es bereits in Betracht gezogen, auch für andere Ideen.
Aber bis ich mich in Perl eingearbeitet habe und daraus ein Modul entstanden ist wird sicherlich ne ganze Weile dauern, wenn ich es denn schaffe.

@Wuppi68

Den PID Regler kann ich für das was ich bräuchte auch nicht verwenden, dabei geht man ja davon aus das bestimmte Regelgrößen bekannt sind und lediglich die Eingriffszeit manipuliert wird um schneller das gewünschte Ergebnis zu erreichen und da die Sonne bzw. Wolken unberechenbar bar sind, geht das mit einer PID Steuerung nicht.
Am Optimalsten wäre eine Packetwellen Steuerung, dazu bräuchte ich dann aber wieder ein extra Steuermodul.

Ich habe mir mal die Zeit genommen und über einen längeren Zeitraum die Pumpe Manuell ein und ausgeschaltet, so wie ich mir die Steuerung vorstelle, immer in etwas längeren oder kürzeren Intervallen,je nachdem in welche Richtung die Kollektortemperatur ging und das hat sehr gut funktioniert.
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 25 November 2014, 21:52:16
ZitatIch habe mir mal die Zeit genommen und über einen längeren Zeitraum die Pumpe Manuell ein und ausgeschaltet, so wie ich mir die Steuerung vorstelle, immer in etwas längeren oder kürzeren Intervallen,je nachdem in welche Richtung die Kollektortemperatur ging und das hat sehr gut funktioniert.

Versuche das mal in Worte (Pflichtenheft (http://juergen-bayer.net/buecher/programmierenlernen/artikel/Programmentwurf/Programmentwurf.aspx#h2_94)), oder ein Ablaufdiagramm zu fassen. Vielleicht kann ich dir dann den einen oder anderen Ansatz liefern. Meine Prog.- Kenntnisse sind allerdings auch noch auf Anfängerniveau.
Außerdem ist es vor so einem Projekt immer gut, wenn man sich erst mal so genau wie möglich klar macht, was man wie umsetzen möchte. Suche dir doch im Netz dazu vielleicht eine Funktionsbeschreibung eines kommerziellen Solarreglers.
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 25 November 2014, 23:17:06
Zitat von: fiedel am 25 November 2014, 21:52:16
Versuche das mal in Worte (Pflichtenheft), oder ein Ablaufdiagramm zu fassen. Vielleicht kann ich dir dann den einen oder anderen Ansatz liefern. Meine Prog.- Kenntnisse sind allerdings auch noch auf Anfängerniveau.
Außerdem ist es vor so einem Projekt immer gut, wenn man sich erst mal so genau wie möglich klar macht, was man wie umsetzen möchte. Suche dir doch im Netz dazu vielleicht eine Funktionsbeschreibung eines kommerziellen Solarreglers.

Was meinst Du mit Pflichtenheft?

Der Ablauf muss in einer Schleife erfolgen, in etwa so

Wenn die Ist Temperatur größer ist als Soll, dann die Schalt dauer erhöhen,
Ist die Ist Temperatur kleiner, die Schalt dauer verkürzen

Als Javascript würde ich das hinbekommen, aber noch habe ich Null Ahnung von Perl

Manche Kommerziellen Solar Regler arbeiten nach dem selben oder ähnlichen Prinzip.
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 26 November 2014, 07:32:50
Hi,

mit "Pflichtenheft" meinte ich eine möglichst genaue Programmbeschreibung in Worten. Habs oben mal verlinkt.
Hier ist ein Beispielprojekt (http://solar.thermotemp.de/control.php), wo das Prinzip beschrieben wird. Ich vermute du kennst das?  ;)

Wenn du es in JS schreibst und gut kommentierst, kann es dir vielleicht jemand in Perl übersetzen. Einige Leute können hier beides. Dann würde sich die Programmbeschreibung auch erübrigen.
Titel: Antw:Tackt Modul
Beitrag von: Prof. Dr. Peter Henning am 26 November 2014, 09:23:36
Leute, bitte als Neuling etwas mehr lesen und nachdenken. Gesucht wird kein "Tackt"-Modul (auweia...), sondern nur eine Proportionalsteuerung Messwert -> Einschaltzeit.

Das ist aber trivial einfach und kann ohne eigenes Modul sogar mit FHEM-Bordmitteln umgesetzt werden: Je nach Temperatur wird ein "on-for-timer" Befehl abgesetzt - den verstehen verschiedene Module zur Ansteuerung von Schalt-Hardware.

Und drei Zeilen, um die gewünschte Zeit aus dem Messwert der Temperatur zu berechen, kann man innerhalb von 2 Stunden auch als Neuling "lernen".

pah
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 26 November 2014, 12:06:59
Zitat von: Prof. Dr. Peter Henning am 26 November 2014, 09:23:36
Das ist aber trivial einfach

Und drei Zeilen, um die gewünschte Zeit aus dem Messwert der Temperatur zu berechen, kann man innerhalb von 2 Stunden auch als Neuling "lernen".

Na zum jetzigen Zeitpunkt sehe ich das noch nicht so einfach ::)

Als Neuling steht man mitten in einem Wust von Neuen Begriffen, Techniken, Möglichkeiten und sieht dann oft die Lösung vor den Augen nicht  das kommt dann halt alles mit der Zeit und der Erfahrung und der Hilfe durch ein Forum.
Ich lerne jeden Tag mehr und komme immer besser mit fhem und Linux klar, ist also alles nur eine Frage der Zeit, aber ab und ann braucht man auch schon mal einen kleinen schubs in die richtige Richtung um weiter zu kommen.

Hab Tante google mal gefragt was eine Proportionalsteuerung ist und es beschreibt das was ich suche.

Ich werde dann mal am Wochenende versuchen das hin zu bekommen, ob ich das in 2 Stunden schaffe?  :o
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 27 November 2014, 15:35:26
Konnte bis zum Wochenende nicht warten und habe schon mal angefangen zu Coden, ich hoffe ich bin auf dem richtigen Weg, was ich derzeit nicht weiß ist wie ich die Taktung erstellen soll. Die Taktrate soll 1Sec. betragen.

Bis jetzt sieht das so aus.

Zitat
my $k1v = Kollektor1_VT.get;
my $k2v = Kollektor2_VT.get;
my $k1r = Kollektor1_RT.get;
my $k2r = Kollektor2_RT.get;
my $kr = Kollektor_RT.get;
my $st = 40 #Solltemperatur/Puffertemperatur
my $sp = Solarkreispumpe;
my $tr = Taktrate;

If ($k1v OR $k2v OR $k1r OR $k2r > $st) {
   $sp = ON;
   If ($Kr > $st) {
   $tr = +1;
   }
   if ($kr < $st) {
   $tr = -1;
   }
   } else {
   $tr = 0;
   }
} else {
   $sp = off;
}

Gruß Ralph
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 27 November 2014, 16:48:33
Na ist doch schon mal was.  :) Wird wohl so nicht gehen, aber ich verstehe wohin du willst. Erkläre mal noch die Taktrate! Was soll die machen? Ggf. erkläre mal einen Programmzyklus, wie du ihn dir vorstellst.
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 27 November 2014, 18:25:08
Programmablauf sollte wie folgt aussehen.

Kollektortemperatur erreicht Pumpe an (Takt = 1s an, 1s aus)
Solltempereatur  Rücklauf überschritten Takt +1 (Takt solange erhöhen bis Solltemperatur erreicht)
Solltemperatur Rücklauf unterschritten Takt -1 (Taktrate verringern bis Solltemperatur erreicht)
Kollektortemperatur unterschritten Pumpe aus

Gruß Ralph
Titel: Antw:Tackt Modul
Beitrag von: Prof. Dr. Peter Henning am 27 November 2014, 18:57:44
Nicht in "Taktrate" denken. Sondern in Zeiten bis zum nächsten Schalten. Taktrate ist eine Größe, die über mehrere Zyklen bestimmt wird - die Schaltzeit hingegen ist eine zeitlokale Größe.

LG

pah
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 27 November 2014, 19:25:41
Hm, ungewöhnlich was du da vor hast. Aber du hast es ja empirisch ermittelt - probiere es einfach aus und lerne ggf. daraus!
Noch eine Detailfrage: Was ist das für ein Aktor? versteht der "on-for-timer" (HM oder FS20)?
Dein Programm wird immer neu ausgeführt, wenn dein definiertes Event reinkommt. Oder ist das ein "at"? Ggf. kopiere das mal komplett aus der CFG heraus. Dann kann ich es besser umstricken und sehe gleich alles was nötig ist. Vielleicht auch die Def. der Sensoren und des Aktors.
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 27 November 2014, 19:37:05
Hallo fiedel

Das ganze läuft über NetIOs, die Temperaturen werden über Onewire eingelesen und die Pumpen über Relais gesteuert, läuft also alles über das ECMD Modul.

Gruß Ralph
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 28 November 2014, 08:16:26
Rücke mal noch das Define raus, oder den gesamten Teil aus deiner fhem.cfg! Ich muss da ein spezielles Attr. einbauen. Und den Befehl um die Pumpe ein/aus zu schalten kannst du auch gleich posten (so wie du es aktuell aus fhem heraus schaltest).
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 28 November 2014, 12:06:40
Hallo Frank

meine fhem.cfg sieht zur Zeit so aus.

attr global userattr devStateIcon devStateStyle icon sortby webCmd widgetOverride
attr global autoload_undefined_devices 1
attr global logfile /opt/fhem/log/fhem-%Y-%m.log
attr global modpath .
attr global motd SecurityCheck:\
\
WEB,WEBphone,WEBtablet has no basicAuth attribute.\
telnetPort has no password/globalpassword attribute.\
\
Restart FHEM for a new check if the problem is fixed,\
or set the global attribute motd to none to supress this message.\

attr global statefile /opt/fhem/log/fhem.save
attr global updateInBackground 1
attr global verbose 3

define telnetPort telnet 7072 global

define WEB FHEMWEB 8083 global
attr WEB hiddenroom DashboardRoom

define WEBphone FHEMWEB 8084 global
attr WEBphone hiddenroom DashboardRoom
attr WEBphone stylesheetPrefix smallscreen

define WEBtablet FHEMWEB 8085 global
attr WEBtablet hiddenroom DashboardRoom
attr WEBtablet stylesheetPrefix touchpad

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog /opt/fhem/log/fhem-%Y-%m.log Kollektor1_Ruecklauf:.*|fakelog

define autocreate autocreate
attr autocreate filelog /opt/fhem/log/%NAME-%Y.log

define eventTypes eventTypes /opt/fhem/log/eventTypes.txt

# Disable this to avoid looking for new USB devices on startup
define initialUsbCheck notify global:INITIALIZED usb create

define NETIO_01 ECMD telnet 192.168.1.71:2701
attr NETIO_01 classdefs ONEWIRE=./onewire1.classdef:RELAIS=./relais1.classdef

define NETIO_02 ECMD telnet 192.168.1.72:2701
attr NETIO_02 classdefs ONEWIRE=./onewire2.classdef:RELAIS=./relais2.classdef

define Kollektor1_Vorlauf ECMDDevice ONEWIRE 28a6f6130500004f
attr Kollektor1_Vorlauf IODev NETIO_01
attr Kollektor1_Vorlauf group Solar
attr Kollektor1_Vorlauf room Solar
attr Kollektor1_Vorlauf stateFormat { sprintf("%s°C",ReadingsVal("Kollektor1_Vorlauf","T",0)) }

define Kollektor1_Ruecklauf ECMDDevice ONEWIRE 2886cf2b0600003e
attr Kollektor1_Ruecklauf IODev NETIO_01
attr Kollektor1_Ruecklauf group Solar
attr Kollektor1_Ruecklauf room Solar
attr Kollektor1_Ruecklauf stateFormat { sprintf("%s°C",ReadingsVal("Kollektor1_Ruecklauf","T",0)) }

define Kollektor2_Vorlauf ECMDDevice ONEWIRE 283c292c06000036
attr Kollektor2_Vorlauf IODev NETIO_01
attr Kollektor2_Vorlauf group Solar
attr Kollektor2_Vorlauf room Solar
attr Kollektor2_Vorlauf stateFormat { sprintf("%s°C",ReadingsVal("Kollektor2_Vorlauf","T",0)) }

define Kollektor2_Ruecklauf ECMDDevice ONEWIRE 288d13d10400009c
attr Kollektor2_Ruecklauf IODev NETIO_01
attr Kollektor2_Ruecklauf group Solar
attr Kollektor2_Ruecklauf room Solar
attr Kollektor2_Ruecklauf stateFormat { sprintf("%s°C",ReadingsVal("Kollektor2_Ruecklauf","T",0)) }

define Puffer1_25 ECMDDevice ONEWIRE 283866620500007d
attr Puffer1_25 IODev NETIO_01
attr Puffer1_25 group Heizung
attr Puffer1_25 room Heizung,Solar
attr Puffer1_25 stateFormat { sprintf("%s°C",ReadingsVal("Puffer1_25","T",0)) }

define Puffer1_50 ECMDDevice ONEWIRE 28b37362050000c1
attr Puffer1_50 IODev NETIO_01
attr Puffer1_50 group Heizung
attr Puffer1_50 room Heizung,Solar
attr Puffer1_50 stateFormat { sprintf("%s°C",ReadingsVal("Puffer1_50","T",0)) }

define Puffer1_75 ECMDDevice ONEWIRE 2833dd670500003b
attr Puffer1_75 IODev NETIO_01
attr Puffer1_75 group Heizung
attr Puffer1_75 room Heizung,Solar
attr Puffer1_75 stateFormat { sprintf("%s°C",ReadingsVal("Puffer1_75","T",0)) }

define Puffer1_100 ECMDDevice ONEWIRE 28bb2068050000a0
attr Puffer1_100 IODev NETIO_01
attr Puffer1_100 group Heizung
attr Puffer1_100 room Heizung,Solar
attr Puffer1_100 stateFormat { sprintf("%s°C",ReadingsVal("Puffer1_100","T",0)) }

define Kessel_temp ECMDDevice ONEWIRE 28430E2C06000023
attr Kessel_temp IODev NETIO_02
attr Kessel_temp group Ofen
attr Kessel_temp room Wohnung1,Heizung
attr Kessel_temp stateFormat { sprintf("%s°C",ReadingsVal("Kessel_temp","T",0)) }

define Kesselvor_temp ECMDDevice ONEWIRE 282e7e2a060000ce
attr Kesselvor_temp IODev NETIO_02
attr Kesselvor_temp group Ofen
attr Kesselvor_temp room Heizung
attr Kesselvor_temp stateFormat { sprintf("%s°C",ReadingsVal("Kesselvor_temp","T",0)) }

define Kesselrueck_temp ECMDDevice ONEWIRE 282E7E2A060000CE
attr Kesselrueck_temp IODev NETIO_02
attr Kesselrueck_temp group Ofen
attr Kesselrueck_temp room Heizung,Wohnung1
attr Kesselrueck_temp stateFormat { sprintf("%s°C",ReadingsVal("Kesselrueck_temp","T",0)) }

define Kesselmisch_temp ECMDDevice ONEWIRE 286b17d104000018
attr Kesselmisch_temp IODev NETIO_02
attr Kesselmisch_temp group Ofen
attr Kesselmisch_temp room Heizung
attr Kesselmisch_temp stateFormat { sprintf("%s°C",ReadingsVal("Kesselmisch_temp","T",0)) }

define Heizkreis_Vorlauf ECMDDevice ONEWIRE 28ae1b2c060000ee
attr Heizkreis_Vorlauf IODev NETIO_01
attr Heizkreis_Vorlauf group Heizung
attr Heizkreis_Vorlauf room Heizung
attr Heizkreis_Vorlauf stateFormat { sprintf("%s°C",ReadingsVal("Heizkreis_Vorlauf","T",0)) }

define Heizkreis_Ruecklauf ECMDDevice ONEWIRE 285BB52B06000060
attr Heizkreis_Ruecklauf IODev NETIO_01
attr Heizkreis_Ruecklauf group Heizung
attr Heizkreis_Ruecklauf room Heizung
attr Heizkreis_Ruecklauf stateFormat { sprintf("%s°C",ReadingsVal("Heizkreis_Ruecklauf","T",0)) }

define Solar_Vorlauf ECMDDevice ONEWIRE 280f7d2b0600008e
attr Solar_Vorlauf IODev NETIO_01
attr Solar_Vorlauf group Solar
attr Solar_Vorlauf room Solar
attr Solar_Vorlauf stateFormat { sprintf("%s°C",ReadingsVal("Solar_Vorlauf","T",0)) }

define Solar_Ruecklauf ECMDDevice ONEWIRE 2820F4D00400008E
attr Solar_Ruecklauf IODev NETIO_01
attr Solar_Ruecklauf group Solar
attr Solar_Ruecklauf room Solar
attr Solar_Ruecklauf stateFormat { sprintf("%s°C",ReadingsVal("Solar_Ruecklauf","T",0)) }

define oneWire_Temp at +*00:00:10 set Kollektor1_Vorlauf messen;; sleep 1;; get Kollektor1_Vorlauf T set Kollektor1_Ruecklauf messen;; sleep 1;; get Kollektor1_Ruecklauf T set Kollektor2_Vorlauf messen;; sleep 1;; get Kollektor2_Vorlauf T set Kollektor2_Ruecklauf messen;; sleep 1;; get Kollektor2_Ruecklauf T set Puffer1_25 messen;; sleep 1;; get Puffer1_25 T set Puffer1_50 messen;; sleep 1;; get Puffer1_50 T set Puffer1_75 messen;; sleep 1;; get Puffer1_75 T set Puffer1_100 messen;; sleep 1;; get Puffer1_100 T set Kessel_temp messen;; sleep 1;; get Kessel_temp T set Kesselvor_temp messen;; sleep 1;; get Kesselvor_temp T set Kesselrueck_temp messen;; sleep 1;; get Kesselrueck_temp T set Kesselmisch_temp messen;; sleep 1;; get Kesselmisch_temp T set Heizkreis_Vorlauf messen;; sleep 1;; get Heizkreis_Vorlauf T set Heizkreis_Ruecklauf messen;; sleep 1;; get Heizkreis_Ruecklauf T set Solar_Vorlauf messen;; sleep 1;; get Solar_Vorlauf T set Solar_Ruecklauf messen;; sleep 1;; get Solar_Ruecklauf T

define Heizkreispumpe ECMDDevice RELAIS 04
attr Heizkreispumpe IODev NETIO_01
attr Heizkreispumpe group Heizung
attr Heizkreispumpe room Heizung
define Heizkreisventil ECMDDevice RELAIS 02
attr Heizkreisventil IODev NETIO_01
attr Heizkreisventil group Heizung
attr Heizkreisventil room Heizung
define Solarkreispumpe ECMDDevice RELAIS 01
attr Solarkreispumpe IODev NETIO_01
attr Solarkreispumpe group Solar
attr Solarkreispumpe room Solar
define Solarkreisventil ECMDDevice RELAIS 08
attr Solarkreisventil IODev NETIO_01
attr Solarkreisventil group Solar
attr Solarkreisventil room Solar
define Kesselpumpe ECMDDevice RELAIS 80
attr Kesselpumpe IODev NETIO_01
attr Kesselpumpe group Ofen
attr Kesselpumpe room Heizung

define Uebersicht Dashboard
attr Uebersicht dashboard_colcount 3
attr Uebersicht dashboard_showtooglebuttons 0
attr Uebersicht dashboard_tab1groups Ofen,Solar,Heizung
attr Uebersicht dashboard_tab1icon Wetter
attr Uebersicht dashboard_tab1name Heizung
attr Uebersicht dashboard_tab1sorting 1
attr Uebersicht dashboard_tab2groups Wetter
attr Uebersicht dashboard_tab2name Wetter
attr Uebersicht dashboard_tabcount 1
define Uebersicht_weblink weblink htmlCode {DashboardAsHtml("Uebersicht")}
attr Uebersicht_weblink room DashboardRoom
define Wettervorhersage Weather 705621 1800 de
attr Wettervorhersage group Wetter,
attr Wettervorhersage room Wetter
define Forecast Weather 705621 1800 de
attr Forecast room Wetter
define MyWeatherWeblink weblink htmlCode { WeatherAsHtmlH("Wettervorhersage") }
attr MyWeatherWeblink group Wetter
attr MyWeatherWeblink room Wetter

define Ofensteuerung THRESHOLD Kessel_temp|set Kesselpumpe on|set Kesselpumpe off|1
attr Ofensteuerung group Ofen
attr Ofensteuerung number_format %.1f
attr Ofensteuerung room Heizung
attr Ofensteuerung state_format _m _dv

define Solarsteuerung THRESHOLD Kollektor1_Ruecklauf OR Kollektor2_Ruecklauf|set Solarkreispumpe on|set Solarkreispumpe off|1
attr Solarsteuerung group Solar
attr Solarsteuerung number_format %.1f
attr Solarsteuerung room Solar
attr Solarsteuerung state_format _m _dv


Gruß Ralph
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 28 November 2014, 20:29:58
Hi Ralph,

na dann probier mal:


# eintragen bei "attr global userattr": taktrate !!!

define Func_Solar_Control_A at +*00:00:10  { \
\
my $k1v = (ReadingsVal("Kollektor1_Vorlauf", "T", "0"));;\
my $k2v = (ReadingsVal("Kollektor2_Vorlauf", "T", "0"));;\
my $k1r = (ReadingsVal("Kollektor1_Ruecklauf", "T", "0"));;\
my $k2r = (ReadingsVal("Kollektor2_Ruecklauf", "T", "0"));;\
my $kr = ($k1r + $k2r / 2);;\
my $st = 40;;\
my $sp = Value("Solarkreispumpe");;\
my $t_plus = AttrVal("Func_Solar_Control_A","taktrate",1) + 1 ;;\
my $t_minus = AttrVal("Func_Solar_Control_A","taktrate",1) - 1 ;;\
my $tr = AttrVal("Func_Solar_Control_A","taktrate",1);;\
\
if ($k1v > $st or $k2v > $st or $k1r > $st or $k2r > $st) { \
   if ($sp = off) {\
   fhem("set Solarkreispumpe on");;\
   fhem("define SPump_Off_A at +$tr set Solarkreispumpe off");;\
      }\
   } \
if ($kr > $st) { \
   fhem("attr Func_Solar_Control_A taktrate $t_plus");;\
   } \
if ($kr < $st and $tr >= 1 ) { \
   fhem("attr Func_Solar_Control_A taktrate $t_minus");;\
   } \
else { \
   fhem("attr Func_Solar_Control_A taktrate 0") ;;\
   } \
}
attr Func_Solar_Control_A taktrate 1


Das ist einfach mal ungetestet ins Blaue getippt. Teste es mal in Ruhe, achte auf Fehlermeld. im Log und passe es dir nach Wunsch an.
Es sollte vom Prinzip her in etwa das machen, was du willst. Sollte etwas daran absolut nicht gehen, könntest du statt "at" ein "notify" draus machen und auf einen der Sensoren triggern. Das "at" verwende ich normalerweise ungern, weil es manche Funktionen kommentarlos einfach nicht ausführt. Aber prob. geht über stud.!  ;)

Gruß

Frank
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 28 November 2014, 20:56:10
Hallo Frank

danke für den Code, werde Ihn morgen einmal ausprobieren, soll ja Sonnig werden  8)

Werde dann Bericht erstatten wies gelaufen ist, hab aber schon gesehen das ich bei der Zeitschleife zu kompliziert gedacht habe.

Gruß Ralph
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 28 November 2014, 21:40:07
Oh Oh , hab da wohl irgendwie Mist gemacht,

Wenn ich den Code in die 99_Utils.pm eintrage kommen da folgende Fehler.


syntax error at ./FHEM/99_Utils.pm line 346, near "*00:" syntax error at ./FHEM/99_Utils.pm line 359, near "if" syntax error at ./FHEM/99_Utils.pm line 363, near "}" syntax error at ./FHEM/99_Utils.pm line 367, near "}" syntax error at ./FHEM/99_Utils.pm line 370, near "}" syntax error at ./FHEM/99_Utils.pm line 373, near "}"
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 28 November 2014, 22:41:31
Der Code ist komplett für die CFG. Das mit der Utils ist das Sahnehäubchen, wenn es dann irgendwann funktioniert. So mache ich das immer. Und unbedingt das attr. "taktrate" oben bei "global userattr... " eintragen. Sonst geht es nicht.

Zum debuggen und forschen kannst du zusätzlich Zeilen einfügen, die dir die Variableninhalte ins Log schreiben wie z.B.:



    Log 1, "Aktuelle Taktrate: $tr";; \

Titel: Antw:Tackt Modul
Beitrag von: MadCat am 28 November 2014, 23:39:33
OK, habs geändert, dann Meckert aber die .cfg das Sie das nicht kennt, warum auch immer. "fhem("set"
Titel: Antw:Tackt Modul
Beitrag von: fiedel am 29 November 2014, 08:47:33
Na ja, wie gesagt - ins Blaue getippt. Habs oben gefixt, es hat ein "\" nach einer Klammer gefehlt.
Aber viel wichtiger: Ich hab was übersehen was gar kein Problem wäre, wenn dein Pumpenaktor "on-for-timer" verstehen würde:

Das at in der Zeile zum Pumpe wieder ausschalten fhem("define SPump_Off_A at +$tr set Solarkreispumpe off");;\ erwartet ja eine Zeitangabe in der Form "00:00:00". Das müsste jetzt aus den Sekunden die ich mit der Berechnung erzeuge in dieses Format gewandelt werden. Da muss ein echter Perlexperte ran!  :-\
Alternative wäre das mit einem fhem-wait zu machen, welches Sekunden versteht und das System nicht aufhält. In etwa so: fhem("wait $tr;;;; set Solarkreispumpe off");;\ Einfach probieren...

Edit:

Das wäre so eine Umrechnungsroutine (Quelle (http://www.inspire-world.de/perlcgi/workshops/sec_to_time.html)):


sub umrechnen {
($zeit_sec) = @_;
$sec = $zeit_sec % 60;
$zeit_sec = ($zeit_sec - $sec) / 60;
$minute = $zeit_sec % 60;
$zeit_sec = ($zeit_sec - $minute) / 60;
$hour = $zeit_sec % 24;
$zeit_sec = ($zeit_sec - $hour) / 24;
$day = $zeit_sec % 7;
$week = ($zeit_sec - $day) / 7;
return ($hour,$minute,$sec);
}



Oder das hier (Quelle (http://www.perlunity.de/perl/forum/thread_006498.shtml)):


$sec = ´16541´; #sekunden

$m = int $sec / 60;
$s = $sec - ($m * 60);
$h = int $m / 60;
$m = $m - ($h * 60);

$timestring = printf("%03d:%02d:%02d",$h,$m,$s);
chop($timestring);

print "\n$timestring\n"; #004:35:41


Um das jetzt sinnvoll einzubauen fehlt mir leider die Zeit, aber ich denke du hast genug Input um das auszutüfteln. Ich würde diese Zeitfunktion als Sub in die myUtils verfrachten und den zurückgegebenen Wert dann wieder in eine Variable schreiben, die dann in das at kommt. Oder so ähnlich...  ;)

Du kannst auch mal forschen, ob dein Aktor nicht doch "on-for-timer" kann. Falls nicht, gibt es vielleicht einen Trick, das zu emulieren. Hab sowas im Forum schon mal irgendwann gesehen. Das würde sie Sache enorm vereinfachen.
Titel: Antw:Tackt Modul
Beitrag von: MadCat am 29 November 2014, 10:55:45
Hallo Frank,

Du hast mir einen Riesen Schritt weitergeholfen, Sobald mal wieder die Sonne scheint werde ich es ausprobieren und Berichten ob und wies Läuft.

Gruß Ralph