Problem TMEX Crash gelöst

Hallo 1-wire Freunde!

Eine gute Nacht Geschichte, für alle die von CRC- Fehlern und 1-wire failed: 3 träumen.

Ich habe seit 2 Jahren das Problem, dass sich die TMEX Instanz zu nicht nachvollziehbaren Zeiten aufhängt. Angefangen hatte ich mit einem win xp Laptop und 20Stk. 1-wire Bauteilen an einem eservice Ethernet Koppler mit virtuellen com - Ethernet Port V. 1.6. Inzwischen habe ich fast 80 Bauteile dran.

Manchmal half ein TMEX Reset, aber meist nicht.
Im Falle eines TMEX Crash, schreibt IPS auch keine Variablen mehr, so dass man schwer nachvollziehen kann, was nun der Grund wäre.
Ich habe nun zählen lassen.

<?
	if (TMEX_RequestRead(39654 /*[Solaranlage\Dach\FeldA(Ostfeld)\Feldtemperatur A]*/))
	{
				setvalue(18705 /*[TMEX erfolgreich]*/,(getvalue(18705 /*[TMEX erfolgreich]*/)+1));
	}
	else
	{
		
		setvalue(14972 /*[TMEXfehler]*/,(getvalue(14972 /*[TMEXfehler]*/)+1));
      setvaluestring(54806 /*[Dashboard\Fehlermeldung]*/ ,
		"Sensorfehler"."
"."Feldtemperatur A"."
".date("d.m H:i:s")."
".$SensorID);
	}
?>

Manchmal crasht TMEX, wenn die Fehler hochzählen, manchmal aber auch einfach so.
Bei Neustart setze ich die Zähler auf Null.
Der „erfolgreich Zähler“ zählt manchmal bis 20.000, manchmal nur bis 500, einmal sogar bis 140.000. Völlig ohne Plan!

Geholfen hatte ich mir, indem ich über den LTP1 die Betriebsspannung des Kopplers incl. 1-wire Spannung ab und an geschalten habe.
Ab IPS Version 3 war LTP1 nicht mehr verfügbar. Inzwischen neuer Rechner, habe ich mir folgender Maßen geholfen:

if ((IPS_ApplyChanges(20988 /*[TMEX]*/ ))
&&(TMEX_RequestRead(20457 /*[Hutschienenverteilung\Grünes 8-fach Eingangsmodul]*/))
&&(getvalue(14972 /*[TMEXneustart\TMEXfehler]*/ )<300))
{
setvalue(16013 /*[Dashboard\Aktionsmeldung]*/ ,"TMEX ok!");

return;
}
else
{
      setvalue(16013 /*[Dashboard\Aktionsmeldung]*/ ,"Neustart!!!!");

IPS_Execute("C:\IP-Symcon\modules/IPSneu.bat","",false,false);
}

Die IPSneu.bat fährt den Rechner herunter. Die fehlende Spannung am Rechner schaltet mittels Relais alles aus und anschließend den Rechner wieder ein.
Der neue Rechner bringt IPS dann nach 40 Sekunden wieder zum laufen. Aber das nervt!!
Um einen Receiver mit Software zu laden habe ich Hyperterminal installiert. Danach startete der Rechner alle 10 Minuten neu. Die Windows log´s sagten „eventuell Probleme mit der Stromversorgung“.
Nach Recherche fand ich folgenden Haken:

Nach entfernen des Hakens kam ein blauer Bildschirm, der mir sagte das der virtuelle Eltima Adapter eine Zugriffsverletzung …bla bla bla… :confused:
Also neue Eltima Software gekauft. Blauer Bildschirm war wieder weg.
Das löste aber das Grundproblem nicht. Folgende Ursachen könnte es haben:

  • Hardware (passiv gekühlt, Lüfter half aber auch nicht)
  • Eservice Adapter (unwahrscheinlich)
  • Ethernetkabel nimmt Störungen auf
  • Router (neuer Router brachte zwar nichts, kommt trotzdem in Frage)
  • Eltima Software
  • Maxim Software
  • 1-wire Hardware (alles selbst zusammen gelötet, aber ein Austausch brachte auch nichts)
  • Masse Probleme (das Einschalten des Staubsaugers konnte es auslösen, aber auch nicht immer)
  • IPS (da hätte doch mal was im Forum gestanden)

Mein Kollege: „Dein Mist läuft doch Nie, Nie !!!“ :confused:

Wird fortgesetzt…

Fortsetzung:

Ich hatte neue 1-wire Hardware entwickelt und wollte diese nun nicht gerade am vorhandenen Bus testen. Also, einen zweiten 1-wire Adapter kaufen. Nur welchen, oder selber bauen? Nein, dem Zeug von eservice kann man vertrauen, die Leute haben Ahnung. Ich entschied mich für den Seriel zu 1-wire Adapter. So konnte man gleich 3 Fehlerquellen ausschließen. Die Eltima Software, das Ethernetkabel und den Router. Binnen 2 Tagen war das Ding da! Tolle Leistung, Andre !! :slight_smile: Eingebaut, und siehe das Ding lief gleich viel stabiler. Aber 3 Neustarts pro Tag gab es immer noch. Der Code

       TMEXA_SetOpen(20988 /*[TMEX]*/, false);
       // TMEX ausschalten
       IPS_ApplyChanges(20988 /*[TMEX]*/);
          IPS_Sleep(5000);
          TMEXA_SetOpen(20988 /*[TMEX]*/, True);
        // TMEX einschalten
        IPS_ApplyChanges(20988 /*[TMEX]*/);

funktionierte auch besser.

Nun hatte ich mir selbst einen Scriptfehler eingebaut. Eine ganz bestimmte Konstellation bewirkte, dass ein Programm ein zweites Erfolgloses aufrief, selbst neu startete wie auch immer. Warteschleife 250.000 !!
Anscheinend muss ich mich doch mal mit dem Semaphor Befehl beschäftigen. Begriffen hatte ich es vollständig nicht, außerdem war waren mir die 1000 Millisekunden zu wenig und ich hatte Semaphor in den Hintergrund geschoben.
Also im Forum lesen!
Dort hatte das Mitglied ??? (hier bitte den Namen eintragen, wenn bekannt) es so erklärt, dass selbst ich es verstanden habe. Das Mitglied ??? ist hiermit zu unserem nächsten Teichfest eingeladen!! :smiley:
Also: IPS_SemaphoreEnter(„12345“, 1000) ist so etwas wie das Besetztschild an einer Toilette. Der Nächste kommt erst rein, wenn der Erste fertig ist und das Schild umdreht: IPS_SemaphoreLeave(„12345“)
Leicht geändert: Bahnhofstoilette mit Schloss. Rot oder Grün.
Nun fand ich auch im Forum raus, dass die Wartezeit jetzt sogar bis 9000, also 9 Sekunden sein darf.
Ich habe nun alle Scripte mit

IPS_SemaphoreEnter("script ID", 1000)
{

// Scriptcode

IPS_SemaphoreLeave("script ID") ausgestattet. 
}
 

Auf einmal hörte auch ein unerklärliches Ruckeln eines Countdowns auf. Klasse! funktioniert! :slight_smile:

Irgendwie hatte ich schon immer das Gefühl, dass es zwischen Timer

Timer.jpg

und dem Befehl

TMEX_RequestRead(22671 /*[Solaranlage\Boden\Rücklauftemperatur heiß]*/ ));

zu einem Konflikt kommen kann, wenn sie zur gleichen Zeit ausgeführt werden. Es war aber nur ein Gefühl.

Nun wieder zur Bahnhofstoilette.
Einleuchtend ist doch folgendes:
Kommt ein Zug an, stürmen alle gleichzeitig auf die Toilette. Da ist es doch kein Wunder, wenn diese dann gleich verstopft ist. Also ein Schloss dran gebaut!
Ich habe also alle Timer durch

if (IPS_SemaphoreEnter("37887", 1000))
{
if (IPS_SemaphoreEnter("TMEX", 1000))
{
	if (TMEX_RequestRead(22671 /*[Solaranlage\Boden\Rücklauftemperatur heiß]*/ ))
	{
		setvalue(18705 /*[TMEXneustart\erfolgreich]*/,(getvalue(18705 /*[TMEXneustart\erfolgreich]*/)+1));
	}
	else
	{
		setvalue(14972 /*[TMEXneustart\TMEXfehler]*/,(getvalue(14972 /*[TMEXneustart\TMEXfehler]*/)+1));
	}
 IPS_SemaphoreLeave("TMEX");
}

IPS_SetScriptTimer(37887 /*[Solaranlage\Boden\Rücklauftemperatur heiß\Timer]*/ , 181);
IPS_SemaphoreLeave("37887");
}

ersetzt und auch in den 2 wichtigsten Scripten alle TMEX_RequestRead Befehle mit IPS_SemaphoreEnter(„TMEX“, 1000))
versehen.
Der Erfolg war verblüffend! Die Fehlerrate verringerte sich drastisch, es gab gerade mal ein TMEX Reset pro Tag!

Also, alle müssen sich nun an der Toilette anstellen. Leider hört der, der unmittelbar an der „TMEX“ Tür steht, das Plätschern. Deshalb wird nach 1000 Millisekunden seine Hose nass und ist nun nicht mehr zu gebrauchen. Der Leser kann sich vorstellen, dass dies nicht selten passiert. Geben wir Ihm doch 5 Sekunden Zeit, also IPS_SemaphoreEnter(„TMEX“, 5000). Damit hatte ich die nassen Hosen schon mal drastisch verringert. Noch eine zweite Toilette dazugestellt IPS_SemaphoreEnter(„TMEX0“, 5000) und eine für die ganz wichtigen Leute: IPS_SemaphoreEnter(„VIP“, 5000).
Seitdem läuft mein TMEX fast fehlerfrei! :smiley:
Ich suche jetzt noch nach Leuten, die zu lange auf der Toilette sitzen. Nun lässt sich auch herausfinden, welche 1-wire Hardware Fehler macht. Meinen DS2450 muss ich zum Beispiel immer anschreien, ehe der mal antwortet. Der „erfolgreich Zähler“ steht jetzt bei 400.000 der Fehlerzähler bei 54!

Vielleicht kann meine „Gute Nacht Geschichte“ jemanden helfen. Wenn es sich als Märchen entpuppt, bitte hier weiter schreiben!

Grüße aus dem Erzgebirge

Jens :loveips:

Guten Morgen,
ich habe auch diverse Probleme mit dem 1-wire USB Connector…

Eine frage zu deinem Script habe ich, wo setzte ich das denn ein? bzw durch was lasse ich es Aurufen? Timer einfach jede Minute? Kannst du mir mal auf den rechten Weg helfen? Weil ein nicht funktionierender 1-wire bus ziemliche ***eiße ist… grrr

