Gartensteckdose schalten in verschiedenen Modi funktioniert nur sporadisch

Hallo Zusammen,

ich habe im Garten an der Steckdose im Sommer einen Rasenmäherroboter und im Winter einen Beleuchtung für einen Baum.
Dazu kann man in IPSView 3 Modi auswählen, 1: dauerhaft an, 2: Zeitautomatik, anschalten mit Locationcontrol, ausschalten zu fester Zeit, 0: Manuell an & aus.

Es geht um den Modus 2, die Beleuchtung geht nur an ca. 6 von 10 Abenden an.
Das sollte so gehen: Locationcontrol führt das Script aus wenn die Sonne untergeht und sollte dann auch die Lampe schalten. Abschalten (geht zuverlässig) über einen Aufruf in der Woche um 23:00 und am WE um 23:59.
Hat jemand eine Idee woran es liegt?

<?
$modus=GetValue(23561 /*[Funktionen Automatik\Gartenleuchte / Steckdose\Gartensteckdose\Modus Gartensteckdose]*/);
$status= GetValueBoolean(59741 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)\STATE]*/);
$time_an=GetValueInteger(20591 /*[Location Control\Sonnenuntergang]*/);
$time_an=date("H:i", $time_an);

$time_aus_woche="23:00";
$time_aus_wochenende="23:59";

$time_now=date('H:i');

If (($modus== 1) and ($status == false)) {
	HM_WriteValueBoolean(56296 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)]*/, "STATE", True);}

If (($modus== 2) and ($time_an==$time_now) and ($status == false)) {
	HM_WriteValueBoolean(56296 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)]*/, "STATE", True);}

If (($modus== 2) and (($time_aus_woche==$time_now) or ($time_aus_wochenende==$time_now)) and ($status == true)) {
	HM_WriteValueBoolean(56296 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)]*/, "STATE", false);}
If ($modus== 0){
	return;}
?>

Anbei noch die Variable mit den entsprechenden Ereignissen als Screenshot! (Sieht etwas kacke aus :smiley: )

Gruß,
Matthias

Hallo Matthias,

Du vergleichst 2 Strings(5) miteinander, könntest also auch „===“ verwenden statt „==“. Gib doch mal die beiden Werte von $time_an und $time_now als LogMessage aus. Wenn sie nur 1 Sekunde auseinander liegen, könnte die Differenz ja eine Minute betragen.

Grüße, Gerhard

Hallo Gerhard,

es hat aufgrund von Nachwuchs ein bisschen gedauert…

Also: Der Auslöser ist ja die Location-Control von IPS.
Ich lese die Zeit für den Sonnenuntergang in dem Moment in dem diese aktualisiert wird (einmal pro Tag zum Sonnenuntergang). Damit sollte eigentlich beides Synchron sein oder?
Ich kann eigentlich nicht nachvollziehen wie das abweichen kann…

Ehrlich gesagt geht aber hier um nichts genaues und ich habe keine große Lust da jetzt viel zu forschen.
(es gibt ja anderes zu tun, siehe erster Satz :D)
Daher: Hast Du eine Ahnung wie ich das mit Toleranz prüfen kann (also z.B. +/- 2min.)? Ich habe irgendwie nichts gefunden wie ich das bewerkstelligen kann.

Gruß,
Matthias

ich würde einfach auf die Uhrzeit-Abfrage verzichten, dafür abfragen wie das Auslöse-Event heisst, das wäre zuverlässiger. Also du nennst das Einschalt-Event einfach anders als das Ausschalt-Event und fragst diese statt der Uhrzeit ab

//EDIT: Sehe gerade das ich das schlecht „beschrieben“ habe, du vergleichst natürlich nicht aufgrund der Namen sondern der IDs der Events, Name würde zwar auch gehen wäre aber umständlicher. Das Timerevent bekommst du ja per $_IPS[‚EVENT‘]

Hallo Hagbard,

danke für den Tip! Ich weiß genau was Du meinst, also quasi das gleiche wie bei einem normalen Timer.
[Also $IPS_SENDER == „TimerEvent“)]
Aber, folgende zwei Fragen:

  1. Wäre es so richtig:
If (($modus== 2) and ($IPS_SENDER == $_IPS[44517]) and ($status == false)) {
	HM_WriteValueBoolean(56296 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)]*/, "STATE", True);}

Ich will ja genau das eine Event als Auslöser abfragen. Oder habe ich irgendwie Unsinn in der Syntax?

  1. Diesen Index gibt es nur wenn das Skript durch den Timer gestartet wurde.
    Was mache ich denn um zu verhindern, dass im Falle des Startens von einem anderen Auslöser diese Funktion einen Fehler zurückgibt? Wenn man das ohne das Event startet, kommt:

Notice: Undefined offset: 44517 in C:\IP-Symcon\scripts\16453.ips.php on line 19

Siehe auch hier: Frage zu $IPS[‚EVENT‘]

Es wäre natürlich möglich, dass ich das IF ans ende stelle und das Skript abfrühstücke bevor der Fehler kommt - ist aber nun wirklich nicht elegant :wink:

Gruß,
Matthias

Ich würde auf den Sender und die Variable abfragen:

($_IPS[‚SENDER‘] === ‚Variable‘) && ($_IPS[‚VARIABLE‘] === 20591)

If (($modus== 2) and ($_IPS['EVENT'] == 44517) and ($status == false)) { 

so wäre es richtig

in $_IPS[‚EVENT‘] steht die ID des Events drin, das der Auslöser war

achso und wegen
2.

aus deinem Baum sehe ich nur Events die dein Script starten, also Timer- oder Variblen-Event, bei beiden ist die Variable vorhanden.
Wenn du das Script über noch einen Weg startest, dann machst du vor den Event-Part einfach die Abfrage um den Teil:



if (($IPS_SENDER == "TimerEvent") or ($IPS_SENDER == "StatusEvent"))

dann läuft er nur im Event-Fall da durch und erzeugt im anderen Fall natürlich auch keinen Fehler

Hey Hagbard & Bumaas,

Da es mich echt nervt wenn Leute Fragen stellen und dann wenn es (wahrscheinlich) funktioniert zu faul sind nochmal zu antworten, hier der letzte Stand:

Ich habe jetzt eine verschachtelte Funktion draus gebaut, also beide Abfragen hintereinander…

if (($IPS_SENDER == "TimerEvent") or ($IPS_SENDER == "StatusEvent"))  {
	If (($modus== 2) and ($_IPS['EVENT'] == 44517) and ($status == false)) {  
		HM_WriteValueBoolean(56296 /*[Komponenten\Schaltaktoren\Schaltaktor-Keller\Steckdose(2)]*/, "STATE", True);}
}

Morgen Abend zum Sonnenuntergang weiß ich dann mehr darüber ob es funktioniert oder nicht :wink:

Gruß, Danke & schönen Abend noch!
Matthias

UPDATE: Es geht nicht :-/
Hat jemand noch einen Vorschlag? Sonst splitte ich das in zwei Skripte und schalte das Event nur ein, wenn der Modus 2 gewählt ist.

Es geht nicht ist jetzt nicht gerade eine qualifizierte Fehlermeldung :smiley:

Sagt aber alles wesentliche in Boolean aus - die Lampe ist gerade auf FALSE :smiley:

Also sie ist nicht angegangen… Ich habe aber nicht zum Sonnenuntergang geschaut was im Log stand :-/
Ich kann das Script aktuell natürlich ausführen und es passiert einfach nix…