Erstes Script

Hallo zusammen,

ich habe trotz längerer Suche mehrere Probleme mit dem ersten Script (Einfache IF-Bedingung)

if (38100 /*[Außenbereich\Außentemperatur Nord]*/ <= 0) 
{
33399 /*[Außenbereich\Außentemperatur Nord\Test]*/ = 1;
}

Zuweisung
Bei der Zuweisung wird mir das = als Fehler genannt.
Ein „Setvalue“ wird doch nicht unbedingt benötigt, oder doch?
Jedenfalls habe ich im Netz einige PHP Befehle gefunden, in denen eine Zuweisung so aussieht ( = 1; )

if (38100 /*[Außenbereich\Außentemperatur Nord]*/ <= 0) 
{
echo "Test";
}

Vergleich auf <=
Aktuell habe ich bei 38100 (Außentemperatur) einen Wert von -0,2°C, also kleiner 0
Wenn ich aus dem < ein > mache, wäre es eine Abfrage auf größer.
Jedoch wird mir der Text aktuell nur bei der Abfrage auf größer angezeigt, warum ?

Danke für eure Hilfe.

Einfach nur die ID schreiben reicht nicht, du musst dir die Werte mit GetValue… holen und SetValue… schreiben.

Doch es wird entweder eine Funktion oder eine Variable benötigt.
Wenn man das „deutsch“ lesen würde hieße das 33399 entspricht 1 das macht ja aber kein Sinn.
Du kannst entweder eine Varibale einen Wert zuweisen


$a = 1;
echo $a;

Da hat a den Wert 1

Oder aber Du führst eine Funktion aus
ich gehe davon aus das Du einen Wert setzen willst dann ist das


SetValue(33399 /*[Außenbereich\Außentemperatur Nord\Test]*/, 1);

dann setzt Du den Wert von der Variable mit der Objekt ID 33399 auf 1.

$a = 1;
echo $a;

Genau deshalb dachte ich, das ich der ID auf gleiche Weise einen Wert zuweisen kann.

$a = 1;
ID = 1; (ist ja auch eine Variable, oder nicht?)
Mit „Setvalue“ funktioniert es, dachte nur das man sich das evtl. sparen kann.


Kann sich jemand das Problem 2 ( <> ) erklären ?

Das ganze funktioniert anscheinend überhaupt nicht:

if (33273 /*[Außenbereich\Außentemperatur Nord\Testfloat]*/ >= 3) 
{
setvalue (40758 /*[Außenbereich\Außentemperatur Nord\Testinteger]*/, 1);
}

Bei der Abfrage auf >=3 wird der Testinteger auch bei einem Wert von 33273=2 gesetzt.

Das ich schon bei einer Abfrage auf <> ein Problem habe, hätte ich bis jetzt nicht gedacht :slight_smile:

Eine IPS-Variable (im Objektbaum) ist keine PHP-Variable in einem Script.

Darum immer GetValue(ID_DER_IPS_VARIABLE) und SetValue(ID_DER_IPS_VARIABLE).

Wie Fonzo schon schrieb:


if (33273  >= 3) 

Klar ist 33273 immer größer als 3 :wink:

Michael

Muss ich noch mehr sagen als::banghead: ?

Ja natürlich muss ich das -> Danke !

Aber wenn wir schon beim ersten Script sind, wäre es super dies fertig zu stellen.

date_default_timezone_set("Europe/Berlin");
$timestamp = time();

$AußentemperaturNord = GetValue(33648 /*[Außenbereich\Außentemperatur Nord\Wert]*/);
$Außentempmin = GetValue(50088 /*[Außenbereich\Außentemperatur Nord\Außentempmin]*/);
$Außentempmax = GetValue(43356 /*[Außenbereich\Außentemperatur Nord\Außentempmax]*/);
$datum = date("d.m.Y-H:i",$timestamp);

if ($AußentemperaturNord <= $Außentempmin) 
{
setvalue (50088 /*[Außenbereich\Außentemperatur Nord\Außentempmin]*/, $AußentemperaturNord);
setvalue (38119 /*[Außenbereich\Außentemperatur Nord\Uhrzeit Min]*/, $datum);
}  
if ($AußentemperaturNord >= $Außentempmax) 
{
setvalue (43356 /*[Außenbereich\Außentemperatur Nord\Außentempmax]*/, $AußentemperaturNord);
setvalue (24202 /*[Außenbereich\Außentemperatur Nord\Uhrzeit Max]*/, $datum);
}  

Das Script funktioniert und macht das was es soll.

