Wert von Variable in Modul nutzen

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*


// Create
$this->RegisterPropertyInteger("OutsideTemperature", 0);

// Verwendung
GetValueFloat($this->ReadPropertyIntegert("OutsideTemperature"));

Michael

Mein Held !!! :slight_smile: - GetValue hat gefehlt


$Temperatur = GetValue($this->ReadPropertyFloat("OutsideTemperature"));

Danke

PropertyFloat ist aber falsch!
Das ist ein Integer (ID der Variable)
Michael

Ah - OK … habe es verstand mit dem Integer.

Noch eine Frage.

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?


<?

	class WundergroundSync extends IPSModule
	{
		
		public function Create()
		{
			//Never delete this line!
			parent::Create();
			
			$this->RegisterPropertyString("WU_ID", 0);
			$this->RegisterPropertyString("WU_Password", 0);
			$this->RegisterPropertyInteger("OutsideTemperature", 0);
			$this->RegisterPropertyInteger("Humidity", 0);
			$this->RegisterPropertyInteger("DewPoint", 0);
			$this->RegisterPropertyInteger("WindDirection", 0);
			$this->RegisterPropertyInteger("WindSpeed", 0);
			$this->RegisterPropertyInteger("WindGust", 0);
			$this->RegisterPropertyInteger("Rain_last_Hour", 0);
			$this->RegisterPropertyInteger("Rain24h", 0);
			$this->RegisterPropertyInteger("Airpressure", 0);
			$this->RegisterPropertyInteger("UVIndex", 0);
			
			
			$this->RegisterTimer("Upload to Wunderground", 10000, "echo 'Update Wunderground'");
		}
	
		public function ApplyChanges()
		{
			
			//Never delete this line!
			parent::ApplyChanges();
				
		}
	
		
		public function UploadToWunderground()
		{
			
			$WU_ID = $this->ReadPropertyString("WU_ID");
			$WU_Password = $this->ReadPropertyString("WU_Password");
		
			$date = date('Y-m-d');
			$hour = date('H');
			$minute = date('i');
			$second = date('s');
			$time = $date.'+'.$hour.'%3A'.$minute.'%3A'.$second;
		
			$Temperatur = GetValue($this->ReadPropertyFloat("OutsideTemperature"));
			$TemperaturF = str_replace(",",".",(($Temperatur * 9) /5 + 32));
			$Response =file_get_contents('http://weatherstation.wunderground.com/weatherstation/updateweatherstation.php?ID='.$WU_ID."&PASSWORD=".$WU_Password."&dateutc=".$time.
			"&tempf=".$TemperaturF);
			IPS_LogMessage($_IPS['SELF'], "Wunderground Update TEST: ".$Response);
		
		}
	
	}

?>



RegisterTimer ist denke ich falsch, dies muss heißen


$this->RegisterTimer('WundergroundTimerUpdate', 10000, 'PREFIX_UploadToWunderground('.$this->InstanceID.');');

Danke Fonzo … leider war es das nicht. Es hat nichts mit dem Timer zu tun, sondern irgendwie mit dem Upload zu WU.

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?

Michael

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

Hi 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"));		
		}


WUSync kann nur falsch sein.
Prefix_Methodenname.
Also WUSync_Update oder wie deine Methode halt heißt.

Michael

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 :wink:


public function Update()
{
// Das hier wird durch den Timer ausgeführt
}

Michael

Danke - jetzt habe ich es.

Ich denke in Kürze gibt es ein Modul zum Upload von Daten an Wunderground. :loveips: