Hallo,
ich bin gerade an meinem ersten Modul, bekomme aber nicht den Wert aus der Variable über diesen Ausdruck gelesen:
$this->RegisterPropertyFloat(„OutsideTemperature“, 0); (hier lese ich den Wert aus einer Form)
$Temperatur = $this->ReadPropertyFloat(„OutsideTemperature“); (hier will ich den Wert aus der o.g. gesetzten Variable ziehen.
Ich bekomme aber nicht die Temperatur aus der Variable gezogen, sondern nur die Variablen ID.
Hat jemand eine gute Idee? Ich vermute ich vergesse hier was und kann es trotz nachsehen in den Beispielmodulen nicht finden.
Was ist „OutsideTemperature“ in der form.json ?
Ein Float-Wert als Absolute Temperatur?
Dann passt deine Überschrift nicht, weil es keine Variable sondern ein Wert in der Settings ist.
Oder ein SelectVariable? Dann ist es ein Integer und enthält auch nur die ausgewählte Variable.
Den Wert der Variable musst du natürlich selbst auslesen mit GetValue*
Hier mein Modul.php … es soll Wunderground updaten, wie ich es auch schon mal als Script erstellt hatte.
Das merkwürdige ist, dass wenn ich den unteren Teil aus Public in Apply ausführe, funktioniert alles - wenn ich es automatisch laufen lasse, dann bekomme ich beim Updaten folgenden Fehler:
04.02.2018 17:49:59 | TimerPool | WundergroundSync (Upload to Wunderground): <br />
<b>Parse error</b>: syntax error, unexpected end of file, expecting ‚,‘ or ‚;‘ in <b>-</b> on line <b>1</b><br />
Der Fehler ist ja an sich eindeutig - ich verstehe es aber nicht warum es bei ApplyChange geht und warum unten nicht?
Fonzo hat Recht, weil die Meldung ist eindeutig:
04.02.2018 17:49:59 | TimerPool | WundergroundSync (Upload to Wunderground):
In deinem RegisterTimer wo du erstmal das Echo hast, fehlt das Semikolon.
Dort muss aber eine Funktion deines Moduls aufgerufen werden.
Dieses Beispiel zeigt Fonzo.
Das ist auch falsch, weil 0 ist kein String.
$this->RegisterPropertyString(„WU_ID“, 0);
$this->RegisterPropertyString(„WU_Password“, 0);
Und willst du wirklich über http das Password in Klartext durch das Netz schicken?
Eventuell SSL möglich?
Jetzt verstehe ich … was ich noch nicht verstanden habe ist, welches Instanz ID ich aufrufe, da sich der Timer ja auf „SELF“ bezieht? Die Befehle sind etwas aufwändiger als bei normalen Scripten - ich lerne noch wie es zusammen hängt.
$this->InstanceID ist deine InstanzID.
Befehl deiner Instanz und ID angeben, den Rest macht IPS und erstellt daraus einen Timer.
Wichtig: Timer mit Intervall 0 erstellen, damit er nicht gleich losläuft und Fehler verursacht bevor der User seine Zugangsdaten eingegeben hat.
Im ApplyChanges dann mit SetTimerInterval den Intervall ändern, sofern Userdaten eingetragen wurden.
Michael
danke für Deine Hilfe … ich stehe auf dem Schlauch.
Ich habe folgendes gebaut - es gibt einen Timer der mit 10000 MS vorbelegt ist, Timer wird gesetzt (Prefix ist WUSync) - bleibt auch erstmal inaktiv da „0“ … Bei einem Safe wird er korrekt auf 10000 gesetzt und läuft (mit Fehler) - wenn ich ihn wieder auch „0“ setze läuft er nicht mehr. Die Kommunikation mit dem Timer funktioniert anscheinend - aber er kommt immer noch nicht an die Instanz. Hast Du noch einen Tipp?
$this->RegisterPropertyInteger("Timer", 10000);
$this->RegisterTimer("UpdateTimer",0,"WUSync(\$_IPS['TARGET']);");
}
public function ApplyChanges()
{
//Never delete this line!
parent::ApplyChanges();
//Timer Update
$this->SetTimerInterval("UpdateTimer",$this->ReadPropertyInteger("Timer"));
}
OK … sorry für die vermutlich jetzt super doofe Frage. Welches Methode meinst du - ich verstehe nicht was ich aufrufen muss. Ein reines WUSync_Update tut es leider nicht - hier liegt mein Fehler.
Naja, was willst du den regelmäßig per Timer ausführen ?
Es muss irgendeine public function (Methode) deiner Klasse sein.
Ob das Kind nun Update, Upload, Sync oder sonst wie heißt ist ja egal
public function Update()
{
// Das hier wird durch den Timer ausgeführt
}