Aber ist es möglich die jeweiligen ID`s nicht als Zahl, sondern als Klartext der Variable unterhalb der Instanz anzugeben?
Dann könnte ich das Script ohne große Anpassungen unter mehreren Instanzen nutzen und nur die notwendigen Variablen erstellen.

Ich hoffe die Frage ist Verständlich.

Weiterhin wird mir für das Script eine Laufzeit von 100ms angegeben.
Es ist zwar nur ein mini-PC (Orbsmart AW-08), aber das kommt mir doch trotzdem etwas sehr lange vor.
Bei 10 Scripten rödelt der ja 1sek…

Kann das richtig sein ?

Hallo Lenz,

Ich definiere mir immer die IDs als Variable, dann kann ich einfacher Kopieren:

$aussentemp = 12345 /[Aussentemp…]/;

Weiters gebe ich dir den Tipp, keine Sonderzeichen bei der Benennung zu Verwenden (Umlaute und ß gehören zu den Sonderzeichen.

Lg
Andy

Gesendet von iPad mit Tapatalk

$aussentemp = 12345 /[Aussentemp…]/;

Weiters gebe ich dir den Tipp, keine Sonderzeichen bei der Benennung zu Verwenden (Umlaute und ß gehören zu den Sonderzeichen.

Das klingt schonmal beides sinnvoll.
Gibt es mit Sonderzeichen öfters (oder bei speziellen Befehlen) Probleme?


Die Idee hinter der Frage ging aber noch etwas weiter.

Wenn ich z.B die Variable „Tempmax“ unter einer flexibelen Instanz definieren könnte, dann müsste ich diese jeweils nur anlegen und nicht die ID im Script ändern.

Bsp:

Instanz1

  • Tempmax
  • Script

Instanz2
-Tempmax

  • Script

Es wäre doch toll, wenn ich eine Variable hätte, welche automatisch die ID von Tempmax ausliest.
Und zwar immer die ID von Tempmax, unter welcher sich auch das Script befindet.

Ehrlich gesagt nicht ganz, ich vermute aber mal das Du einfach einen Code mehrfach wieder benutzten willst.

Dafür gibt es Funktionen. Hier übergibst Du einen Wert, die Funktion führt dann immer das gleiche Muster durch mit den an diese übergebenen Werten. Das lohnt sich dann wenn Du immer wieder das gleiche machen willst, insbesondere wenn der Code länger ist und sich wiederholt, dann schreibst Du eine Funktion.


$AußentemperaturNord = GetValue(33648 /*[Außenbereich\Außentemperatur Nord\Wert]*/);
$Außentempmin = GetValue(50088 /*[Außenbereich\Außentemperatur Nord\Außentempmin]*/);
$Außentempmax = GetValue(43356 /*[Außenbereich\Außentemperatur Nord\Außentempmax]*/);
SetTemperature($Außentempmin, $Außentempmax, $AußentemperaturNord, 50088, 43356, 38119, 24202);

function SetTemperature($readingmin, $readingmax, $temperature, $objidtempmin, $objidtempmax, $objidtimemin, $objektidtimemax)
{
	date_default_timezone_set("Europe/Berlin");
	$timestamp = time();
	$datum = date("d.m.Y-H:i",$timestamp);
	if ($temperature <= $readingmin) 
	{
	setvalue ($objidtempmin, $temperature);
	setvalue ($objidtimemin, $datum);
	}  
	if ($temperature >= $readingmax) 
	{
	setvalue ($objidtempmax, $temperature);
	setvalue ($objektidtimemax, $datum);
	}
}

das einzige was Du dann ändern musst sind die Werte, die Du an die Funktion übergibst. Die Funktion bleibt immer gleich, diese führt ja stets den gleichen Code aus nur mit anderen Werten.

Hallo Fonzo,

Das ist auch ein guter Tipp, Danke!

Ich habe die Frage in meinem letzten Beitrag (kurz vor deinem) nochmal präzisiert.
Hoffe ich jedenfalls :slight_smile:

Moin!

Du suchst vmtl. diesen Befehl hier:
IPS_GetObjectIDByIdent — IP-Symcon :: Automatisierungssoftware

Optimaler Weise arbeitet man mit den Idents der Variable, weil dieser sich nicht durch einfaches umbenennen (aus versehen) ändern kann.

Wenn du weißt was du da machst, kannst du aber auch diesen Befehl hier verwenden:
IPS_GetObjectIDByName — IP-Symcon :: Automatisierungssoftware

Mit diesen Befehlen kannst du die IPS-Variablen-ID über den Namen/Ident der IPS-Variable ermitteln :slight_smile:

Grüße,
Chris

Thema hatte wir erst neulich hier, einfach mal die laufenden Diskussionen verfolgen, da lernt man als Anfänger auch sehr viel :slight_smile:

Weiterhin wird mir für das Script eine Laufzeit von 100ms angegeben.
Es ist zwar nur ein mini-PC (Orbsmart AW-08), aber das kommt mir doch trotzdem etwas sehr lange vor.
Bei 10 Scripten rödelt der ja 1sek…
Kann das richtig sein ?

Du kannst davon ausgehen, dass IPS nur einen Zeitschlitz für die Ausführung des Skriptes verwendet hat; je nachdem was Du eingestellt hast, können die 10 Skripte parallel ablaufen (siehe Einstellung ‚Willkommen‘ -> ‚Expertenansicht hinzufügen‘ -> ‚PHP-Informationen‘ -> ‚OK‘).
Rein Subjektiv habe ich den Eindruck, dass beim ersten Ablauf eines Skriptes wg. der Erstinterpretation der Ablauf als besonders lange angezeigt wird (ich hab mir aber nie die Mühe gemacht die Laufzeiten mit PHP zu messen).

Viele Grüsse
Harald