Undefined index: EVENT

Hallo,

ich bekomme bei einer IPS-Event-Abfrage folgende Fehlermeldung (gekürzt) :

Notice: Undefined index: EVENT
Error in Script C:\Program Files\IP-S…

IPS_SetEventActive(IPS_GetName($_IPS['EVENT']), false);

Ich habe mal in PHP-Foren nachgelesen und dort heißt es, dass es die Variable evtl. nicht gibt… aber nachdem das Script durch ein Ereignis gestartet wird, muss die Variable ja vorhanden sein und seltsameweise funktioniert das ganze auch insofern, dass ich die Event-ID auch bekomme.
Kann mir das jemand erklären ? Der IPS-Logger schreibt nämlich die halbe Seite mit dem Fehler voll (sehr lästig)

grüße chrissiboy

Sicher das die Fehlermeldung sich nicht auf SetEventActive… bezieht ?
Dort ist der erste Parameter doch bestimmt eine ID und nicht der Name vom Event, welchen du aber mit GetName übergibst.
Alternativ:
Wird diese Zeile vom Script auch ausgeführt wenn etwas anderes als ein Event es startet ?
Dann gibt es den Index Event nämlich nicht.
Michael

ich habe zu Beginn des Scripts die Anweisung

$tt = $_IPS['EVENT'];

WFC_SendPopup(54929 /*[Hauptansicht]*/, "Test", $tt);

eingefügt - nun kommt der Fehler bei dieser Zeile - im Popup erscheint die ID des Events; allerdings produziert er zweimal das Fenster - das erste mal leer und beim zweiten Mal ist die ID des Events drin.

  • der Name ist eine ID - ich denke, ich muss das nur noch in eine INT umwandeln - dann dürfte das kein Problem sein.

Wird das script noch von was anderen als einem Event aufgerufen ?
Das ist die Erklärung für das erste Popup ohne Wert + Fehlermeldung.
Das mit dem Namen habe ich glaube ich nicht verstanden ?!
Dein Event hat als Namen eine 5stellige Zahl eines anderen Events welches du mit SetEventActive steuern willst ? Oder wie war das gemeint? Für solche Querzuordnungen nutze ich immer ObjektInfo, also das Infofeld.
Michael

hm - das mit dem 2. Fenster macht mich auch stutzig - da werde ich morgen mal weiterforschen, obwohl ich sicher bin, dass das Script nur über Events aufgerufen wird.

Ja, du hast das richtig verstanden. Hintergrund: Ich möchte meine Heizung sowohl über Webfront als auch über das Thermostat manuell steuern. Damit habe ich 2 Ereignisse (quasi als paar), die jedoch gegenseitig ihre Auslöser verändern - daher setze ich während der Verarbeitung das gepaarte Ereignis auf inaktiv, bis der Auslöser geändert ist und dann wieder zurüch aktiv. Damit verhindere ich, dass sich die Ereignisse gegenseitig in einer Endlosschleife auslösen.

Sieht dann so aus (wobei Temperatur-Regler ein Schiebe-Regler im WF ist):

switch ($_IPS['VARIABLE'])


{
case (38745 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Temperatur-Regler]*/):
   
   IPS_SetEventActive(18667 /*[Heizungssteuerung\Allgemeine Scripte\Temperatur-Regelung\]*/, false);
   SetValueFloat(38745 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Temperatur-Regler]*/ , $IPS_VALUE);
   SetValue(20352 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Soll-Temperatur]*/, (GetValueFloat(38745 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Temperatur-Regler]*/) / 4) + 5);
   HM_WriteValueFloat(42496 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Steuerung]*/, "SETPOINT", GetValueFloat(20352 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Soll-Temperatur]*/));
   sleep(10);
   IPS_SetEventActive(18667 /*[Heizungssteuerung\Allgemeine Scripte\Temperatur-Regelung\]*/, true);
   break;

case (19760 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Steuerung\Soll-Temperatur]*/):

   IPS_SetEventActive(42648 /*[Heizungssteuerung\Allgemeine Scripte\Temperatur-Regelung\]*/, false);
   SetValueFloat(38745 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Temperatur-Regler]*/ , (GetValueFloat(19760 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Steuerung\Soll-Temperatur]*/) - 5) * 4);
   SetValue(20352 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Status\Soll-Temperatur]*/, GetValueFloat(19760 /*[Heizungssteuerung\Heizung Wohnzimmer\Heizung Wohnzimmer Steuerung\Soll-Temperatur]*/));
   sleep(10);
   IPS_SetEventActive(42648 /*[Heizungssteuerung\Allgemeine Scripte\Temperatur-Regelung\]*/, true);
   break;
default:

}


Aber dann musst du doch immer beide Events inaktiv beim beschreiben der Variablen und anschließend aktiv schalten ?

Außerdem hätte ich das dann immer nur über den Setpoint vom Thermostaten gemacht. Der kann ja immer am Gerät und im Webfront bedient werden ohne das du dafür ein Script brauchst… :confused:
Und nur über ein Event welches am Setpoint hängt dann die Heizung gesteuert.
Michael
PS: Wenn dieses Script von dir als Aktionsscript irgendwo eingetragen ist, ist das der Fehler mit dem Fehlenden Index event.

zum Fehler: ja, du hast mich auf den Weg gebracht - der erste Aufruf ist vom WF ohne Event, daher der Fehler

zur Bedienung: Ich möchte die Temperatur per Schieberegler verändern und nicht über die Leiste, wo man die Temperatur in 0,5-Schritten anklicken muss.

Ich habe jetzt eine Idee, wie ich das optimieren kann - Ziel ist es, keine feste ID mehr im Programmcode zu haben, sondern nur aufgrund der Events/Auslöser die IDs zu generieren, damit ich dieses Script nicht für jeden Heizkörper schreiben muss.

Vielen Dank auf jeden Fall für deine Hilfe.

so, habe mein Script jetzt hinbekommen - es läuft jetzt ohne Fehlermeldungen im Log :slight_smile:


<?

if ($_IPS['SENDER'] = 'VARIABLE')                           // Nur wenn variable geändert wurde
	{
   $Ausloeser = $_IPS['VARIABLE'];
   $Ausloeserinstanz = IPS_GetParent($Ausloeser);           // übergeordnete Instanz
   $Hauptinstanz = IPS_GetParent($Ausloeserinstanz);        // Hauptinstanz  (Klammer über Thermostat + Ventil als Dummy-Modul)
   $Steuerung = IPS_GetObjectIDByName('Steuerung', $Hauptinstanz);     // Instanz für Thermostat-Steuerung
   $Status = IPS_GetObjectIDByName('Status', $Hauptinstanz);           // Instanz für IPS-Steuerung
   
 //  WFC_SendPopup(54929 /*[Hauptansicht]*/, $Ausloeser."+".$Ausloeserinstanz."+".$Hauptinstanz."+".$Steuerung."+".$Status, $Ausloeser);
   
	If (IPS_GetName($_IPS['VARIABLE']) == 'Temperatur-Regler')             // Einstellung über WebFront-Variable
		{
    	SetValueFloat($_IPS['VARIABLE'], $IPS_VALUE);
      SetValue(IPS_GetObjectIDByName('Soll-Temperatur', $Ausloeserinstanz) , ($IPS_VALUE / 4) + 5);
      HM_WriteValueFloat($Steuerung, "SETPOINT", ($IPS_VALUE / 4) + 5);
      }
	else                                                                  // Manuelle Einstellung über Thermostat
	   {
      SetValueFloat(IPS_GetObjectIDByName('Temperatur-Regler', $Status) , (GetValueFloat($Ausloeser) - 5) * 4);
      SetValue(IPS_GetObjectIDByName('Soll-Temperatur', $Status), GetValueFloat($Ausloeser));
      }
   }

?>

Die Struktur dazu sieht so aus:

und so das WebFront:

Heizung 2.gif

Angetriggert wird das Script bei Änderung der Variablen Temperatur-Regler (WebFront) oder Steuerung/Soll-Temperatur (Drehrad am Thermostat).

Nun habe noch ein seltsames Problem:
Bei 2 von 8 Heizungssteuerungen wird der Thermostat-Trigger alle paar Minuten ausgelöst, obwohl sich an der Soll-Temperatur nichts ändert. Ist das was bekannt, dass die Thermostate als Falschmeldungen ausgeben ?

Und Du bist sicher, daß alle Events auf „Variablenänderung“ stehen und die richtige Variable drin steht? Oder hat vielleicht der Haken „nachfolgende Ereignisse“ damit zu tun (weiss gerade nicht, ob der hier eine Bedeutung hat)?

… wenn 2 von 8 Thermostaten betroffen sind … muss ja wohl irgendein Unterschied da sein :cool:

Gruß
Bruno

ja, so etwas hatte ich erst auch vermutet, aber alle Events sind identisch und die Thermostate sind auf cent eingestellt…