Ah so langsam kommt die Erklärung auch bei mir an (;

Super Erklärung![emoji106]
Da ich seit kurzem auch immer wieder 1wire Probleme habe ( bei gerade mal 4x Sensoren)… In Zukunft möchte ich meine Fußbodenheizungsrohre + Vorlauf usw. Mitloggen (+ 20 Sensoren)…

Verstehe ich es richtig das du den IPS 1wire timer für die Sensoren deaktiviert hast und dafür alle Sensoren mit einem Skript und den Wartezeiten abfrägst?
Und für die einzelnen Sensoren Typen muss jeder für sich die passende Wartezeit ausprobieren…

Ich wollte das ganze gerade nachbilden:
Dazu habe ich bei einem „funktionierenden“ Sensor den automatisch IPS abruf der Werte deaktiviert.

Wenn ich lediglich:

TMEX_RequestRead(43332 /*[Haus\Temperaturen\Wohnzimmer]*/);

ausführe, passts…

Jetzt möchte ich die Abfrageinterverall in dem gewartet werden soll vergrößern:

IPS_SemaphoreEnter("28602", 1000)
TMEX_RequestRead(43332 /*[Haus\Temperaturen\Wohnzimmer]*/);
IPS_SemaphoreLeave("28602");

Was ist hier falsch?
Die auslösende ID „28602“ ist ein Ereignis-Timer.
Testweise habe ich auch schon die ID des Abfrageskriptes angegeben - OHNE ERFOLG.

Hier ein paar Screenshots.

Ne Menge falsch. :wink:
Erstmal fehlt hinter SemaphoreEnter das Semikolon.
Und der Befehl hat so gar nix mit einer ID (Timer oder sonst was) zu tun. Das ist nur ein String, welche den Abschnitt kennzeichnet (kann natürlich die ID eines Timers sein, welche dieses Script startet, kann aber auch ‚bittewarten5‘ sein.).
Wobei ich nicht verstehe das du mit 4 Sensoren so einen Stress hast, ich selbst habe auch nur 8 und die laufen mit den Instanz-Timern problemlos (und wenn mal ein Wert fehlt…egal).
Michael

Dem kann ich nur zustimmen.
Bei mir laufen ca. 80 Sensoren ohne wesentliche Probleme.
Probleme gab es nur durch unsaubere Installation oder
zu kurze Abfrage der Sensoren.
Und dann Abfrage der Sensoren zur gleichen Zeit und gleichem Abstand meist zu kurz!
Na ja und wenn dann mal ein Wert fehlt !!!

Und der Aufriss hier verunsichert nur User die sich mit dem Thema befassen.
Haste eigentlich schon mal mitbekommen die vielen User hier ohne größere Probleme
1-Wire einsetzen?

Man kann in anderen 1Wire Software-Lösungen die Abfragedauer die abgewartet wird - einstellen -.
Es macht also durchaus Sinn :slight_smile:

Ich hab mir das ganze mal in Ruhe angeschaut… Hab das komplett falsch verstanden…

Mit der „Wartezeit“ kann ich auf einmal meinen 1Wire Aussensensor wieder abfragen :smiley:

Hier das „einigermaßen“ richtige Skript:

Ich geb meinem 1Wire Aussensensor jetzt 3 Sekunden zum antworten. Siehe da - er lebt noch :wink:
Je nachdem was ausgeführt wird, lasse ich einen Zeitstempel setzen.
Erfolgreicher Abruf, oder fehlerhafter Abruf…

<?
if (IPS_SemaphoreEnter("TMEX0", 3000))
{
 TMEX_RequestRead(57661 /*[Haus\Temperaturen\Aussentemperatur]*/);
 SetValue(38187 /*[Haus\Temperaturen\Aussentemperatur\Erfolgreicher Abruf]*/,date("d.m.y H:i:s"));
 IPS_SemaphoreLeave("TMEX0");
}
else
{
//Abfrage hat nicht funktioniert, deshalb Rückmeldung
 SetValue(56205 /*[Haus\Temperaturen\Aussentemperatur\Fehlerhafter Abruf]*/,date("d.m.y H:i:s"));
 IPS_SemaphoreLeave("TMEX0");
}
?>

Man muss dazu sagen, das meine Konstellation nicht ganz standard ist.

1x Aussensensor ist in einem Windmesser aussen verbaut und per Netzwerkkabel aufgelegt. Kabellänge ca. 35 Meter.
mehrere Sensoren im Haus in RJ45 Steckern gecrimpt und per patchpanel auf einer rj45 verteilerdose zusammengeführt
1x eservice S0 zähler für meinen Windmesser (das Teil läuft zuverlässig!!)

Stromversorgung bisher mittels 1Wire DS9490R USB Busadapter

P.S.
Wesentlich einfacher wäre es natürlich wenn IPS für jedes 1Wire Device diese Standardfunktion im Konfigurator anbieten würde :wink:

RequestRead ist eigentlich nichts anderes was auch der InstanzTimer macht (außer Paresy hat da zwei mal eine gleiche Funktion im 1-Wire Modul, was ich nicht glaube).
Der Semaphore hat doch nix mit Zeit lassen zum Antworten zu tun. Sondern verhindert nur das der Bereich nicht gleichzeitig durch mehrere PHP-Processe dieses Scriptes betreten/ausgeführt werden kann. Die 3 Sekunden sind ein Timeout und gelten nur wenn schon ein Process in diesem Bereich ist, und der zweite warten soll.
Wenn der Sensor so lange zum Antworten braucht; stell den Timer größer ein.
Die Frage ist nur wie lange eine 1-Wire Instanz auf die Antwort warten, aber auch hier dürfte wohl kein Unterschied zwischen InstanzTimer und RequestRead sein.
Beim gleichzeitigen schalten von mehreren Ausgängen sieht das mit dem Semaphore wohl ganz anders aus und dürfte wirklich das ganze etwas entzerren und durchaus sinnvoll sein.
Michael

letztlich belege/blocke ich den 1Wire Kanal… und gebe meinem Sensor somit x ms Zeit für die Abfrage :smiley:

Was IPS jetzt macht… natürlich ist die Requestread Abfrage dieselbe - aber damit funktionierts!

Ich habe es jedenfalls selbst beim deaktiveren aller anderen 1wire Sensoren nicht geschafft, den „Problemsensor“ abzufragen… Jetzt mit dem Wartekanal funktionierts… und das Problem habe nicht nur ich :slight_smile:

So jetzt habe ich das auch Verstanden… Sorry hat einen Moment gedauert.

Ich habe gar noch nicht das Problem das ich Temperaturen auslesen will, bei mir sollen nur relaise geschaltet werden.

Jetzt ist es so das bisher (10 Tage ca.) keine 24 std. gab wo es keinen Fehler produziert hat.

IP-Symcon/1-Wire Adapter hat so sehr den PC blockiert das es immer auf einen Kalten Neustart hinausgelaufen ist. Weil weder der Dienst sich beendet noch der PC den normalen neustart durchführt…
Jemand eine Idee?
Habe es mal mit dem Skript tmex status und
und einem zum zurücksetzten vom temex ausprobiert aber da hängt sich ips auch total auf.

<?
/*      Das Script prüft,
             - ob die TMEX Instanz ok ist (wenn ok, dann Rückgabewert = 102
            - ob one-Wire Bus (ID kommt aus Auslesescript oben) ok ist
            - ob one-Wire BusMaster (ID kommt aus Auslesescript oben) ok ist
        Das Script resetet die TMEX Instanz im Fehlerfall (mit 5 sec.
        Das Script ändert die Webfront Variable für den Status im Fehlerfall/Gutfall
*/
        $ObjektID = 34312 /*[TMEX]*/ ;   // !!!!  ID des TMEX einfügen!!!!
        $busstat = 33532 /*[Original	mex	emx learn\Bus-Status]*/  ;                     // !!! ID des Bus Status
        $masterstat = 17448 /*[Original	mex	emx learn\DS2408 8-Channel Addressable Switch (900000001573E029)]*/ ;                // !!! ID des BusMaster Status
        $onewstat = 57702 /*[Original	mex\webfront]*/ ;                  //  !!! ID der Webfront Variable 1-Wire Status

     $inst = IPS_GetInstance($ObjektID);

    If ((getvalue($busstat) == false) or
    (getvalue($masterstat) == false)or
    ($inst['InstanceStatus'])!="102") {
       echo "TMEX reset!";

       // Statusvariable fürs Webfront auf false setzen. false = Fehler
       setvalueboolean($onewstat, false);
        set_time_limit(180); //Timeout für dieses Script auf 180s setzen
       TMEXA_SetOpen($ObjektID, false);
       // TMEX ausschalten
       IPS_ApplyChanges($ObjektID);
          IPS_Sleep(5000);
          TMEXA_SetOpen($ObjektID, True);
        // TMEX einschalten
        IPS_ApplyChanges($ObjektID);
    }
    If ((getvalue($busstat) == true) and (getvalue($masterstat) == true)) {
       setvalueboolean($onewstat, true);
       // Statusvariable fürs Webfront auf True setzen. True = kein Fehler
    }
?>

<?
$id = 34312 /*[TMEX]*/; //ID der TMEX I/O Instanz

//Ab hier nicht mehr verändern
$devs = @TMEXA_EnumerateDevices($id);

$vid = CreateVariableByName($IPS_SELF, "Bus-Status", 0);
$status = !($devs === false);
if(GetValue($vid) != $status) {
    SetValue($vid, $status);
}

if($devs === false)
    return;

$objs = IPS_GetChildrenIDs($IPS_SELF);
foreach($objs as $oid) {
    if(IPS_VariableExists($oid)) {
        $v = IPS_GetVariable($oid);
        if($v['VariableValue']['ValueType'] == 0) {
            if(IPS_GetName($oid) != "Bus-Status") {
               $found = false;
               foreach($devs as $key=>$value) {
                  if(!(strpos(IPS_GetName($oid), $value) === false)) {
                     $found = true;
                     unset($devs[$key]);
                     break;
                  }
               }
               if(GetValue($oid) != $found) {
                   SetValue($oid, $found);
               }
            }
        }
    }
}
foreach($devs as $dev) {
    if(substr($dev, 14, 2) == "81") {
       $name = "Interface";
    } else {
        $name = "Device";
    }
    $ids = IPS_GetInstanceListByModuleID("{9317CC5B-4E1D-4440-AF3A-5CC7FB42CCAA}");
    foreach($ids as $id) {
        if(TMEX_GetDevice($id) == $dev) {
            $name = IPS_GetName($id);
           break;
       }
    }
    $vid = CreateVariableByName($IPS_SELF, $name." (".$dev.")", 0);
    SetValue($vid, true);
}

function CreateVariableByName($id, $name, $type)
{
  global $IPS_SELF;
  $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");
  }
  return $vid;
}

if($IPS_SENDER == "Execute") {
    IPS_SetScriptTimer($IPS_SELF, 60);
}

?>

hat keiner eine idee für mich :frowning:
jeden tag bricht die Verbindung mindest einmal ab und damit muss ich natürlich auch die NDL über dem Aquarium „neustarten“ das mag die gar nicht :confused: