Scripte mit Variable / oder Funktion einbinden

Hallo zusammen,
vielleicht hab ichs in der Doku nur überlesen oder ich finde es einfach nicht.

Sachverhalt: Ich hab im Haus ca. 30 (Endausbau) 1-Wire Temperatursensoren in der Wand die die Temperatur dort messen sollen.

Nun möchte ich überall eine Abfrage machen, ob der Sensor noch läuft. Das habe ich bereits bei einem auch über ein kleines Script mittels Abfrage der Updatezeit gelöst. Das Problem ist, dass ich gerne Redundanz vermeiden würde, und nicht das Script 29 mal bei den anderen Sensoren kopieren möchte.

Wie baut man sich hier eine eigene Funktion der ich Variablen übergeben und Variablen zurückbekomme?

Gruß und Thanks for help

Kai

<?php
    $IDs = array(12345, 23456, 34567);

    foreach($IDs as $ID)
    {
        echo "Nr. ".$ID." lebt!
";
    }
?>

Das darfst Du jetzt noch sinnvoll ausbauen.

Hi Horst,

danke fürs erste Feedback. Ich bin aber noch so gut wie blutiger Anfänger.
Gibts irgendwo ein kleines Tutorial, wie ich ein normales Script in eine Funktion in Variablen umwandel. Ich hab früher mal ein Jahr Borland Pascal 7 programmiert. Da gabs so procedures auch. Die haben dann ne aufgabe erledigt und das ergebnis zurück gegeben.

ich vermute ja dass in dem array dann die übergebenen werte stehen sollen, und wie übergeb ich die dann von der hauptebene? Denke ziemlich doofe Fragen, aber hier bei PHP bin ich absoluter Newbie.

Gruß

Kai

<?php
    function addMe ($var1, $var2)
    {
        $result = $var1 + $var2;
        return $result;
    }

    echo "1 + 2 = ".addMe(1, 2);
?>

Function funktioniert wie in Pascal. Die Pascal-Procedure erhältst Du, wenn Du bei einer Function einfach kein return einbaust.
Ansonsten steht unter PHP: Sprachreferenz - Manual alles, was man wissen sollte. Klassen und Objekte, sowie dann auch Namespaces brauchst Du für den Anfang nicht. Im normalen IP-Symcon-Alltag würde mir jetzt eh nicht einfallen, wo sich deren Benutzung lohnen würde.
Was Du jetzt mit Hauptebene meinst musst Du nochmal genauer erklären.

Der Aufbau einer Funktion:

   
<?
  $test=" - Muh - ";
  echo $test;
  $test=MachNeuenWert($test);
  echo $test;


  function MachNeuenWert($wert)
  {
	 echo "
 Ich bin in der Funktion: ".$wert."
";
	 $new = " - Mäh - ";
    return $new;
  }
?> 

Geht im Prinzip genau wie in Pascal. :wink:

Edit:

Horst, wie schnell tippst du eigentlich? :smiley:

Gruß,

Toni

Super, das bringt mich ne Ecke weiter und werd ich heute Abend testen!!! MERCI!

Hauptebene meinte ich bei Pascal die Ebene wo das eigentliche Programm ablief, aus dem die Procedures (Unterebene) aufgerufen wurde.

Achso,…und die Funktion leg ich ganz normal als Script an, richtig verstanden?

Du kannst so viele Funktionen in deine Skripte schreiben, bis deine Festplatte überfüllt ist ;). Die Funktionen sind immer nur im jeweiligen Skript verfügbar. Willst Du die auslagern kannst Du in PHP require oder include verwenden.

Funktionssammlung.php

<?php
    function machDies ($bla)
    {
        echo 'Ich sage "'.$bla.'"';
    }

    function addMe ($var1, $var2)
    {
        return $var1 + $var2;
    }
?>

irgend ein Skript

<?php
    require("Funktionssammlung.ips.php");

    machDies("Heute kostet Kaffee ".addMe(10, 5.3)."EUR!");
?>

Die Funktionssammlung.ips.php muss dann im IP-Symcon-Ordner im Unterverzeichnis /scripts erstellt werden. Das andere Skript wird, wenn in IPS direkt erstellt, da automatisch reingepackt.

nun bin ich zwar bissl verwirrt, aber ich probier es heute abend daheim einfach… ich denke dann weiss ich mehr oder kann gezielter fragen!

Hab jedenfalls nicht vor das script 30 mal zu kopieren für die anderen sensoren :wink:

Gruß

Kai

Ist eigentlich ganz simpel.

Du speicherst alle deine Funktionen einfach in einer Textdatei ab. Diese nennst du dann wie du willst oder einfach „Funktionssammlung.ips.php“, wie Horst sie genannt hat. Meine hab ich zum Beispiel „functions.php“ getauft. Es macht sinn die Datei im Ordner „scripts“ abzulegen. Damit sparst du dir lange Pfaddefinitionen angeben zu müssen.

In jedem Script, in dem du diese Funktionen verwenden willst musst du sie einmal bekannt machen. Das machst du zum Beispiel mit dem Befehl „require“. Thats all.

Gruß,

Toni

Wozu willst Du überhaupt 30 Skripte erstellen? Du brauchst doch nur ein Skript, indem Du alle IDs in ein Array packst, das Du dann mit foreach durchläufst. Siehe mein erstes Beispiel. Wenn Du es noch einfacher haben willst lässt Du Dir die Liste mit IPS_GetInstancesByModuleID - IP-Symcon :: Automatisierungssoftware generieren. Die ModuleID für Deinen Sensorentyp kann ich Dir jetzt nicht verraten, da musst Du einfach mal mit IPS_GetInstance - IP-Symcon :: Automatisierungssoftware einen Sensor abfragen und Dir die ModuleID notieren. Wenn Du Dein Kontrollskript hier postest und die ModuleID könnte ich Dir das auch kombinieren. Ist ja auch evtl. was für die Sammlung.

Hallo Kadorf,

ich hab mir auch eine Überwachung geschrieben, probiersmal.

<?
//es werden alle 1-Wire sensoren eingelesen
//und auf aktualisierung bzw. bei Temp-Sensoren auf 85.0°C überprüft
//und angezeigt mit anzahl Fehlern bzw. Ausfallzeit
 $guid = "{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}";
 $ids = IPS_GetInstancesByModuleID($guid);
 foreach($ids as $id)
 {
  $ValueID= IPS_GetChildrenIDs($id);
  $temp= Getvalue($ValueID[0]);
  $data =  IPS_GetVariable($ValueID[0]);
  $last_up = time()-($data['VariableUpdated']);
  //ECHO $id."  ".IPS_GetLocation($id)."   ".$temp."   ".$last_up."
";
   
    //echo TMEX_GetDevice($id)." = ".IPS_GetLocation($id)." VALUE :".GETVALUE($ValueID[0])."
";
  IF ($temp ==85.0) {
      SetValueBoolean(26454 /*[SYSTEM\1-WIRE ÜBERWACHUNG\1-WIRE SPANNUNGSAUSFALL]*/ ,True);
      SETVALUE(37761 /*[SYSTEM\1-WIRE ÜBERWACHUNG\ANZAHL FEHLER]*/ ,getvalue(37761 /*[SYSTEM\1-WIRE ÜBERWACHUNG\ANZAHL FEHLER]*/ )+1);
	   SETVALUE(29620 /*[SYSTEM\1-WIRE ÜBERWACHUNG\AUSFALL UM]*/ ,date("d.m.Y-H-i-s"));
	   SETVALUE(38965 /*[SYSTEM\1-WIRE ÜBERWACHUNG\sensor]*/ ,IPS_GetLocation($id));
  }
  IF ($last_up > 300) {
	 SetValueBoolean(38001 /*[SYSTEM\1-WIRE ÜBERWACHUNG\1-WIRE AKTUALISIERUNGSFEHLER]*/ ,TRUE);
  }
 }
?>

zwar nicht zu 100% getestet, müsste aber funktionieren.

Mfg
Michel

… siehe auch: http://www.ip-symcon.de/forum/f53/rauchmeldertag-6850/

MST

Oh Michel hat noch eine super Idee mit den 85 Grad gehabt.
Wenn meine Wänder 85 Grad hätten, dann würde es wohl bissl problematisch mit meiner Raumtemperatur :wink: Das bau ich auch noch ein!
Im Prinzip sollte es so aussehen, dass jede minute ein script gestartet wird, indem nur die Werte wie TemperatursensorID, TemperaturID und die ID der Ausfallvariable(Bool) zu einer (in Pascal war es die Procedure) übergeben wird.

Die Temperaturvariable soll bei mir bei Ausfall allerdings nicht den Wert von dem defekten Sensor annehmen sondern ich möchte eine alternativ Temperatur angeben von einem anderen Heizkreis, das ist zwar dann nicht perfekt, aber es wird zumindest nicht Kalt im Haus :slight_smile:

Gruß

Kai

Also



<?
//********************************************************************************************************************
//*                                            DEKLARATION                                                           *
//********************************************************************************************************************
$IDSensor = 43772 /*[Obergeschoss\Esszimmer\Heizung\Wandtemperaturen\Heizkreis 1\HK1 (Neben Eingangstür)\Temperatur]*/;
$IDOnline = 13984 /*[Obergeschoss\Esszimmer\Heizung\Wandtemperaturen\Heizkreis 1\Heizkreissensor online]*/;
$IDRefTemp = 47053 /*[Obergeschoss\Esszimmer\Heizung\Wandtemperaturen\Heizkreis 1\Referenz Temperatur]*/;

//********************************************************************************************************************
//*                                            PROGRAMM                                                              *
//********************************************************************************************************************

$Temperatur = getvalue($IDSensor);
$jetzt = time();
$VarInfo = IPS_GetVariable($IDSensor);
$letztAkt = $VarInfo['VariableUpdated'];
$Online = getvalue($IDOnline);


// Abfrage ob Sensor bisher funktioniert = Online war
if ($Online == true)
{
  //Abfrage ob die letzte Aktualisierung länger wie 300 Sekunden her ist
  // oder der Sensor 85 Grad wiedergibt
  if ((($jetzt - $letztAkt) > 300) or ($Temperatur == 85))
  {
    setvalueboolean($IDOnline, false);
  }
  else
  {
    setvalue($IDRefTemp, $Temperatur);
  }
}
else
{
  if (($jetzt - $letztAkt) < 300)
  {
  setvalueboolean($IDOnline, true);
  }
}


echo ($jetzt .  "
");
echo ($letztAkt .  "
");
echo ("Variablenupdate = " . date("d.m.Y H:i:s", $VarInfo['VariableUpdated']) ."
");
echo ("Variablenwert geändert = " . date("d.m.Y H:i:s", $VarInfo['VariableChanged']) ."
")

?>

Wie bekomm ich das in eine Funktion, in der ich nur die 3 ID’s (unter Deklaration) übergebe.

Gruß

Kai

P.S.: So, nun ists ganz konkret :slight_smile:

<?php
temperaturFunktion(43772, 13984, 47053);

function temperaturFunktion($IDSensor, $IDOnline, $IDRefTemp)
{
    $Temperatur = getvalue($IDSensor);
    $jetzt = time();
    $VarInfo = IPS_GetVariable($IDSensor);
    $letztAkt = $VarInfo['VariableUpdated'];
    $Online = getvalue($IDOnline);


    // Abfrage ob Sensor bisher funktioniert = Online war
    if ($Online == true)
    {
          //Abfrage ob die letzte Aktualisierung länger wie 300 Sekunden her ist
        // oder der Sensor 85 Grad wiedergibt
        if ((($jetzt - $letztAkt) > 300) or ($Temperatur == 85))
        {
            setvalueboolean($IDOnline, false);
        }
        else
        {
              setvalue($IDRefTemp, $Temperatur);
        }
    }
    else
    {
        if (($jetzt - $letztAkt) < 300)
        {
          setvalueboolean($IDOnline, true);
        }
    }

    echo ($jetzt .  "
");
    echo ($letztAkt .  "
");
    echo ("Variablenupdate = " . date("d.m.Y H:i:s", $VarInfo['VariableUpdated']) ."
");
    echo ("Variablenwert geändert = " . date("d.m.Y H:i:s", $VarInfo['VariableChanged']) ."
")
}
?>

@Kadorf,

5V Spannungsversorgung am Sensor ist unterbrochen.
die 85.0C heissen spannungsausfall am Sensor.

Michel

Hi Michel,
so grob hab ich das auch schon festgestellt, ich wusste aber bei 85 Grad nicht, was fehlt… Aber super, dann hab ich bei einer Fehlersuche einen Anhaltspunkt.
Könnte man ja vielleicht noch in ein Fehlerlog schreiben :slight_smile:

Das andere probier ich gleich direkt mal.

temperaturFunktion(43772, 13984, 47053); => Das ist der aufruf aus nem anderen Script???

Gruß und thanks all!

Kai

Also,
ich hab nun mein Script mal zur Funktion umgestrickt. Aber ich ralle noch nicht, wie ich sie von einem anderen Script aus aufrufen soll. Muss ich die dazu doch in eine Textdatei pappen, diese ins IPS Verzeichnis…???
Das sind die Anfängerfragen :wink:
Gruß
Kai

Wie das geht hatte ich Dir unter http://www.ip-symcon.de/forum/f18/scripte-variable-funktion-einbinden-7450/#post61624 gepostet ;).

Super Leute,

ERFOLGESERLEBNIS

Es funzt…Einwandfrei. Danke an alle für die Hilfe!

Gruß

Kai

P.S.: Ich frag bestimmt noch viel öfter. Spätestens wenns um Web geht *g