so, ich bin der Sache mal nachgegangen - die Problematik entsteht dadurch, dass das Script sowohl bei manueller Änderung am Thermostat als auch bei Änderung über das WF ausgeführt wird. Wenn zwischen den Änderungen 3-4 Minuten liegen, funktioniert alles - werden aber zwei Änderungen vom WF aus in kurzer Folge ausgeführt, bevor das Thermostat den Befehl umgesetzt hat, schaukeln sich die Änderungen gegenseitig hoch. Deshalb waren die Probleme nicht an allen Steuerungen sondern nur an den beiden, an denen ich herumgespielt habe.
Wenn ich in der Objektliste die Soll-Temperatur des Thermostats verfolge, sendet es mehrere der voher eingestellten Temperaturen hintereinander zurück - setzt sich aber wieder auf den zuletzt gesetzten. Das wiederholt sich nun andauernd…

Das sieht dann in etwas so aus …

Vlt. müsste ich nach einer Änderung im WF den Regler solange sperren, bis das Thermostat die Änderung übernommen hat, um Mehrfachänderungen innerhalb eines Zyklus zu vermeiden.
Ihr merkt sicher auch, dass ich noch nicht ganz durchsteige, aber vlt. hat jemand eine Idee, was da genau passiert…

Alter Thermostat, oder ?
Setzte mal in der Instanz mit dem Setpoint den Haken Status emulieren.
Dann wartet IPS nicht auf die Rückmeldung vom Aktor, sondern führt die Variable selbst nach.
Aber ganz ehrlich… ich steig nicht durch was du eigentlich vor hast.
Nur um einen Schieberegler in % zu bekommen, obwohl ich doch schön die Ziel-Temp in Grad einstellen kann.
Was sind denn 70% ? 21 Grad ???
Das würde meinen WAF ja exterm negativ beeinflussen :wink:

Warum nicht einfach swify s Script für Wochenprofile per Webfront einsetzen und den Thermostat seine Arbeit allein per Zeitprofil machen lassen?
Michael

hm - die Thermostate sind Firmware 2.0 und 2.1 … weiß nicht, ob es neuere gibt.
Ja, mir wäre eine Schieberegler von 5 Grad bis 30 Grad auch lieber als von 0-100%, aber das habe ich über das Variablen-Profil nicht hinbekommen - da hatte ich dann wieder die Auswahlfelder mit den Pfeilen und das gefällt mir nicht :frowning:

Ja, das mit dem Simulieren hatte ich auch schon überlegt, aber das hilft ja nicht weiter - das Problem ist ja, dass die Soll-Temperatur des Themostats ja trotzdem nach 2-3 Minuten sich ändert und damit als Auslöser des Scripts wieder wirkt.
Ich möchte kaum zeitgesteuert irgendwelche Änderungen haben - daher sind die Wochensteuerungen ein ziemlicher Overhead - mir ist es wichtig, dass ich am Thermostat und über’s WF manuell eingreifen kann. Aber ich denke, das Problem mit den rekursiven Aufrufen habe ich gestern gelöst.
Das Script reagiert nun nur noch auf eine Änderung amThermostat, wenn die Temperatur sich von der des Temperatur-Reglers unterscheidet. Damit sind die Rekursionen durch die Rückmeldung weg.
Wenn du mir einen Tipp hast, wie ich den Schiebe-Regler auf Grad und den Bereich von 5-30 ändern kann, wäre es natürlich super.

Ich meine schon die Hardware und nicht die Firmware. Gibt schon länger neue Wandthermostaten.
Das mit dem Schieberegler wird nix, der kann nur %.
Der Eintrag Status simulieren lohnt sich bei den Teilen aber immer, sonst wartest du ewig bei der direkt Temperaturauswahl (welche dir ja nicht zusagt).
Michael

Muss das denn ein Schieberegler sein? Habe mir eine String-Var. angelegt, ein kleines Skript dazu und kann jetzt den Wert eingeben (für den seltenen Fall, daß ich das tun will).

Das hatte ich auch zuerst mit der Direkteingabe…aber ich wollte es auch ohne Tastatur ändern können.
Das mit dem Schieberegler ist schade, aber ich kann mit den % leben - aber auf jeden Fall mal danke, dass ihr euch damit beschäftigt habt - durch eure Beiträge bin ich nun auf eine für mich gute und vor allem funktionierende Lösung gekommen…auch wenn sie nicht direkt euer Geschmack ist :slight_smile: