Wie greife ich auf eine externe Variable zu?

Hallo,

ich verwende das Modul IPSWEatherForecastAT

Wie kann ich nun in meinen eigenen Scripts auf eine Variable (Beispiel: $TodayTempMax) zugreifen?

Danke
Markus

Suche bzw. die Doku hast Du sicher bemüht :rolleyes:

http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/variablenzugriff/getvalue/

Gruß
Bruno

und ggfls. hier auch nochmal gucken:

http://www.ip-symcon.de/service/dokumentation/konzepte/variablen/

Prinzipiell ja, wurde aber nicht ganz schlau… :wink:

So bekomme ich den Wert: GetValue(56915)

Das bedeutet jetzt aber, ich kann nur via der ObjectID (Nummer der Variable) darauf zugreifen?

http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/objektverwaltung/ips-getobjectidbyname/

Vielleicht irre ich mich aber ich höre da ein Mißverständnis raus. Es gibt zwei Sorten von Variablen.

Die die mit einem $ anfangen sind lokale Variablen und nur innerhalb eines Scriptes, also dieser einen Ansicht, verfügbar. Sie haben keine ID (Nummer) und sind nur für den Sekundenbruchteil les- und schreibbar wo das Script läuft. Startet das Script erneut sind sie wieder leer.

Die anderen Variabeln sind global. Das bedeutet sie sind systemweit eindeutig und einmalig. Sie können in jedem Script und auch von ausserhalb IPS beliebig oft gelesen und geschrieben (Auchtung: es gibt auch den Sonderfall der Read-Only Variablen) werden. Der Wert dieser Variablen bleibt bestehen und überlebt auch einen Reboot oder Stromausfall (wenn man nicht grad ganz doll Pech hat).

Wenn man an eine $-Variable ran will muss man sich den Wert u.U. erst in eine IPS-Variable (die mit den Nummern) zwischenspeichern.

Gruß,

Toni

Was will ich?

In der Verwaltungskonsole, Tree:

IP-Symcon\Program\IPSLibrary\modules\Weather\IPSWatherForcastAT

stehen eine Menge an „Variablen“ die ich in meinem php Script verwenden möchte. Der Zugriff mit

GetValue(56915);

funktioniert. Über den Namen komme ich nicht ran:


$ObjektID = @IPS_GetObjectIDByName("$TomorrowTempMin", $ParentID);
if ($ObjektID === false) 
    echo "Objekt nicht gefunden!";
    
else {
    echo "Die Objekt-ID lautet: ". $ObjektID;
    print_r($ObjektID);
     }


ergibt „Objekt nicht gefunden!“

Schreibe ich zuvor in $ParentID die ObjektID von „IPSWatherForcastAT“ erhalte ich eine leere Ausgabe aber keine Meldung.

Gruß
Markus

Wenn man an eine $-Variable ran will muss man sich den Wert u.U. erst in eine IPS-Variable (die mit den Nummern) zwischenspeichern.

Es ist wie Toni geschrieben hat. Wenn Du an den Wert ran willst musst Du ihn in dem Wetter-Skript mit

SetValue(xxxxx, $TomorrowTempMin); 

in einer IPS-Variable abspeichern die Du dann in einem anderen Skript mit GetValue wieder auslesen kannst.

Hallo Markus,

wie heißt die Variable im Objektbaum genau? Heißt sie wirklich „$TomorrowTempMin“? Wenn sie dagegen „TomorrowTempMin“ heißt, dann ist das „$“ Zeichen in

$ObjektID = @IPS_GetObjectIDByName("$TomorrowTempMin", $ParentID);

zuviel.

Sonst mach mal einen Screenshot von deinem Baum.

Gruß

Burkhard

Das was Toni beschrieben hat ist auch hier drin, mit Bildern.
Du musst wirklich erst den unterschied zwischen Variablen in PHP Skripten ($abc) und IPS Variablen (name: „abc“) verstehen.

Die Variable ist doch offensichtlich da und angelegt, was soll er denn da verstehen oder extra speichern :eek:

Somit stimmt was mit dem Namen nicht. Spielt aber erstmal keine Rolle da die ID ja funktioniert. Alternativ wie beschrieben mal einen Screenshot machen.

Mir geht es nicht nur um getIDbyName sondern um die grundsaetzliche Fragestellung.
ByID oder byName ist dann ja nur eine Feinheit.

Danke an alle!

