Antis FHT für V2

Hallo Leute!

Verwende Antis FHT Script und bin damit sehr zufrieden!!!
Bin aber jetzt auf iP-Symcon V2 umgestiegen und hier läuft das Skript leider nicht mehr!
Hätte schon versucht das Script ein wenig zu modifizieren aber das ging leider nicht gut!

Vielleicht hat es ja einer von euch schon hinbekommen!

Gruß Erwoolf

Hallo Erwoolf ,

bin gerade dabei das Script wieder lauffähig zu bekommen.

Mit ein paar Änderungen läuft es wenigstens. Es kommen zwar noch Fehlermeldungen, aber das Script erfüllt seine Funktion.

Änderungen waren immer bei „IPS_VariableExists“ notwendig, da dieser befehl jetzt die VariablenID als Argument benötigt.
Diese muss zuerst mit „IPS_GetVariableID“ ermittelt werden.

Nur für den befehl „IPS_ModuleInstanceExists“ habe ich noch keine Lösung gefunden.

Grüssle
Winfried


<?php
// Bei forcewrite schreibt er immer seine ermittelte Temp. Heisst Rädchendrehen ist mehr oder weniger wirkungslos
$fht_forcewrite = false;
// bei Debug nur Echo ausgaben statt zu senden
$fht_debug = false;
// Wenn true wird ein mal am Tag die Zeit gesetzt
$fht_settime = true;

/* IPS Variablen

"fht_profileoverride" , wenn vorhanden und einen Namen eines vorhanden Profils enthält, wird das genommen
"fht_save"    , wird anleget dient zur zwischenspeicherung alter Tempraturen

*/


include_once 'Excel/reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');


$data->read('D:/Programme/IP-SymconV2/scripts/Temps.xls');

error_reporting(E_ALL ^ E_NOTICE);


// $tableNum enthält dannach auf dem Namen den Index der Tabelle also z.b. $tableNum["config"] = 1 , heisst config is Tabelle 1
foreach( $data->boundsheets as $key => $worksheet )  {
	$tableNum[$worksheet["name"]] = $key;
}

$configNr = $tableNum["config"];
$configTable = $data->sheets[$configNr]['cells']; // Das ist nun die config-Tabelle

// Set Punkt Temp zuordung [x]=temp
for ($x=2; $x <= 11; $x++) {
	$tempTable [$configTable[$x][1]]= $configTable[$x][2];
}

// Aktives Profil lesen
$aktProfil =  $configTable[4][5];

// Profil Liste lesen
$newdata = "new";$profiles = array();
for ($x=11; !empty ($newdata); $x++) {
	$newdata = $configTable[2][$x];
	if (!empty ($newdata)) {
      $profiles[] = $newdata;
      $newdata2 = "new";
      // Und nebenbei prüfen ob bei dem Profil das heutige Datum eingetragen ist
      for ($y=3; !empty ($newdata2); $y++) { // Daten drin ?
      $newdata2 = $configTable[$y][$x];
      	if (!empty ($newdata2)) {
            $tmp  = explode("/", $newdata2);
				$daybefore  = mktime(0, 0, 0, $tmp[1]  , $tmp[0]-1, $tmp[2]); // Fix, das Ding liest 1 tag später aus
            // Ein Datum überschreibt das aktive Profil !
            if ($daybefore ==  mktime(0, 0, 0))  {
               $aktProfil = $newdata;
				}
         }
      }
   }
}

// In IPS ein Override gesetzt ?
//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_profileoverride");
if ($VarID === false)
  echo "Variable fht_profileoverride nicht gesetzt, nehme Standardprofil!";
else {
  echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_profileoverride")){
  $tmp = GetValueString ($VarID);
  if (in_array ($tmp, $profiles)) $aktProfil = $tmp;
}

// Room´s auslesen (ID setzen)
$newdata = "new";$rooms = array();
for ($x=25; !empty ($newdata); $x++) {
   $newdata = $configTable[$x][1];
   if (!empty ($newdata)) {
      $rooms[$newdata][id]= $configTable[$x][2];
      $rooms[$newdata][target]= $configTable[$x][3];
      $rooms[$newdata][time1]= $configTable[$x][4];
      $rooms[$newdata][time2]= $configTable[$x][5];

      // test
      //echo (checkInterval ($rooms[$newdata][time1], -10, 6)) ? "ja": "nein";
      
      // Interval in dem wir das Ding auf Manuell schalten?
      $rooms[$newdata][gotoman]= checkInterval ($rooms[$newdata][time1], -10, 6) || checkInterval ($rooms[$newdata][time2], -10, 6);
      // Interval in dem wir das Ding wieder auf Auto schalten?
      $rooms[$newdata][gotoauto]= checkInterval ($rooms[$newdata][time1], 4, 6) || checkInterval ($rooms[$newdata][time2], 4, 6);
   }
}
// True wenn aktuelle Zeit im Bereich (time+offset) bis (time+offset+duration) ist
function checkInterval ($time, $offset, $duration) {
   $std = substr($time,0,2);
   $min = substr($time,3,2);
   $von = mktime ($std,$min+$offset);
	$bis = mktime ($std,$min+$offset+$duration);
   //echo "$std:$min -> ".time(). " $von $bis
";
   return  (time() >= $von && time() <= $bis);
}

//print_R($rooms);

$profilNum = array_search($aktProfil, $profiles)+1;
$ProfileName ="Profiles".$profilNum;
$ProfileNr = $tableNum[$ProfileName];


$ProfileTable = $data->sheets[$ProfileNr]['cells'];
//    print_r($profiles);
//  echo  $ProfileTable[3][1]; // Zeile, Spalter
// zumidnest im englischen PHP okay
$days = array ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun");
$dayindex = array_search( date("D",  mktime(0, 0, 0)), $days);    // 0-6
$timeindex = date("H")*4 + floor( date("i")/15);
  //echo "

".$dayindex;
$y = $dayindex+3;
$x =  $timeindex+2;
$allSoll = $ProfileTable[$y][$x];

foreach ($rooms as $key => $data) {
   $rooms[$key][soll] = $allSoll;
}

// Extra Räume ?
$start =12;
while ($ProfileTable[$start][1] != "") {
   $Room = $ProfileTable[$start][1];
   $x =  $timeindex+2;
   $y = $dayindex+$start+1;
   $rSoll = $ProfileTable[$y][$x];
   $rooms[$Room][soll] = $rSoll;
   //echo $Room;
   $start+=9;
}
//print_r ($rooms);

// So sämtliche Soll Temperaturen sind erfasst *juhu* nun vergleichen mit alter Temp und setzen der alten Temp

// Alte Tempraturem lesen:
//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_datasave");
if ($VarID === false)
 { echo "Variable fht_datasave nicht gefunden!";
   $VarID = IPS_CreateVariable(3);  //Variable Typ String anlegen
	IPS_SetName($VarID,"fht_datasave"); // Variable benennen
}
else {
  echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_datasave")) {
   $tmp = wddx_deserialize (GetValueString ($VarID));
   $oldTemp = $tmp[oldTempNeu];
} 

// Ein Ressend angefordert ?
$boolTemp = false;

//Fehlermeldung mit @ unterdrücken
$VarID = @IPS_GetVariableID("fht_resend");
if ($VarID === false)
{
   $VarID=IPS_CreateVariable(0); //Variable Typ Boolean anlegen
   IPS_SetName($VarID,"fht_resend"); // Variable benennen
   SetValueBoolean ($VarID, false);
  echo "Variable nicht gefunden , neu angelegt!". $VarID;
  }
else {
  echo "Die Variablen-ID lautet: ". $VarID;
//if (IPS_VariableExists("fht_resend")) {
   $boolTemp =  GetValueBoolean ($VarID);
   SetValueBoolean ($VarID, false);
} 
   
foreach ($rooms as $key => $data1) {
   // Umlaute mag er nicht
   $key2= str_ireplace (Array("ü","ö","ä","ß"), Array("ue","oe","ae","ss"), $key);
   $oldTempNeu[$key2][soll] = $tempTable[$data1[soll]];
   $oldTempNeu[$key2][setTime] = $oldTemp[$key2][setTime];

  //wm if (IPS_ModuleInstanceExists (intval ($data1[id]))) {
      // WIe siehts aus mit automatischem auto/manuell umschalten ?
      if ($data1[gotoman]) if ($fht_debug) echo "Goto Man $key
";
      else FHT_SetMode(intval($data1[id]),1);
      if ($data1[gotoauto]) if ($fht_debug) echo "Goto Auto $key
";
      else FHT_SetMode(intval($data1[id]),0);

      if ($fht_settime) {
         // if ($fht_debug) echo "setze $data[id] to ".$tempTable[$data['soll']]."
";
          //  else FHT_SetTemperature($data[id], $tempTable[$data[soll]]);
      }

 //wm  }

   if ($oldTemp[$key2][soll] != $tempTable[$data1[soll]] || $fht_forcewrite || $boolTemp) { // Schreibn Meister

//wm      if (!IPS_ModuleInstanceExists (intval ($data1[id]))) {
         Echo "Das Modul $data1[id] gibts nicht!";
//wm      } else {
         if ($fht_debug) echo "setze $key to ".$tempTable[$data1['soll']]."
";
         else {
            FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]]));
            IPS_LogMessage("Antis_FHT", "$key wurde auf ".$tempTable[$data1['soll']]." Grad gesetzt");
            $oldTempNeu[$key2][setTime]=time(); // Merken wir uns den Zeitpunkt der Sendung
         }
//wm      }
   }
   if ($oldTempNeu[$key2][setTime]+ 360 < time() && !$fht_debug) { // Update wurde vor mehr als 6 Min gesendet
      if ($oldTempNeu[$key2][setTime]+ 660 >= time()) { // Und nach weniger als 11 Min
         // Senden wir den letzen Befehl noch mal, zur erhöhung der Sicherheit
         FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]]));
      }
      if (IPS_VariableExists($data1[target])){ // Nur wenn die IPS Var existiert (empfolen)
         $updTime = IPS_GetUpdatetime($data1[target]);
         if ($updTime > $oldTempNeu[$key2][setTime]) {
            //echo "alles im grünen Bereich $updTime > ".$oldTempNeu[$key2][setTime];
         } else {
            echo "$key2 ist nicht gesetzt !! -> retry";
            IPS_LogMessage("Antis_FHT", "$key2 ist nicht gesetzt !! -> retry");
            fht_alert ( "$key2 ist nicht gesetzt !! -> retry");
            // FHT_SetTemperature(intval($data1[id]), floatval ($tempTable[$data1[soll]])); // Sinnlos
           // echo $data1[id].",". $tempTable[$data1[soll]];
            //$oldTempNeu[$key2][setTime]=time(); // Merken wir uns den Zeitpunkt der Sendung
         }
      }
   }
}
//print_r ($oldTempNeu);
//IPS_LogMessage("Antis_FHT", "$key wurde auf ".$tempTable[$data1['soll']]." Grad gesetzt");
// Neue Alte Temperaturen (und sontiges) speichern
SetValueString ("fht_datasave", wddx_serialize_vars("oldTempNeu"));
Echo  "Aktives Profil: $aktProfil
";
// Solltemp: $tempTable[$allSoll]";
foreach ($rooms as $key => $data1) {
echo $key." soll: ".$tempTable[$data1['soll']]."° Celsius
";
}


function fht_alert ($hint) {
   if (!IPS_VariableExists("fht_noalert")) {
    IPS_CreateVariable("fht_noalert", "Boolean");
   }
   if (!IPS_VariableExists("fht_alertMSG")) {
    IPS_CreateVariable("fht_alertMSG", "String");
   }
   SetValueString ("fht_alertMSG",$hint);
   SetValueBoolean ("fht_noalert",false);
}
?>


IPS_ModuleExists sollte der richtige Ersatz sein.

Achja IPS V2, ich hatte da vor ner Weile auch schonmal ein paar modifikationen durchgeführt nun fragt mich aber nicht mehr was genau. Ich denke es war ähnlich wie von Winni beschrieben, aber ihr könnt gerne mal vergleichen :wink: Habe leider derzeit nicht so die Zeit mich damit zu beschäftigen.

Anti

antis_fht.ips.zip (3.81 KB)

hat einer ein vollständig unter V2 lauffähiges Antis FHT Skript
(nur mit anpassen von „IPS_VariableExists“ usw. ist es leider nicht getan),
das er hier posten möchte.

danke + gruß
astrastar

[b]Hallo!

Wollte nochmal nachfragen ob es schon eine Finale Version von Antis FHT-Script für IPS V2 gibt!

Gruß Erwoolf[/b]

:loveips:

Nicht von mir :wink:

Aber es funktioniert doch, oder? Sehe entsprechend keinen grossen Handlungsbedarf zumal ich selbst immernoch IPS 1 verwende.

Anti

Hallo zusammen,

hab mich nochmal mit Antis Script beschäftigt.
Dabei habe ich noch ein paar Befehle entdeckt die angepasst werden müssen.

Hab auch noch ein paar Kommentare eingefügt.

Grüßle
Winfried

antis_fht.ips.zip (4.45 KB)

Hallo zusammen,

auf Anregung von Erwoolf habe ich die Eingabe der VariablenID der FHZ vereinfacht. Sie muss am Anfang des Scripts einmalig angegeben werden.

Und noch ein paar Kommentare sind dazugekommen:

Grüßle Winfried

antis_fht.ips.zip (4.68 KB)

Danke, ich finde es ist immernoch die am besten bedienbare Heizungssteuerung die es über IPS gibt

Hallo Winfried,

was ist da falsch ?
:confused:

Fehlermeldung:

Warning:  require_once(Excel/OLERead.inc) [function.require-once]:  failed to open stream: No such file or directory in  C:\Homeserver\IP-Symcon\Excel\reader.php on line 32

Fatal error:  require_once() [function.require]: Failed opening required  'Excel/OLERead.inc' (include_path='.;C:\php5\pear') in  C:\Homeserver\IP-Symcon\Excel\reader.php on line 32


Ausschnitt:

//Hier die VariableID der FHZ eintragen (aus Objektbaum-->  SplitterInstanzen vom Typ FHZ1x00PC)
$VarID_FHZ= 24896 /*[FHZ1X00PC]*/;

// Um unnütze Aufrufe zu verhindern !
if ($IPS_SENDER == "Variable" && $IPS_VARIABLE ==  IPS_GetVariableIDByName(36542  /*[Haustechnik\Heizung\Heizraum\Heizungssteuerunng\Heizung-1]*/ , 0)  && $IPS_VALUE == false) return;

//Prüfen ob die FHZ genügend SendeBuffers hat
$FREE_BUFFERS = FHZ_GetFreeBuffer($VarID_FHZ);
if ((10-$FREE_BUFFERS) > 4) {
   fht_alert ("Beknackte FHT Qeue mal wieder zu voll");
   return;
}


include_once 'C:\Homeserver\IP-Symcon\Excel/reader.php';
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
// Set output Encoding.
$data->setOutputEncoding('CP1251');


$data->read('C:\Homeserver\IP-Symcon\Excel/Temps.xls');

error_reporting(E_ALL ^ E_NOTICE);

ENDE:

Grüße Ralf

Steht doch in der Fehlermeldung. Die Dateien sind nicht vorhanden oder nicht da wo sie hingehören!

Hallo Rainer,

die Dateien sind unter folgendem Pfad abgelegt

C:\Homeserver\IP-Symcon\Excel/reader.php

Grüße Ralf

Kann mich nur wiederholen. Deine Pfadangaben stimmen nicht.

No such file or directory in C:\Homeserver\IP-Symcon\Excel\reader.php on line 32

Hallo Ralf,

kann es daran liegen ?

C:\Homeserver\IP-Symcon\Excel/reader.php

IPS_GetKernelDir()."Excel\\reader.php";

Mal eine Frage von einem Neuling: Wie muss den die Temps.xls aussehen, welche Werte können dort übergeben werden? Hilfreich wäre ein konkretes Beispiel für mich.

MfG Peter

Hallo Peter,

Hier ist der Source von Anti (für IPS V1 und die Excel-Datei)

Grüßle
Winfried

Irgentwie sitze ich gerade aufm Schlauch…

Moin erstmal…

Also, habs Script installiert und luppet auch soweit…
Nun wollte ich einem Raum eine andere Temperaut zuordnen, aber irgentwie verstehe ich den Satz nicht sooo richtig… ^^ :

Abweichende Räume - Immer mit einer Leerzeile Raumname Oben-Links

Wo muss was jetzt genau hin???

mfg
korny

Hat sich schon erledigt… Ich dummerchen…

:wink:

Wollt ich sagen so schwer ist das doch nicht.

Anti :loveips: