PI stürzt bei häufigen

Hallo,

es handelt sich um eine variation des Astro-/Dämmerungsskrpites aus dem Forum. Ich habe es hier reduziert wie folgt:

<?php
     // Geokoordinaten des Wohnortes
  $latitude = 49.78;    // Breitengrad
  $longitude = 7.65;    // Längengrad

  $scripts   = array();
  $scripts[] = array("id" => 18473, "offset" => 0, "type" => "sunrise", "name" => "Rollo 55 auf");
  $scripts[] = array("id" => 56713 , "offset" => 0, "type" => "sunset", "name" => "Rollo 55 zu");
  $scripts[] = array("id" => 18673 , "offset" => 2, "type" => "sunrise", "name" => "Rollo + Heizung auf");
  $scripts[] = array("id" => 38307 , "offset" => 2, "type" => "sunset", "name" => "Rollo + Heizung zu");
  $scripts[] = array("id" => 10660 , "offset" => 4, "type" => "sunrise", "name" => "Rollo + Heizung auf");
  $scripts[] = array("id" => 11045 , "offset" => 4, "type" => "sunset", "name" => "Rollo + Heizung zu");

  $timestamp = time();
  $sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90+50/60, date("O")/100);
  $sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90+50/60, date("O")/100);

  SetValueString(CreateVariableByName($_IPS['SELF'], "Sonnenaufgang", 3, "~String"), date("H:i:s", $sunrise));
  SetValueString(CreateVariableByName($_IPS['SELF'], "Sonnenuntergang", 3, "~String"), date("H:i:s", $sunset));

  foreach($scripts as $num => $script)
  {
    $ts = $script['offset']*60;
    switch ($script['type'])
    {
      case "sunrise": $ts += $sunrise; break;
      case "sunset": $ts += $sunset; break;
      default: die("Ungueltiger Wert: ".$script['type']);
    }

    if(IPS_ScriptExists($script['id']))
    {
      SetTimerByName($script['id'], $script['name'], $ts);
      IPS_Sleep(500);
    }
    else
    {
      die("Skript #".$script['id']." existiert nicht!
");
    }
  }

  function SetTimerByName($id, $name, $ts)
  {
    echo $id."  ".$name."  ".$ts.PHP_EOL;
	   // existiert der event schon?
    $eid = @IPS_GetEventIDByName($name, $id);
    if($eid === false)
    {
      $eid = IPS_CreateEvent(1);    // event neu anlegen
      IPS_SetParent($eid, $id);     // eltern: übergeordnete Instanz
      IPS_SetName($eid, $name);
		IPS_SetInfo($eid, "this timer was created by script #$IPS_SELF");
      IPS_SetEventScript($eid, $id);
      IPS_SetEventActive($eid, true);
    }
    IPS_SetEventCyclic($eid, 0, 0, 0, 0, 0, 0);
    $std = intval(date("G", $ts));
    $min = intval(date("i", $ts));
	 $sec = intval(date("s", $ts));
    IPS_SetEventCyclicTimeFrom($eid, $std, $min, $sec);
	 return $eid;
  }

  function CreateVariableByName($id, $name, $type, $profile = "")
  {
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "this variable was created by script #".($_IPS['SELF']));
      if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
  }
?>

Die (test-)Skripte, die jetzt abgearbeitet werden und geänderte Ereignisse erhalten sollen, sind alle leer. Nun gibt es auch keinen Absturz mehr. Die Skripte im Original enthalten Rollo-Befehle für LCN. Ich kann mir aber nicht vorstellen, dass dies der Grund für den Absturz sein sollte. Wenn ich nur 1 Rollo abarbeite (2 Skripte), klappt es. Bei mehr als 2 Skripten kommt der Absturz.
Ich hoffe, ich habe es verständlich erklärt.

Grüße, Gerhard

Hi Paresy,

ich habe, neben den Fehlern mit den „IPS_SetScriptTimer“, jetzt auch den Effekt, dass ich mich manchmal auf dem PI per Konsole nicht anmelden kann (Snapshot konnte nicht geladen werden oder so ähnlich). Logge ich per PUTTY ein und mache ein „sudo killall php“ funktioniert es dann MANCHMAL.

herbertf

Hi Paresy,

Verhalten (beides) ist auch in der C5FAA023 von gestern noch so …

herbertf

Hallo Paresy,

gibt es keine debug-Möglichkeiten, um festzustellen, an welcher Stelle oder nach der wievielten Anweisung ein Programm hängt oder abstürzt?
Ich hatte mir zwar jede Menge print-Anweisungen gesetzt (wie ich das von anderen Sprachen kenne), aber bei PHP ist wohl alles anders…

Grüße, Gerhard

Leider nein. Dieser Fehler ist leider etwas komplizierter. Und kann prinzipiell bei jedem Befehl an IPS passieren. Hast du ein bestimmtest Skript bei dem es wirklich schnell oder sogar immer passiert?

paresy

Hi Paresy,

ich bin mit drei meiner 5 PIs jetzt auf der C5FAA023 - und zumindest meine Heizungssteuerung läuft zwar durch - hat aber mehrere hängende PHP-Threads. Komischerweise muss ich ein „sudo killall php“ mehrfach (bis zu 10*) aufrufen bis es keinen php Thread mehr findet.

Die „Vor-Vor-Letzte-Version“ - war meines Erachtens hier stabiler.

Die Scripte in meiner Heizungtssteuerung sind eigentlich banal. Gern kann ich Dir auch die settings per Mail senden.

Herbertf

Hi Paresy,

der Fehler ist immer noch da, er wirkt sich auch nicht „NUR“ im Log aus, teilweise (warum auch immer nicht immer) bleiben alle Prozesse für wenige Sekunden „hängen“.
Richtig auffällig ist dies bei „Treppenlichtschalterfunktionen“ (mit wechselnden Zeiten).

Kannst Du Dir dies bitte ansehen?

herbertf

In dem Zusammenhang mit den Problemen des IPS_SetScriptTimer kann ich auch nachvollziehen, dass mindestens 1 PHP-Thread hängen bleibt - und die interne IPS-Zeit auf dem PI bei mir UM ÜBER 60 MINUTEN nachgeht. Die Debian-Zeit (in der Konsole „Date“) ist korrekt.

Es hilft nur ein Neustart des IPS-Dienstes.

Hallo paresy,
ich weiss nicht ob das ev. Logisch ist aber ich habe mit der Ubuntu Version dieselben Probleme mit dem „IPS_SetScriptTimer“. Mindestens ein hängender php Prozess, und die IPS-Zeit, die hinterher geht und meistens hilft auch nur ein Neustart des IPS-Dienstes.
rores

Vielleicht bringt ja folgendes noch etwas zur Lösung des Problems bei:

Ich wollte wegen der IPS_SetScriptTimer Problematik zurück auf Windows migrieren und habe die settings.json und die scripts von linux zurück nach dem Windows Server kopiert. Weiss nicht ob das so gemacht werden darf? Jedenfalls hatte ich danach ein ähnliches Problem wie auf dem Linux Server. Nach dem manuellen starten dieses Scriptes:


Ist mir aufgefallen, dass sich die Laufzeit im Sekundentakt aktualisierte und nach kurzer Zeit sah es im Logfile so aus:

Den gleichen Script unter Linux manuell ausgeführt ergiebt folgende Logeinträge:

Und folgende Ausgabe auf der Konsole:

Der hängende Prozess dazu: