Heizkreismischer Vorlauftemperatur Steuern und Auswerten

Begonnen von epsrw1, 18 Mai 2014, 15:47:17

Vorheriges Thema - Nächstes Thema

epsrw1

an meinem Mischermotor habe ich einen Winkelgeber montiert der mir ermöglicht die Hebelposition zu loggen und bei Bedarf die Kesseltemperatur anzuheben. die beiden kleinen subs zum richtung einstellen und mischermotor starten sind für die einstellung von der heizungsregelung, damit die kalibrierung nciht aus versehen durcheinandergebracht wird. Am PiFace (out 4 und 5) sind zwei Relais für Richtung und Motorstart angeschlossen. PiFace in5 und out5 sind verbunden da ich mal probleme mit den Readings von out* hatte. Hier der code dazu:
Config:

define MischerCalibrateScedule at *03:05:00 trigger MischerCalibrateStart
define MischerCalibrateNotify notify MischerPosition {my($mpo)=ReadingsVal("MischerPosition","position",-1);;if($mpo<0 or $mpo>12){fhem("trigger MischerCalibrate");;}}
define MischerCalibrateCounterMax dummy
define MischerCalibrateStart notify MischerCalibrateStart {MischerCalibrateStart("Vorlauf_Cold_Notify","Vorlauf_Hot_Notify","Vorlauf_MischerStart_Notify") }


Code:

##############################################
# $Id: 99_myUtilsMischer.pm 3595 2014-05-18 F.D. $
package main;
use strict;
use warnings;
use POSIX;

sub myUtilsMischer_Initialize($$)
{
my ($hash) = @_;
}

sub MischerCalibrateStart(@){
my @disable = @_;
my($LockFileMischer_TT)=ReadingsVal("LockFileMischer_TT","state","Undef");
#create lockfile dummy if not present
if($LockFileMischer_TT eq "Undef"){fhem("define LockFileMischer_TT dummy;;set LockFileMischer_TT free");}
#if lockfile locked by other command, create at definition to start it again in 10 minutes
if($LockFileMischer_TT ne "free"){
  fhem("define MischerCalibrateAutoRestart at +00:10:00 {MischerCalibrateStart(".join(",",@disable).") }");
  return;
  }
fhem("define MischerCalibrateActive dummy");
fhem("set MischerCalibrateActive Just started, Please be patient");
my($MischerCalibrateCounterMax)=ReadingsVal("MischerCalibrateCounterMax","state","120");
#sicherstellen dass wert durch 10 teilbar ist
while(int($MischerCalibrateCounterMax/10) ne ($MischerCalibrateCounterMax/10)){$MischerCalibrateCounterMax++;}
fhem("delete MischerCalibrateCounterMax");
fhem("define MischerCalibrateCounterMax dummy");
fhem("set MischerCalibrateCounterMax ".$MischerCalibrateCounterMax);
fhem("set LockFileSteuerung_TT locked");
foreach(@disable){ fhem("attr ".$_." disable 1"); }
fhem("define MischerCalibrateTemp dummy");
fhem("set MischerCalibrateTemp ".join(":",@disable));
Log 3, "MischerCalibrate starting at position ".ReadingsVal("MischerPosition","position","??").", please be patient";
fhem("define MischerCalibrateCounter0 dummy");
fhem("set MischerCalibrateCounter0 1"); #max=120, zeit kompletter weg R-L ca.107 sec
fhem("define MischerCalibrateCounter1 dummy");
fhem("set MischerCalibrateCounter1 1"); #max=120, zeit kompletter weg R-L ca.107 sec
fhem("define MischerCalibrateWorker notify MischerCalibrateWorker {MischerCalibrateWorker() }");
fhem("define MischerCalibrateWorkerLoop at +*{".(($MischerCalibrateCounterMax*2)+1)."}00:00:01 trigger MischerCalibrateWorker");
}


sub MischerCalibrateWorker(){
my(@logTextDef)=(1=>"Up",0=>"Down");
my($MischerCalibrateCounterMax)=ReadingsVal("MischerCalibrateCounterMax","state","120");
my($MischerCalibrateCounter1)=ReadingsVal("MischerCalibrateCounter1","state","1");
my($MischerCalibrateCounter0)=ReadingsVal("MischerCalibrateCounter0","state","1");
#0 or 1 based on timer values, first up=1 second down=0
my($MischerCalibrateCounter,$p5value);
if($MischerCalibrateCounter1 <= $MischerCalibrateCounterMax){
  $MischerCalibrateCounter=$MischerCalibrateCounter1;
  $p5value="1";
}elsif($MischerCalibrateCounter0 <= $MischerCalibrateCounterMax){
  $MischerCalibrateCounter=$MischerCalibrateCounter0;
  $p5value="0";
}else{
  #MischerCalibrateEnde: delete dummys and disables
  my(@disable)=split(":",ReadingsVal("MischerCalibrateTemp","state",""));
  fhem("delete MischerCalibrateTemp");
  foreach(@disable){ fhem("deleteattr ".$_." disable"); }
  fhem("delete MischerCalibrateCounter0");
  fhem("delete MischerCalibrateCounter1");
  fhem("delete MischerCalibrateWorkerLoop");
  fhem("delete MischerCalibrateWorker");
  fhem("define MischerCalibrateActive dummy");
  fhem("set LockFileSteuerung_TT free");
  Log 3, "MischerCalibrate finished";
  return;
  }
my($TenPercent)=int($MischerCalibrateCounterMax/10);
if(int($MischerCalibrateCounter/$TenPercent) eq $MischerCalibrateCounter/$TenPercent){
  Log 3, "MischerCalibrate at loop ".$logTextDef[$p5value]." ".($MischerCalibrateCounter/$TenPercent)."0 percent, please be patient";
  fhem("set MischerCalibrateActive MischerCalibrate at loop ".$logTextDef[$p5value]." ".($MischerCalibrateCounter/$TenPercent)."0 percent, please be patient");
  }
fhem("set MischerCalibrateCounter".$p5value." ".($MischerCalibrateCounter + 1));
if(ReadingsVal("pif29","out5","2") ne $p5value){fhem("set pif29 5 ".$p5value);}
if(ReadingsVal("pif29","out4","0") ne "1"){fhem("set pif29 4 1");}
if(ReadingsVal("pif29","out6","1") ne "0"){fhem("set pif29 6 0");}
}


sub MischerStartLocked(){
#usage: trigger MischerStartLocked;;sleep 3;;set pif29 4 0;;set LockFileSteuerung_TT free
#cfg-add: define MischerStartLocked notify MischerStartLocked {MischerStartLocked()}
if(ReadingsVal("LockFileMischer_TT","state","Undef") ne "free"){return;}
if(ReadingsVal("MischerPosition","position","6")<0){return;}
#refuse to go below zero position when asked to go leftwards
if((ReadingsVal("pif29","in5",2) eq 1) and (ReadingsVal("MischerPosition","position","-1") eq 0)){return;}
fhem("set LockFileSteuerung_TT locked");
fhem("set pif29 4 1");
# fhem("sleep 3"); #do not sleep here, it causes fhem to hang while waiting for perl
# fhem("set pif29 4 0");
# fhem("set LockFileSteuerung_TT free");
}

sub MischerSetLocked($){
#usage: MischerSetLocked("1")
if(ReadingsVal("LockFileMischer_TT","state","Undef") ne "free"){return;}
if(ReadingsVal("pif29","in5",2) ne $_[0]){ fhem("set pif29 5 ".$_[0]); }
}



1;



Ich habe keine Ahnung, aber davon wenigstens ganz viel