Timerausfall - benötige Hilfe

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

BadenPower

Re: Timerausfall - benötige Hilfe

Beitrag von BadenPower » 02.12.2016, 17:29

TomT hat geschrieben:Wenn Badenpower nichts mehr hat zur Zeit, dann beende ich das testen auch erst einmal...
Eine Kleinigkeit habe ich noch auf die Schnelle fertiggestellt.

Diese Skript prüft, ob ein Timerausfall vorliegt und kann dieses protokollieren.
Im Skript kann man den Namen einer Systemvariable von Typ Zeichenkette angeben und diese auf "Protokollieren" stellen, damit man die Ausgabe im Systemprotokoll sehen kann.
Desweiteren kann man die Skriptvariable "lReactivate" auf true setzen, um einen Timer zu reaktivieren.

Das Skript packt man dann in ein Programm und läßt es durch einen Trigger starten.
Das kann entweder ein Zeitmodul :roll: sein, oder aber ein Sensor/Aktor bei dem man den Trigger dann auf "bei Aktuallisierung" stellt. Sollte das Programm noch häufiger gestartet werden, dann kann man ja auch mehrere Geräte welche zyklische Statusmeldungen versenden, in den Wenn-Abschnitt packen.

Code: Alles auswählen

!Zeitmodulkontrolle V1.0.2
!****************************************************
!www.homematic-forum.de (c) by BadenPower

boolean lReactivate = false;
string lTimerID = "";
string lSysVarProtocolIdent = "SYS-Protokoll";
string lSysVarDeadlockIdent = "SYS-Timerausfall";
string lSysVarDeadlockCountIdent = "SYS-Timerausfälle";
string lSysVarCounterIdent = "SYS-Timerneustarts";

!-------------Einstellungen Ende--------------

boolean lDeadlock = false;
integer lPeriodDiff = 0;
integer lPeriodDiffMin = 60;
integer lDeadlocks = 0;
string lEnum1 = "";
string lEnum2 = "";
string lProtocolText = "Timerausfall -";
string lSep = "\t";
time lZeroTime = @1970-01-01 01:00:00@;
object lProgram;
object lProtocol;
object lSysvarCounter;
object lSysvarDeadlock;
object lSysvarDeadlockCount;
object lSysVars = dom.GetObject(ID_SYSTEM_VARIABLES);
object lTimer;
object lTimers = dom.GetObject(ID_CALENDARDPS);

if(lSysVarProtocolIdent <> "")
{
  lProtocol = lSysVars.Get(lSysVarProtocolIdent);
}
if(lSysVarCounterIdent <> "")
{
  lSysvarCounter = lSysVars.Get(lSysVarCounterIdent);
}
if(lSysVarDeadlockIdent <> "")
{
  lSysvarDeadlock = lSysVars.Get(lSysVarDeadlockIdent);
}
if(lSysVarDeadlockCountIdent <> "")
{
  lSysvarDeadlockCount = lSysVars.Get(lSysVarDeadlockCountIdent);
}

if(lTimers)
{
  foreach(lEnum1,lTimers.EnumIDs())
  {
    lTimer = dom.GetObject(lEnum1);
    if(lTimer)
    {
      if(((lTimerID == "") || (lTimerID == (lTimer.ID()).ToString())) && (lTimer.TimerType() == ttPeriodic))
      {
        if(lTimer.DPUsageCount() > 0)
        {
          lProgram = dom.GetObject((lTimer.DPEnumUsagePrograms()).StrValueByIndex(lSep,0));
        }

        if(lProgram)
        {
          if(lProgram.Active())
          {
            lDeadlock = false;
            lPeriodDiff = lPeriodDiffMin + lTimer.Period();
            if(((lTimer.Timestamp() + lPeriodDiff) < lTimer.Next()) || (lTimer.Next() <= lZeroTime))
            {
              lDeadlock = true;
            }

            if(lDeadlock)
            {
              lDeadlocks = lDeadlocks + 1;
              if(lProtocol)
              {
                lProtocolText = "Timerausfall ";
                lProtocolText = lProtocolText # " Programm: " # lProgram.Name();
                lProtocolText = lProtocolText # " PrgID: " # (lProgram.ID()).ToString();
                lProtocolText = lProtocolText # " TimerID: " # (lTimer.ID()).ToString();
                lProtocolText = lProtocolText # " TS: " # (lTimer.Timestamp()).ToString();
                lProtocolText = lProtocolText # " N: " # (lTimer.Next()).ToString();
                lProtocolText = lProtocolText # " Ende"
                lProtocol.State(lProtocolText);
              }
              if(lReactivate)
              {
                lProgram.Active(false);
                lProgram.Active(true);
                if(lSysvarCounter)
                {
                  if(lSysvarCounter.Value() >= lSysvarCounter.ValueMax())
                  {
                    lSysvarCounter.State(lSysvarCounter.ValueMin() + 1);
                  }
                  else
                  {
                    lSysvarCounter.State(lSysvarCounter.Value() + 1);
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
if(lSysvarDeadlock)
{
  if(lSysvarDeadlockCount)
  {
    if((lSysvarDeadlock.Value() == false) && (lDeadlocks > 0))
    {
      if(lSysvarDeadlockCount.Value() >= lSysvarDeadlockCount.ValueMax())
      {
        lSysvarDeadlockCount.State(lSysvarDeadlockCount.ValueMin() + 1);
      }
      else
      {
        lSysvarDeadlockCount.State(lSysvarDeadlockCount.Value() + 1);
      }
    }  
  }
  if(lSysvarDeadlock.Value() <> (lDeadlocks > 0))
  {
    lSysvarDeadlock.State((lDeadlocks > 0));
  }
}
So, dann wünsch ich frohes Testen und Reaktivieren.
Sollte etwas nicht funktionieren, wie ich es eigentlich dachte, dann meldet Euch einfach.
.
Zuletzt geändert von BadenPower am 05.12.2016, 19:33, insgesamt 2-mal geändert.

BadenPower

Re: Timerausfall - benötige Hilfe

Beitrag von BadenPower » 02.12.2016, 22:36

Ich habe das obige Skript noch um zwei optionale Systemvariablen erweitert, damit man etwas besser erfassen kann, wenn ein Timer ausgefallen ist, oder neu gestartet wurde.

Code: Alles auswählen

string lSysVarDeadlockIdent = "SYS-Timerausfall";
string lSysVarCounterIdent = "SYS-Timerneustarts";
In meinem Beispiel ist die Systemvariable "SYS-Timerausfall" vom Typ Logik und zeigt an, ob gegenwärtig ein Timer ausgefallen ist/war.
Die "SYS-Timerneustarts" ist vom Typ Zahl und wird bei jedem neugestarteten Timer um 1 erhöht.

.

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 02.12.2016, 23:51

Hallo
eigentlich wollte ich hier mal Pause machen. Aber bitte mein erster Test. Zum Glück fällt der Timer ja immer schnell aus.
ccu_timer_protokoll1.jpg
ccu_timer_protokoll2.jpg
ccu_timer_protokoll3.jpg
Ich habe drei neue Variablen angelegt und ein neues Timerprogramm pr_timer_proto Intervall 1 Minute.

SYS-Timerausfall wird richtig angezeigt falsch wahr
SYS-Timerneustarts bleibt bei 0 und schon wieder hab ich ???

So aber jetzt wirklich Pause am SA und SO.

Gruß
Bulli

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 03.12.2016, 00:01

Achso fast vergesssen danke für die PrgID. Ich sollte wirklich mal die Programme genau anschauen und nicht nur blind benutzen. Dann hätte ich vielleicht doch nicht soviele Fragezeichen.

Bulli

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 03.12.2016, 03:42

UIUIUIUI atkuell ist meine TestCCU mal sowas von verwirrt. Da ich nicht schlafen konnte ist mir eingefallen das ich lReactivate ja noch auf true setzen wollte.
Um 2.XX geändert.
ccu_timer_protokoll4.jpg
Leider schlecht gescrollt ohne SYS-Timerneustarts
ccu_timer_protokoll5.jpg
ccu_timer_protokoll6.jpg
ccu_timer_protokoll7.jpg
Um 2.52 einen Ausfall > 1 Minute gesehen. Sollte ja jetzt nicht sein. Ok kein Problem WebUI Systemprotokoll rein schauen.
:evil: Und jetzt die Überraschung ich konnt nur bis 23.XX was sehen weiter konnt ich nicht runder scrollen.

Zum Glück war mit Expotieren das ganze Log noch vorhanden.
sysproto_exp.csv
(394.35 KiB) 38-mal heruntergeladen

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 03.12.2016, 07:27

Guten Morgen
Aktuell noch das Bild von heute Nacht. Systemprotokoll ist nicht richtig aufrufbar nur über export bekommt man es bis zur aktuellen Zeit.
Timer hat durch das 2 Programm die meiste Zeit gearbeitet bzw. läuft aktuell.
Hab jetzt mal das 2 Programm deaktiviert, mal schauen ob das Systemprotokoll wieder normal wird.
sysproto_exp2.csv
(358.97 KiB) 36-mal heruntergeladen

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 03.12.2016, 11:51

Das Systmprotokoll hat sicher immer noch nicht gefangen.
Hier mal ein Bild was ich meine. Die Abfrage ist vor kleiner 10 Minuten. Man beachte den große Rechten Balken und Uhrzeit im Bild.
systemproto_fehler.jpg

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von Bulli » 03.12.2016, 13:44

Update Systemprotokoll
Der Test CCU geht es wieder gut :-)
Ein paar mal den Timer neu gestartet, dadurch sind jetzt viele neue Einträge erzeugt worden. Die komischen Einträge sind jetzt wahrscheinlich alle drausen.
Das Systemprotokoll wird jetzt wieder bis zur aktuellen Zeit angezeigt.

BadenPower

Re: Timerausfall - benötige Hilfe

Beitrag von BadenPower » 03.12.2016, 20:43

Ich habe das Kontrollskript um eine weiter Variable erweitert und ein Anzeigefehler bei mehereren gleichzeitig ausgefallenen Timern beseitigt.

Code: Alles auswählen

string lSysVarDeadlockCountIdent = "SYS-Timerausfälle";
Zählt nun auch die Anzahl der Timerausfälle.

Benutzeravatar
TomT
Beiträge: 565
Registriert: 19.11.2014, 15:13
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 4 Mal
Danksagung erhalten: 4 Mal

Re: Timerausfall - benötige Hilfe

Beitrag von TomT » 05.12.2016, 10:20

Moin :D
So bin wieder dabei....
Leider zeigt er mir in der WebUI das Systemprotokoll nicht an, d.h. es gibt keine Liste ,der Bildschirm bleibt weiß.

Einträge sind per exportieren aber vorhanden
Habe jetzt mal die CCU neu gestartet.....

Grüße
Tom

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“