+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 15
  1. #1
    Registriert seit
    Sep 2008
    Ort
    Hamburg
    Beiträge
    1,069

    Lightbulb Endlosschleifen debuggen

    Ab und zu passiert es mir, dass ich versehentlich ereignisgesteuerte Skripte derart verknüpfe, dass es zu Endlosschleifen kommen kann. Besonders gern passiert das, wenn man Ereignisse "bei Variablenaktualisierung" definiert, weshalb das wohl auch nach Möglichkeit zu vermeiden ist, außer in begründeten Einzelfällen.

    Aber selbst wenn man darauf verzichtet, entstehen solche Endlosschleifen mitunter. Das tückische dabei ist, dass man häufig nicht Unbedingt von seinem "Glück" merkt, bis es irgendwann wahnsinnige Verzögerungen bei der Abarbeitung anderer Ereignisse gibt. Dann guckt man in die Thread-Ansicht, oder auch zu den Meldungen, und bemerkt dass sich irgendein Skript und irgendwelche Variablen ständig gegenseitig setzen, möglicherweise schon seit einer ganzen Weile. Leider kann es bei komplexeren Verknüpfungen dann sein, dass sich nicht eindeutig erkennen lässt, warum dies geschieht. Man kann dann versuchen, Ereignisse zu deaktivieren, Skriptbefehle auszukommentieren etc., aber häufig reagiert das System in diesem Stadium nur noch sporadisch und stark verzögert, so dass eine gezielte Fehlersuche durch Ausschluss kaum mehr möglich ist.

    Also beendet man irgendwann einfach den IPS-Dienst und startet ihn neu - und oft ist es dann so, dass das Problem nicht gleich wieder auftritt, sondern auch erst wieder "nach einer Weile". Es kann sich um Minuten handeln, oder auch um Tage, bis die entsprechenden Voraussetzungen wieder eintreten. Das macht es oft schwer, solche Fehler zu lokalisieren.

    Daher wollte ich mal fragen, ob ihr "Tips und Tricks" wisst, Erfahrungswerte habt, wie sich solche Probleme am besten bekämpfen lassen.
    LCN | HM | FS20, HMS und FHT | Arduino | ESP usw.
    "Der RGB-Streifen ist das Arschgeweih der Home Automation. "

  2. #2
    Registriert seit
    Feb 2007
    Ort
    Zwickau
    Beiträge
    5,483

    Grundsätzlich halte ich mich an folgende Regeln:

    vermeiden von:

    - vielen Skripte die ständig gestartet werden. (z.B. sekündlich...)
    - Instanzen die <10sek Takt etwas aktualisieren
    - Variablen die sehr oft aktualisiert werden

    Fehlersuche durch:

    - eigenes Loggingscript oder Fremdmodul wie Brownsons IPSLogger
    - geringe bzw. Standard max. execution time
    - Schalter für wichtige Scripte mittels derer ich diese für eine bestimmte Zeit an-/abschalten kann

    Auch die Listenansicht mit Sortierung nach Aktualisierung kann hier helfen Fehlerquellen zu finden.
    MfG Thomas

    Eaton Xcomfort|FS20|1-Wire|Axis WebCams|WMRS200 Wetterstation|Funksystem-868|Gas und Wasserzähler per S0 1-Wire|E-Zähler per OKK+seriell2LAN Adapter|Amazon Alexa|
    Visu auf: 10"Touchscr.|Apple iPod Touch|Apple iPhone|Apple iPad|IPS V5.x|Dashboard|WebFront|iFront


  3. #3
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,330

    Ich simuliere gerne. Jedes Script wird bevor es scharf geschaltet wird, getestet. Ist halt je nach Umfang ein bischen aufwändig, hat sich aber bewährt.

    Fehlerlogging ist aber auch aktiv. Egal was kommen sollte, ist der Übeltäter schnell verhaftet.
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  4. #4
    Registriert seit
    Oct 2008
    Beiträge
    1,033

    Kommt bei mir meist nur in der Testphase vor (knock on wood) - siehe RWN's post.

    Da bau ich - wenn ich verknüpfte Scripte habe, was man ja ein Stück weit im Voraus weiß - kleine "Sicherungszeilen" ein, wie z.B.:

    PHP-Code:
    if( file_exists__FILE__ ".STOP" ) || file_exists"D:/STOP.STOP" ) ) return; 
    oder

    PHP-Code:
    if( file_exists__FILE__ ".WAIT" ) ) IPS_SLEEP1000 ); 
    Letzteres reicht schon mal, um "aufgeschwungene" Sachen wieder zu beruhigen und erstes - besonders der zweite Teil - hilft, IPS einzubremsen, falls nix mehr hilft.

    Drauf gekommen bin ich damals, als ich ne Batch-Steuerung in IPS realisiert habe, bei der sich ein Script selbst aufruft und jeweils per Include einen Stapel abarbeitet.

    Für fertige Scripte habe ich bei vielen ohnehin eine Ein- und Ausschaltfunktion, das wird aber über ein Framework gehandelt, welches ich mir gebaut hab. Da kann ich ggf. auch per Socket einen Schuss setzen (Falls die Maschine gar nicht mehr reagiert oder ich gar nicht da bin).

    jwka

  5. #5
    Registriert seit
    Sep 2008
    Ort
    Hamburg
    Beiträge
    1,069

    Ok ich habe die "Übeltäter" jetzt möglicherweise gefunden. Es ist gar nicht so unknifflig. Also:

    -ich habe eine Variable namens Soll-Temperatur, Typ Float. Diese enthält (wer hätt's gedacht?) die Soll-Temeratur für eine Raumheizung.

    -eine weitere Variable namens "Heizungsmodus", welche ich zum komfortablen Setzen einer Temperatur übers Webfront benutze.

    wenn Heizungsmodus=1 gesetzt wird, wird die Solltemperatur auf 21°C gesetzt, bei 0 auf 17.5°C und bei 2 auf 23°C.

    Nun habe ich ein Skript, das auf beide Variablen reagiert und diese miteinander synchron hält. Heißt, wenn man Heizungsmodus setzt wird Soll-Temperatur entsprechend gesetzt, wenn man aber die Solltemperatur "händisch" einstellt (bspw über Fernbedienung oder Webfront) und dabei eine der Standardtemperaturen trifft (z.B. 21°) dann soll Heizungsmodus auf den entsprechenden Wert (hier 1) gesetzt werden. Ist die eingestellte Temperatur keine Standardtemperatur, so setze ich Heizungsmodus auf -1, so dass im Webfront keiner der im Profil eingetragenen Werte aufleuchtet.

    Nun kann es aber offenbar irgendwie vorkommen, dass sich zwei solcher Setz-Vorgänge derart ins Gehege kommen, dass sie sich immer wieder gegenseitig setzen. Endlos. Mir ist nicht klar wie das kommen kann, ich nehme an, es liegt irgendwie am Multithreading.

    Ich könnte nun einfach eine Semaphore setzen, die ein Wiederaufrufen des Skripts verhindert, aber das würde zu Problemen führen bspw bei Abwesenheit: Dann werden nämlich mehrere Instanzen des Skripts hintereinander aufgerufen, für alle Räume (immer mit Heizungsmodus=0 für den jeweiligen Raum).

    Mir wäre ja wesentlich wohler wenn ich zunächst einmal wirklich verstehen würde, warum es bei dieser Konstellation zu Endlosschleifen kommt? Die Trigger sind ja nun immer "bei Änderung".
    LCN | HM | FS20, HMS und FHT | Arduino | ESP usw.
    "Der RGB-Streifen ist das Arschgeweih der Home Automation. "

  6. #6
    Registriert seit
    Oct 2008
    Beiträge
    1,033

    Hast Dir doch die Antwortselbst gegeben:
    "Die Trigger sind ja nun immer "bei Änderung"
    Dein Script (oder auch zwei) ändern "über kreuz". Und rufen damit immer wieder sich selbst oder das jeweils andere auf. Da es dann wieder ne Aktualisierung gibt, geht's grad von Vorne los.

    Eine Möglichkeit wäre, dass Du die "LastExecute" Zeit auswertets und sagst, dass da mindestens zwei Sekunden zwischen sein müssen, sonst ende (nicht die Variable setzen).

    Im Normalbetrieb wird sowas immer ausreuchen, weil kein User binnen zwei Sekunden mehrfach ne Temperatur umsetzt. Und wenn doch mal: Dann muss er eben nochmals hinlangen.

    jwka

  7. #7
    Registriert seit
    Sep 2008
    Ort
    Hamburg
    Beiträge
    1,069

    Zitat Zitat von jwka Beitrag anzeigen
    Dein Script (oder auch zwei) ändern "über kreuz".
    Ja, das wird es wohl sein. Mich wunder nurt, dass dieser Zustand für so lange Zeit anhält. Müsste das nicht eigentlich "instabil" sein und sobald mal eine Skript-Instanz eine Sekunde hängt hört das Spiel von selbst auf?

    Nicht dass die Sache damit gelöst wäre, nur als Verständnisfrage.

    Zitat Zitat von jwka Beitrag anzeigen
    Eine Möglichkeit wäre, dass Du die "LastExecute" Zeit auswertets und sagst, dass da mindestens zwei Sekunden zwischen sein müssen, sonst ende (nicht die Variable setzen).

    Im Normalbetrieb wird sowas immer ausreuchen, weil kein User binnen zwei Sekunden mehrfach ne Temperatur umsetzt.
    Ein User nicht, aber das Goodbye-Skript schon (es ist für alle Räume das selbe Skript). Aber das mit dem Timestamp ist eine interessante Idee, man könnte ja stattdessen die Timestamps der Variablen untersuchen.

    "Wenn du Variable schon innerhalb der letzten 2 Sekunden geändert wurdest, ändere ich dich nicht nochmal."
    LCN | HM | FS20, HMS und FHT | Arduino | ESP usw.
    "Der RGB-Streifen ist das Arschgeweih der Home Automation. "

  8. #8
    Registriert seit
    Apr 2010
    Ort
    Oberbayern
    Beiträge
    4,866

    Ja, das wird es wohl sein. Mich wunder nurt, dass dieser Zustand für so lange Zeit anhält. Müsste das nicht eigentlich "instabil" sein und sobald mal eine Skript-Instanz eine Sekunde hängt hört das Spiel von selbst auf?
    Das wäre eine ziemliches Armutszeugnis wenn IPS mal eben die Ausführung eines Events überspringen würde nur weil gerade "viel los ist".
    Grüsse, Kronos.
    Wenn am Anfang alles schief geht, nenne es Version 1.0
    IPS 5.3 auf Server 2016 / HM mit CCU2 (RaspberryMatic) + LAN-Adapter + LAN- & Wired Gateway, 241 Geräte / XBee Pro (Roomba) / RoboRock S50 / RGB-W 868 / MiLight / EKM 868 / AKM / ein Rudel Squeezeboxen+Pi / EM24DIN+VS102 / AM 220 AC / PlugWise / VU+ / ALL4x00 / LevelJet / IRTRans / Echos diverse / viel zu wenig Zeit


    Einfach mal rein schauen: IPS-Chat

  9. #9
    Registriert seit
    Sep 2008
    Ort
    Hamburg
    Beiträge
    1,069

    Ich denke ja nicht an überspringen, mehr an "aus dem Takt geraten." Die beiden Skriptaufrufe bilden ja eine Art virtuellen "Schwingkreis" wenn man so will. Der dürfte doch nur so lange bestehen bleiben, wie die beiden Aufrufe exakt gegenläufiges Timing haben oder?

    Möglicherweise ist das auch Quark und ich bemerke es nicht weil ich zu viel Eventlog geguckt habe...
    LCN | HM | FS20, HMS und FHT | Arduino | ESP usw.
    "Der RGB-Streifen ist das Arschgeweih der Home Automation. "

  10. #10
    Registriert seit
    Apr 2010
    Ort
    Oberbayern
    Beiträge
    4,866

    Ich meine hier mal gelesen zu haben das IPS da stur eine Warteschlange abarbeitet.
    Grüsse, Kronos.
    Wenn am Anfang alles schief geht, nenne es Version 1.0
    IPS 5.3 auf Server 2016 / HM mit CCU2 (RaspberryMatic) + LAN-Adapter + LAN- & Wired Gateway, 241 Geräte / XBee Pro (Roomba) / RoboRock S50 / RGB-W 868 / MiLight / EKM 868 / AKM / ein Rudel Squeezeboxen+Pi / EM24DIN+VS102 / AM 220 AC / PlugWise / VU+ / ALL4x00 / LevelJet / IRTRans / Echos diverse / viel zu wenig Zeit


    Einfach mal rein schauen: IPS-Chat

Ähnliche Themen

  1. Debuggen - Wie ?
    Von khc im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 3
    Letzter Beitrag: 19.09.10, 16:13