Tackt Modul

Begonnen von MadCat, 24 November 2014, 17:13:53

Vorheriges Thema - Nächstes Thema

fiedel

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).
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

MadCat

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

fiedel

#17
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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

MadCat

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

MadCat

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

fiedel

#20
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";; \

FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

MadCat

OK, habs geändert, dann Meckert aber die .cfg das Sie das nicht kennt, warum auch immer. "fhem("set"

fiedel

#22
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):


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


$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.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

MadCat

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