Triggerproblem

Hi,

ich habe ein Script, dass bei onChange zweier Variablen aufgerufen wird. Die Variablen werden gesetzt, wenn ein Fenster geöffnet oder geschlossen wird.

Öffne ich das Fenster, ändern sich auch die Variablen, das habe ich getestet. Aber das Script wird nicht gestartet. Ich habe auch schon die Variablen gelöscht und nur eine Variable neu bei onChange eingetragen.

Merkwürdig ist nur, ändere ich den Variablenwert von Hand, wird auch das Script gestartet. Lasse ich dann die Variable wieder durch schliessen/öffnen des Fensters ändern, startet das Script nicht, obwohl sich der Variablenwert geändert hat.

Ich wünsche einen schönen Tag.

Christoph.

OnUpdate würde helfen.

Hallo Rainer,

onUpdate ist was anderes, als onChange.

Das Script macht folgedes: Wenn ein Fenster geöffnet wird, obwohl es draußen wärmer ist als drinnen, dann soll Steffi kurz mal Bescheid geben. Wenn ich onUpdate benutze, dann quäkt der Rechner bei jedem Messwert, bis das Fenster zu ist. Das möchte ich eigentlich nicht.

Um mit onUpdate zurecht zu kommen müsste ich noch eine Variable anlegen und nachschauen, ob ich das geöffnete Fenster schon bemängelt habe.

Funktioniert denn onChange nicht? Dann muss ich natürlich den anderen Weg nehmen.

Ich wünsche einen schönen Abend.

Christoph.

Hallo Christoph,

ich bin nicht der PHP Guru,

aber deiner Beschreibung nach stimmt mit deinem Trigger was nicht, eher noch Fehler im System :smiley:

Fenster würde ich als bool oder int setzen also true oder false. Sonst 1 oder 0.

so wie es aussieht triggert er wohl irgendwie doppelt.

Code hilft viel.

Hallo Rainer,

Ja im Moment bin ich ratlos. Setze ich die Variable von Hand, dann klappts, wird die Variable durch den Fensterkontakt gesetzt, klappts nicht, obwohl sich auch hier der Wert der Variable völlig korrekt ändert.

Jetzt nicht mehr. Ich habe eine Triggervariable rausgeworfen. Aber immer noch mit dem selben Problem. Ich hatte es aber falsch erkannt. Die Skripte werden korrekt gestartet. Lediglich die Ansage ist nicht zu hören.

Dieses Script wird durch den Fensterkontakt getriggert:

$wz_fensterstatus=0; // fenster ist zu;  wenn 1, dann auf
$sag_es="";

// jetzt erst ermitteln, welche Variable aktueller ist FensterStatus, oder die Solltemp.
if(IPS_GetUpdateTime("WZ_H_Fenster")>IPS_GetUpdateTime("WZ_H_Temp_Soll_Read"))
 { if(GetValueBoolean("WZ_H_Fenster")) $wz_fensterstatus=1;
 }
else
 { if(GetValueFloat("WZ_H_Temp_Soll_Read")==8) $wz_fensterstatus=1;
 }
 
$status=GetValueInteger("Terassentemperatur_Status");
if(($status&1)==0) return; // Überwachung ist abgeschaltet

require_once '../web/include/GERAETE.php';

$temp_terasse=GetValueFloat("TE_RX_Thermometer_Temperature");
$temp_wz=GetValueFloat("WZ_H_Temp_gemessen");


// prüfen, ob Fenster falsch geschlossen/geöffnet wurde (z.B. geöffnet, obwohl es draußen wärmer ist, die Variable aber auf kühen steht
if($wz_fensterstatus==1)
 { // Fenster ist offen
 if(($status&2)!=0)
  { if($temp_terasse>$temp_wz) $sag_es.="- Bitte das Wohnzimmerfenster wieder schließen. Draußen ist es zu warm!"; // Ansagen für Kühlen
  }
 else
  { if($temp_terasse<$temp_wz) $sag_es.="- Bitte das Wohnzimmerfenster wieder schließen. Draußen ist es zu kalt!"; // Ansage für Heizen
  }
 }
else
 { // Fenster ist zu
 if(($status&2)!=0)
  { if($temp_terasse<$temp_wz) $sag_es.="- Bitte das Wohnzimmerfenster wieder öffnen. Draußen ist es kälter als im Wohnzimmer!"; // Ansagen für Kühlen
  }
 else
  { if($temp_terasse>$temp_wz) $sag_es.="- Bitte das Wohnzimmerfenster wieder öffnen. Draußen ist es wärmer als im Wohnzimmer!"; // Ansagen für Heizen
  }
 }

if($sag_es!="")
 { //SetValueString("SAG_ES",':KH WZ sz WG:'.$sag_es);
 SetValueString("SAG_ES",':KH WZ sz WG:'.$sag_es);
 IPS_RunScript("Sag_Es");
 }


// Heizungssteuerung läuft im Moment nicht korrekt, daher jetzt abbrechen
return;

Wenn ich mir die Variable SAG_ES anzeigen lasse, dann sehe ich, dass der Wert völlig korrekt ist.

Das Script Sag_Es sieht dann so aus:

$sag_text=GetValueString("SAG_ES");
if(substr($sag_text,0,1)!="!")
 { if(strftime("%H%M")<700||strftime("%H%M")>2300) return; // vor 7 und nach 23 Uhr nichts mehr sagen!
 }

require_once '../web/include/GERAETE.php';

if(IPS_SemaphoreEnter("SAG_ES", 10000))
 { // Script nur 1x innerhalb von 10 Sek. aufrufen lassen. Alle weiteren Aufrufe in dieser Zeit werden ignoriert.
 // Hierdurch wird verhindert, dass das Telefon doppelt angerufen wird. Bei späteren Auflegen beibt dann die erste Verbindung bestehen!
 $alter_Status=GetValueBoolean("WZ_Couch_Sound.Status");
 $geraete=substr($sag_text,0,12); // Hier steht z. B. :WZ WG SZ KH:
 if(strstr($geraete,'WZ'))
  { // erst schauen, ob Lautsprecher im WZ an sind, dann nochmals einschalten, sonst für 30 Sek. einschalten
  if($alter_Status)
   { FS20_SwitchMode($WZ_SOUND_20, true); // ist an, dann kann ich ja nochmals einschalten
   }
  else
   { FS20_SwitchDuration($WZ_SOUND_20, true, 30); // ist aus, dann für 30 Sec. ein **************
   }
  }
 if(strstr($geraete,'WZ')) IPS_Sleep(4000); // noch warten, damit die Teufelbox einschalten kann
 if(strstr($geraete,'WZ')) TTS_Speak($TTS_WZ, substr($sag_text,12));
 if(strstr($geraete,'KH')) TTS_Speak($TTS_KH, substr($sag_text,12));
 if(strstr($geraete,'WG')) TTS_Speak($TTS_WG, substr($sag_text,12));
 SetValueBoolean("WZ_Couch_Sound.Status",$alter_Status); // alten Status wieder annehmen
 SetValueString("SAG_ES",'');
 IPS_SemaphoreLeave("SAG_ES");
 }

Der Statuswert für die Box im Wohnzimmer ist korrekt, die Box müsste eigentlich einschalten (sh ********). Das klappt aber nicht.

Klar, ist ein FS20-Aktor, also sollte man meinen der Funk sei gestört. Aber was ich nicht verstehe ist, dass wenn ich die Variable von Hand setze, die Box immer einschaltet, wenn sie vom Türkontake gesetzt wird, aber nie einschaltet. Das kann nichts mit dem Funk zu tun haben, zumal der Aktor mit Superhet-Empfänger umgebaut ist und von 100 Schaltvorgängen ca. 99,8 mal auch korrekt schaltet.

Sorry für den langen Text.

Christoph