Variablen Benutzung im Script

ich habe vor ca. 2 Wochen von V1 auf V2 umgestellt. Es ging auch relativ problemlos.
Jetzt ist mir aufgefallen das wenn ich eine Variable in ein Script, über die rechte Mousetaste und dann „Selcet Object“, einfüge nicht der „Objectname“ sondern die „ObjectID“ eingefügt wird.

Soll das so sein oder liegt bei mir ein Fehler vor ???

if(GetValueBoolean("30704"))

So müsste es sein :slight_smile:


if(GetValueBoolean(30704)) 

paresy
</span></span>

es werden also nur noch die ID’s benutzt.

neu

if(GetValueBoolean(30704)) 

gleiche funkion alt

if(GetValueBoolean("Kueche_Bewegungsmelder.Status"))

id 30704 = Variable „Kueche_Bewegungsmelder.Status“

Hallo Sven,

ja. Du kannst aber auch die Namen per Hand übertragen.
Den Sinn habe ich auch noch nicht verstanden :wink:

Das ist der Hauptgrund, warum ich am Übernehmen des sFHT Scripts gescheitert bin.
Ich habe jetzt erst einmal eine einfache Zwischenlösung (ohne sFHT) geschaffen.
Ich fand die Variante mit Variablennamen besser. (Übersichtlicher)

Gruß
Klaus

Hallo Klaus,

am einfachsten ist es die Variablen genauso zu bezeichen wie sie waren. Das Script erst mal 1zu 1 übernehmen.
Alle Änderungen dann händisch vornehmen. Ist erstmal umständlich aber es geht.

Bei mir sieht es in etwa so aus:

if(GetValueBoolean(30704  /*[unten\kueche\Kueche_Bewegungsmelder.Status]*/);

Der Pfad und der Variablen Name wird aber erst nach dem Abspeichern angezeigt. Durch den zusätzlichen Pad noch besser als in V1

Hallo,

Der Pfad und der Variablen Name wird aber erst nach dem Abspeichern angezeigt. Durch den zusätzlichen Pad noch besser als in V1

Das ist richtig, aber es erscheint erst so wenn das entsprechende Script geschlossen und wieder geöffnet wird, nicht beim speichern.

Edit: Hmm das war wohl mal so.

Ich weite das ganze noch mal aus, eventuell splitten.

In einer function, funktioniert die interne Variable auch nicht mehr.

Beispiel: $Xbee = 12345;

COMPort_SendText($Xbee, $Startbyte.$txt.$crc);

In der function geht nur noch 12345, ansonsten kommt eine Fehlermeldung.

function Reseten()
{
 SetValueInteger("FarbwertRot", 0);
 SetValueInteger("FarbwertGruen", 0);
 SetValueInteger("FarbwertBlau", 0);
 SetValueInteger("Rot", 0);
 SetValueInteger("Gruen", 0);
 SetValueInteger("Blau", 0);
 $cmd = chr(0).chr(0).chr(0xFE);
 $txt = "\x00\x00\x00".$cmd;
 $crc = CRC16r("\xCA".$txt);
 $txt = str_replace(chr(0xCB), chr(0xCB).chr(0x01), $txt);
 $txt = str_replace(chr(0xCA), chr(0xCB).chr(0x00), $txt);
 COMPort_SendText(12345/*[Chromoflex]*/, "\xCA".$txt.$crc);
}

Ich hatte mir strukturierte Variablennamen angelegt.
Diese habe ich mir dann im Script zusammengebastelt. So etwas auf IDs umzustellen ist sehr viel Aufwand.

Zum Glück habe ich noch nicht so viele Programme fertig gehabt.
Meine PHP Kenntnisse reichen für eine Übertragung der Scripte nicht aus.
(Vieles war auch hier aus dem Forum zusammengeklaubt)

Meiner Meinung nach hätte man zusätzlich auf IDs gehen können.
Die Variablennamen mehr oder weniger wegfallen zu lassen ist aber suboptimal.

Mußte ich mal loswerden. Hat mich halt schon einige Abende gekostet.
OK, hab auch was gelernt. :rolleyes:

Gruß
Klaus

Hallo Klaus,

ist halt noch Beta, es ging ja auch schon mal, zumindest teilweise.

paresy wirds schon richten.

Ich habe es eher so verstanden, dass es gewollt ist über die ID zu gehen.
Wenn es anders sein sollte wäre ich natürlich begeistert.

Gruß
Klaus

Hallo,

hab gerade die ersten Gehversuche mit Version 2 gemacht. Und bin auch etwas über die Variablen gestolpert.
Ich möchte lieber meine Struktur verwenden, als die IDs pflegen zu müssen. Aber es gibt glaube ich eine Lösung.
Um euer Beispiel aufzugreifen. Die Zeile:

if(GetValueBoolean(30704)) 

Könnte man in Version 2 so aussehen lassen:

if(GetValueBoolean(IPS_GetObjectIDByName("Kueche_Bewegungsmelder.Status", 0)))

Über die Funktion IPS_GetObjectIDByName sucht sich IPS dann die ID selber raus.
Hab ich aber nur kurz getestet. Wie es aussieht, wenn man ganze Pfade verwendet weiss ich noch nicht.

Ich hab mir mal ein Beispiel gebastelt:

include IPS_GetObjectIDByName("Funktionsbibliothek", 0) . ".ips.php";

echo IPS_GetObjectIDByName("Test", IPS_GetObjectIDByName("Globale Variablen", 0)). "
";

echo GetObjectID("Globale Variablen/Test") . "
";

Wobei die Funktionsbibliothek so aussieht:

function GetObjectID($strObject){

	$parent = 0;
	$child = 0;

	$Objects = explode("/", $strObject);
	foreach ($Objects as $Object){
	   $child = IPS_GetObjectIDByName($Object, $parent);
	   $parent = $child;
	}
	return $child;
}

Auf diese Weise kann man die Variablen über einen strukurierten String ansprechen.
Sollte das alles schon mit Boardmitteln gehen und ich war nur zu faul zum suchen, sehe ich das als erste PHP Übung an um wieder rein zu kommen. :slight_smile:

In IPS V2 sollen nur noch ID’s verwendet werden. Dass Namen Möglich sind, liegt daran, dass wir die wichtigsten Funktion V1 Kompatibel halten wollen. Jedoch gibt es dann uneindeutigkeiten und ihr werden bei allen Modulen die Variablen deswegen umbennen müssen, da sie standartmäßig mit Namen wie Status, Temperatur, Intesity erstellt werden, die nicht eindeutig sein.

@RWN: Das der Kommentar beim Einfügen nicht hinzugefügt wird, werde ich zur nächsten Version beheben.

@All: Warum wehrt ihr euch so gegen die ID’s!? Der Skript Editor fügt doch den aktuellen Ort, samt Pfad, immer in euer Skript ein. Das ist besser und genauer als jede Variable die ihr euch ausdenken könnt. Und der Kommentar ist immer aktuell auch wenn ihr die Variable umbennt oder verschiebt. (Das Skript muss nur neu im Skript Editor geöffnet werden)

@McFly: Hier der Tipp, wie man Skripte per Namen einbindet:

Auch nochmal ein Hinweis auf die neue Befehlsreferenz: http://www.ipsymcon.de/downloads/ips2manual/

paresy

Was muß ich denn anstellen, das ich den Namen mit angezeigt bekomme?
Bis jetzt habe ich die IDs immer von Hand eingetragen.
Gibt es eine andere Möglichkeit?

Wenn ich jedesmal einen Komentar einfügen muß, was mit dieser ID gemeint ist, dann kann dies nicht der richtige Weg sein.

STRG+O öffnet ein Auswahlfenser.

Der Kommentar kommt wird hinzugefügt, sobald du das Skript speicherst und neu öffnest. (In der nächsten Version wird er direkt nach dem Auswählen hinzugefügt)

paresy

Also, ich halte die „uneindeutigkeit“ von Variablen sogar für einen Vorteil.
Mir schwebt sowas vor.
Variablen:
Wohnzimmer/Rollo.Status
Schlafzimmer/Rollo.Status

Nun soll es ein Programm geben, dass alle Rollos schliesst. Anstatt mir ein Array machen zu müssen in das ich alle IDs eintrage die Rollos sind. Brauche ich nur noch durch die Zimmer zu schleifen und immer $Zimmer. „/Rollo.Status“ zubearbeiten.
Meiner Meinung nach lässt es sich viel besser objektorientiert arbeiten, wenn man die vorhandene Struktur der Variablen benutzen kann.
Wenn man dafür selber auf eine vernünftige Bennenung achten muss mache ich das gerne.
Wie ist das eigentlich wenn ich das Project auf einen anderen PC übertrage. Ändern sich auch die IDs. Hab noch in dunkler Erinnerung, dass ich mal Probleme mit sich ändernden IDs bei der V1 hatte (vor Ewigkeiten).

@parey: Danke für die Beispiele. Ich war gerade so im GetIDByName-Fieber. :smiley:

Edit: ganz vergessen. Es ist ein Vorteil, z.b. einer Funktion nur einen Aktor zu übergeben. Die Zielfunktion kann sich dann selber die Untervariablen holen.
Z.B. (ist natürlich kein gültiger PHP-Code.)

machwasdamit(Rollo)
machwasdamit($Item) {
  $Status = GetValue($Item . "/Status");
}

@paresy
das bedeutet dann ich kann keine Variablen mehr von Hand eingeben sondern muß mich immer durch den Objektbaum klicken?
Ich weiß nicht, ob dies wirklich komfortabel ist. Schneller geht es von Hand.

Vielleicht bin ich es nur nicht gewohnt.
So etwas als Hilfe ist klasse, als einzige Eingabemöglichkeit finde ich es unbequem.

Doch. Du kannst die 5 Stellige ID eingeben. (Die ist immernoch kürzer als jeder Textvariable, wenn auch vielleicht etwas komplizierter zu merken. Aber das Kurzzeitgedächnis soll mit 5 stelligen Zahlen kein Problem habe ;))

Der Ort+Name des Gerätes wird dann beim erneuten Öffnen des Skriptes automatisch hinzugefügt, damit du beim nächsten Mal auch weißt, wem die ID gehört.

paresy

Ich muss da sabbelsau unterstützen, bei mir funktioniert bisher kein Skript mehr. Diese Änderung stellt alles bisherige auf den Kopf.

Ein Austausch von Skripts wird auch schwieriger, bzw. man muss von Anfang an dran denken.

Gruss

hightower