Das $ Zeichen war zuviel, richtig ist „TomorrowTempMin“

Im Prinzip funktioniert der folgende Code:

echo "TomorrowTempMin: ";
print_r(LeseVariblenWert("TomorrowTempMin"));  // Nur darum geht es mir.


function LeseVariblenWert($myStr) {
$ParentID=49608;
$ObjektID = @IPS_GetObjectIDByName($myStr, $ParentID);

	if ($ObjektID === false)
   	echo "Objekt nicht gefunden!";

	else
		return GetValue($ObjektID);

	return null;
}

Nur ohne der Angabe der $ParentID geht es nicht, damit bin ich wieder fast am Anfang, wie komme ich zur $ParentID? Ich weiss den Namen, aber nicht die ID.

Diese ObjektId kann ich zwar wieder abfragen:

$ParentID=54704;
$ObjektID = @IPS_GetObjectIDByName("IPSWeatherForcastAT", $ParentID);

if ($ObjektID === false)
    echo "Objekt nicht gefunden!";
else
    echo "Die Objekt-ID lautet: ". $ObjektID;

Dazu muss ich aber wieder die ObjektID des übergeorneten Objektes kennen, das artet dann in folgenden Code aus:

$ParentID=0; // Root

$NextID=LeseObjektID("Program", $ParentID);
$NextID=LeseObjektID("IPSLibrary", $NextID);
$NextID=LeseObjektID("data", $NextID);
$NextID=LeseObjektID("modules", $NextID);
$NextID=LeseObjektID("Weather", $NextID);
$NextID=LeseObjektID("IPSWeatherForcastAT", $NextID);


echo "
TomorrowTempMin: ";
print_r(LeseVariblenWert("TomorrowTempMin", $NextID));


function LeseVariblenWert($myStr, $ParentID) {

$ObjektID = @IPS_GetObjectIDByName($myStr, $ParentID);

	if ($ObjektID === false)
   	echo "Objekt nicht gefunden!";

	else
		return GetValue($ObjektID);

	return null;
}

function LeseObjektID($myStr, $ParentID) {
$ObjektID = @IPS_GetObjectIDByName($myStr, $ParentID);

echo "
";

if ($ObjektID === false)
    echo "Objekt nicht gefunden:". $myStr;
else {
    echo "Die Objekt-ID Program lautet: ". $ObjektID;
    return($ObjektID);
}



return null;
}

Das geht doch sicher einfacher, ich will ja nur den Wert einer Variblen lesen… :wink:

Gruß
Markus

Hab zwar jetzt kein fertiges Script … Aber ich würde es vom Ansatz her so machen.

eine Liste der ID mit IPS_GetObjectList() holen
Diese mit einer foreach-Schleife auswerten
die jeweils gelieferte ID mit IPS_GetObject (ID) auslesen
und den Index „ObjectName“ mit dem Gesuchten vergleichen.

So in etwa…

Hallo!
Verstehe ich noch immer nicht warum ParentID usw.

Du hast doch die Variable mit der entsprechenden ID. Nimm sie doch…
Wenn nicht schreibe :



SetValue(36854 /*[Heizung\Tempdiff\Tempdifferenz]*/, $temperatur);

In ein neues Script holen mit :

$temperatur = GetValue(30430 /*[Objekt #30430 existiert nicht]*/);

Screenshot bitte!!!
Schönen Gruß:)
Egon

Hallo Markus,

erkläre uns doch bitte einmal, warum du nicht GetValue() verwenden willst. Das ist eigentlich der normale Weg.

Gruß

Burkhard

Die ID kann sich bei erneuter Modul-Installation ändern, der Pfad bleibt gleich, von dem her macht das schon Sinn. :cool:

Ganz genau darum geht es mir:

  1. die ID kann sich ändern (Neuinstallationm, Installation auf einem anderen System,…)
    2) GetValue(4711); ist IMHO nicht gerade super zum lesen und warten…

Anbei auch der Screenshot, ich möchte in meinen PHP Modulen lesend auf die Variablen unterhalb von IPSWeatherForcastAT zugreifen.

Gruß
Markus

Probier es doch so.
Als Beispiel einen kompletten Pfad angeben:

	$id = IPSUtil_ObjectIDByPath('Program.IPSLibrary.data.modules.IPSShadowing.Devices.Device1.Movement');
	echo GetValue($id);

Getvalue(33786) ist was du willst. :rolleyes: Mach es einfach so. Alles Andere ist der Overkill.