Undefined index: EVENT, was ist da falsch?!?

Moin moin, und ein frohes neues Jahr!

Ich habe ein Script, welches einen HomeMatic-Aktor ausliest, und aus den Einschaltzeiten un der bekannten Leistung des Verbrauchers einen Verbrauch errechnet. Das Script lief eine Zeitlang (unter 3.x) gut, aber irgendwann nicht mehr. Vermutlich geht es seit der Umstellung auf die 4.0 nicht mehr. Heute kümmere ich mich endlich darum. :slight_smile:

Wenn ich das Script ausführe bekomme ich folgende Fehlermeldung:

Notice:  Undefined index: EVENT in /Library/Application Support/Symcon/scripts/53663.ips.php on line 13

Warning:  Ereignis #0 existiert nicht in /Library/Application Support/Symcon/scripts/53663.ips.php on line 13

Warning:  Instanz #0 existiert nicht in /Library/Application Support/Symcon/scripts/53663.ips.php on line 16

In Zeile 13 steht folgendes:

 $EreignisInfo = IPS_GetEvent($_IPS['EVENT']);

in Zeile 16 das hier:

 $modul = IPS_GetInstance($id_geraet)['ModuleInfo']['ModuleName'];

Ich vermute, dass sich hier etwas geändert hat. Wie kann ich das Problem beheben?

Durch ausführen des Scriptes wirst du das so nicht nachstellen können.
Da ‚EVENT‘ dann nie gesetzt ist.
Sondern nun dann, wenn das Script auch durch ein Ereignis ausgeführt wird.

Also entweder ein paar echo oder IPS_LogMessage einbauen und unter Meldungen ansehen was da so passiert.

Oder alternativ $_IPS[‚EVENT‘] mal im Script (zum testen) auf die ID eines Ereignisses festnageln.


$_IPS['EVENT']= 12345 /* Mein Event was das Script aufruft*/;

Michael

Hallo Michael, danke für Deine Antwort.
Leider verstehe ich das nicht was Du schreibst, mir fehlt der Hintergrund dafür. Ich habe nur rudimentäre Programmierkenntnisse, und ich weiß nicht was in diesem Script abläuft. Ich habe damals entweder eine Vorlage gehabt und sie angepasst, oder mir hat jemand geholfen es zu erstellen.

Mein Script lief früher aber mal. Dass es heute nicht mehr läuft kann nach meinem Verständnis eigentlich nur daran liegen, dass irgend eine Funktion in IPS geändert wurde.

Hilft es, wenn ich das ganze Script poste?

Dann ist aber eine Beta-Version zu testen schon sehr grenzwertig :smiley:

Nicht nur das ganze Script. Da es ja u.a. Daten aus dem verschiedenen Objekten (wie den Ereignissen) ausließt, braucht es auch den oder die betreffenden Bereiche aus dem logischen Baum als Screenshot.

War es vielleicht mal das Thema hier ?
Weil dann hättest du die Frage auch dort stellen können.
Einschaltzeiten von Aktor erfassen, Verbräuche

Michael

Es gibt leider keine andere Möglichkeit es unter OS X laufen zu lassen als die Beta. Daher habe ich nicht die Wahl.

Ich hatte es erst unter Windows in Parallels laufen, jedoch gab es immer wieder Probleme sowohl mit Windows, als auch mit Parallels. Außerdem hat es erheblich Ressourcen meines Servers verbraucht. Das war auf Dauer keine Lösung.

War es vielleicht mal das Thema hier ?
Ja, das scheint es zu sein. Dort ist ja auch das Script auch schon.

Weil dann hättest du die Frage auch dort stellen können.
Ja, das stimmt. Kann man die Beiträge irgendwie dorthin verschieben? Soll ich sie dort noch mal posten?

Nee… nun lass uns erstmal raus finden ob IPS4 Problem oder was anderes das Problem ist :slight_smile:
Verschieben kann man es dann immer noch.
Das Script dort ist ja auch nicht zu 100% deines, du hattest es ja angepasst.
Michael

Ja, stimmt. Hier also das Script:

<?

 // Zeit berechnen, wie lange ein Gerät eingeschaltet war
 // und dann den Stromverbrauch berechnen
 // Geräte = "FS20" oder "HomeMatic Device"
 //
 // folgende Variablen je Gerät (Instanz) einrichten:
 // - Leistung          float    ~Watt.3680
 // - Stromverbrauch    float    ~Electricity   loggen als Zähler
 // - letzte Änderung   float


 $EreignisInfo = IPS_GetEvent($_IPS['EVENT']);
 $id_var = $EreignisInfo['TriggerVariableID'];
 $id_geraet = IPS_GetParent($id_var);
 $modul = IPS_GetInstance($id_geraet)['ModuleInfo']['ModuleName'];

// Hier die Geräte und Variablen eintragen
 $id_status  = 42704 /*[Keller\Heizungskeller\Geräte\Heizbetrieb\STATUS E-Heizung KARYON]*/ ; // ID des Status-Kanals eintragen
 $id_zuletzt = 29573 /*[Keller\Heizungskeller\Geräte\Heizbetrieb\letzte Änderung]*/ ; // ID der Variable "letzte Änderung" eintragen
 $id_kwh     = 23710 /*[Keller\Heizungskeller\Geräte\Heizbetrieb\Stromverbrauch KARYON]*/ ;  // ID der Variable "Stromverbrauch" eintragen
 $id_kw      = 46141 /*[Keller\Heizungskeller\Geräte\Heizbetrieb\Leistung]*/ ;        // ID der Variable "Leistung" eintragen


 $kw     = GetValueFloat($id_kw)/1000/3600;        // Watt/1000=kw/3600=pro Sekunde
 $status = GetValueBoolean($id_status);
 $letzte = GetValueFloat($id_zuletzt);
 $var    = IPS_GetVariable($id_status);
 $akt    = $var['VariableUpdated'];

 IF ($status == false)     // Gerät wurde ausgeschaltet
   {
     $zeit   = $akt - $letzte;
     $verbrauch = $kw * $zeit + GetValueFloat($id_kwh);
     SetValueFloat($id_kwh, $verbrauch);
    }

 SetValueFloat($id_zuletzt, $akt);

?>

Hallo
Fuege doch mal in diese erste Zeile folgendes ein.

print_r($_IPS);

Was wird dann im Log angezeigt?

Das kommt dabei raus:

Array
(
    [SELF] => 53663
    [THREAD] => 3
    [SENDER] => Execute
)

Notice:  Undefined index: EVENT in /Library/Application Support/Symcon/scripts/53663.ips.php on line 13

Warning:  Ereignis #0 existiert nicht in /Library/Application Support/Symcon/scripts/53663.ips.php on line 13

Warning:  Instanz #0 existiert nicht in /Library/Application Support/Symcon/scripts/53663.ips.php on line 16

Du kannst das Script zwar manuell (execute) aufrufen, dann funktioniert es aber nicht.
Event bedeutet, dass das Script über ein Ereignis aufgerufen werden muss. Nur dann ist die Variable Event gefüllt.

Also den ganzen Anfang mit $_IPS[‚EVENT‘] brauchst du gar nicht.
Da du ja alle IDs fest eingetragen hast.

Was mich nur wundert, warum der Zeitpunkt der letzten Änderung eine float Variable ist.
Integer wäre hier korrekt für einen Zeitstempel.

Versuch mal folgendes:
Die Variable ‚letzte Änderung‘ einmal löschen.
Neu anlegen als Integer und als Profil ~UnixTimestamp auswählen.
Dann mal dieses Script benutzen.


 // Zeit berechnen, wie lange ein Gerät eingeschaltet war
 // und dann den Stromverbrauch berechnen
 //
 // folgende Variablen je Gerät (Instanz) einrichten:
 // - Leistung          float    ~Watt.3680
 // - Stromverbrauch    float    ~Electricity   loggen als Zähler
 // - letzte Änderung   integer ~UnixTimestamp

// Hier die Geräte und Variablen eintragen
        $id_status = 42704 /* [Keller\Heizungskeller\Geräte\Heizbetrieb\STATUS E-Heizung KARYON] */; // ID des Status-Kanals eintragen
        $id_zuletzt = 29573 /* [Keller\Heizungskeller\Geräte\Heizbetrieb\letzte Änderung] */; // ID der Variable "letzte Änderung" eintragen
        $id_kwh = 23710 /* [Keller\Heizungskeller\Geräte\Heizbetrieb\Stromverbrauch KARYON] */;  // ID der Variable "Stromverbrauch" eintragen
        $id_kw = 46141 /* [Keller\Heizungskeller\Geräte\Heizbetrieb\Leistung] */;        // ID der Variable "Leistung" eintragen

        $kw = GetValueFloat($id_kw) / 1000 / 3600;        // Watt/1000=kw/3600=pro Sekunde
        $status = GetValueBoolean($id_status);
        $letzte = GetValueInteger($id_zuletzt);
        $var = IPS_GetVariable($id_status);
        $akt = $var['VariableUpdated'];

        if ($status == false)     // Gerät wurde ausgeschaltet
        {
            $zeit = $akt - $letzte; // Einschaltdauer
            $verbrauch = $kw * $zeit + GetValueFloat($id_kwh);
            SetValueFloat($id_kwh, $verbrauch);
        } else {                    // Gerät wurde eingeschaltet
           SetValueInteger($id_zuletzt, $akt); // Zeitpunkt vom Einschalten 'sichern'
        }

Bitte die neue ID von der Variable ‚letzte Änderung‘ in der Zeile hier ersetzen:

$id_zuletzt = 29573

Und dann ‚darfst‘ du es auch gerne mal ausführen :slight_smile:
Jedoch wird er durch jedes manuelle ausführen zusätzlichen Verbrauch zählen, obwohl da keiner war.
Also lieber das Gerät mal ein & ausschalten.

Michael

Ah, verstehe. Es wird ja auch durch zweierlei Ereignisse aufgerufen: Durch eine Variablenänderung und zusätzlich minütlich.

Trotzdem funktioniert es nicht mehr.

Das minütliche solltest du lassen…
Dadurch wird jedesmal in ‚letzte Änderung‘ die aktuelle Zeit geschrieben.
Und wenn das Gerät dann auch noch aus ist. Wird die Zeit dazwischen jedesmal als ‚eingeschaltet‘ und somit als Verbrauch berechnet.
Ich ändere das oben mal ab… dann sollte das nicht mehr auftreten.
Michael

Das ist (glaube ich) eine Funktion des HM-Funkaktors (HM-LC-Sw4-DR). Jedenfalls habe ich im HomeMatic-System keine entsprechende Systemvariable mit Kanalzuordnung.

Oh, ich sehe gerade, das Script scheint zu funktionieren. Danke schön. :slight_smile:

Nein, dass kann keine Variable vom Aktor sein.
Zum einem solltest du die ja per Hand anlegen, zum anderen können Statusvariablen nicht beschrieben werden.
Michael

Hmm … sie ist im Baum im Gerät gelistet. Aber da habe ich sie wohl in IPS hinzugefügt. Ist schon etwas lange her. :wink:

Ich bekomme jetzt irgendwie komische Werte. Ich muss mir das nachher nach dem Essen mal genauer ansehen.

Komisch, jetzt sind plötzlich alle Werte seit September wieder da. :slight_smile:
IPS hat offensichtlich die ganze Zeit normal gearbeitet – nur der Graph war immer leer.

Na ja, danke vielmals. Irgendwann kommen auch ein paar richtige Zähler ins Stromnetz. Dann geht es alles besser, hoffe ich zumindest. :wink:

Gruß
Gerhard