Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Edomi-Logikengine stellt die Arbeit ohne einen Mucks ein
Ja, sieht gut aus. Am besten vorher die Original Datei sichern.
Wenns korrekt ist, dann wird die entsprechende Log Datei generiert, die dann die IDs der LBSen enthält in der Reihenfolge wie sie ausgeführt werden.
Ich hatte jetzt gerade ein ähnliches Problem, d.h. die EDOMI Logik Engine stellte jegliche Arbeit ein und es passierte einfach nichts mehr, obwohl alle Prozesse liefen. Es waren auch keine Fehler im Log zu finden. Dies kann eigentlich nur passieren, wenn ein Statement im LBS Bereich eines Logikbausteins einen potentiell blockierenden Befehl ausführt. Um diesen Zustand zu debuggen, habe ich den folgenden Befehl als erste Zeile zur Funktion callLogicFunction() in der Datei /usr/local/edomi/main/include/php/incl_logic.php hinzugefügt:
?><? require(MAIN_PATH."/main/include/php/incl_logicmonitor.php"); function callLogicFunction (file_put_contents('/usr/local/edomi/www/data/log/CUSTOMLOG_LOGIC_DEBUG.log',date("Y-m-d H:i:s")." - LBS: "
.$functionid." | ID: ".$elementid.PHP_EOL,FILE_APPEND);) ($functionid,$elementid,$init,$trigger) { $callFunction='LB_'.$functionid; if ($functionid>0 && function_exists($callFunction)) { logicMonitor_callLogicFunction($elementid,$functionid,$init,$trigger); $callFunction($elementid); logicMonitor_callLogicFunctionReturn($elementid); } } function mainLogicRunElements() { $c=0; do { $run=false; $ss1=sql_call("SELECT elementid,functionid FROM edomiLive.RAMlogicLink WHERE (refresh=1) GROUP BY elementid"); while ($n=sql_result($ss1)) { callLogicFunction($n['functionid'],$n['elementid'],false,0); resetLogicLinkRefresh($n['elementid']); $c++; if (global_logicLoopMax==0 || $c<global_logicLoopMax) { $run=true; } } sql_close($ss1); } while ($run); return $c; } function mainLogicRefreshElements() { $c=0; $ss1=sql_call("SELECT * FROM edomiLive.RAMlogicElement WHERE status>=1"); while ($n=sql_result($ss1)) { if ($n['status']==1) { callLogicFunction($n['functionid'],$n['id'],false,$n['status']); mainLogicRunElements(); } else { $ts=intVal(getMicrotime()*1000); if (intVal($n['status']+$n['statusref'])<=$ts) { if ($n['statusint']==1) { sql_call("UPDATE edomiLive.RAMlogicElement SET statusref='".$ts."' WHERE id=".$n['id']); callLogicFunction($n['functionid'],$n['id'],false,$n['status']); mainLogicRunElements(); } else { sql_call("UPDATE edomiLive.RAMlogicElement SET status=1,statusref=0 WHERE id=".$n['id']); callLogicFunction($n['functionid'],$n['id'],false,$n['status']); mainLogicRunElements(); } } } $c++; } sql_close($ss1); return $c; } function resetLogicLinkRefresh($elementid) { sql_call("UPDATE edomiLive.RAMlogicLink SET refresh=0 WHERE (elementid=".$elementid.")"); } function mainLogicExec_onStart($elementid) { sql_connect(); logicMonitor_execEvent($elementid,true); sql_call("UPDATE edomiLive.RAMlogicElement SET statusexec=2 WHERE id=".$elementid); sql_disconnect(); } function mainLogicExec_onExit($elementid) { sql_connect(); logicMonitor_execEvent($elementid,false); sql_call("UPDATE edomiLive.RAMlogicElement SET statusexec=0 WHERE id=".$elementid); logic_deleteInputsQueued($elementid,true); sql_disconnect(); } function mainLogicExecuteCmdList($elementid,$e1) { logicMonitor_lbsCall_executeCmdList($elementid,$e1); executeLogicCmdList($elementid,$e1); } function logic_debugVar($elementid,$varName,$value) { logicMonitor_debugVar($elementid,$varName,$value); } function logic_callExec($functionid,$elementid,$multiTask=false,$initStart=false) { global $logic_globalStartExec,$logic_globalStartExecQueue; if ($multiTask || logic_getStateExec($elementid,false)==0) { $fnExe=MAIN_PATH.'/www/data/liveproject/lbs/EXE'.$functionid.'.php'; if (file_exists($fnExe)) { sql_call("UPDATE edomiLive.RAMlogicElement SET statusexec=1 WHERE id=".$elementid); if ($logic_globalStartExec || $initStart) { logicMonitor_lbsCall_callExec($elementid,$functionid,$multiTask,1); exec('php '.$fnExe.' '.$elementid.' > /dev/null 2>&1 &'); } else { logicMonitor_lbsCall_callExec($elementid,$functionid,$multiTask,2); $logic_globalStartExecQueue[]=array($elementid,$functionid); } } else { logicMonitor_lbsCall_callExec($elementid,$functionid,$multiTask,-1); } } else { logicMonitor_lbsCall_callExec($elementid,$functionid,$multiTask,0); } } function logic_getStateExec($elementid,$logicMonitor=true) { $tmp=sql_getValue('edomiLive.RAMlogicElement','statusexec','id='.$elementid); if (!isEmpty($tmp)) { if ($logicMonitor) {logicMonitor_lbsCall_getStateExec($elementid,intVal($tmp));} return intVal($tmp); } if ($logicMonitor) {logicMonitor_lbsCall_getStateExec($elementid,'');} return null; } function logic_setInputsQueued($elementid,$E,$refreshed=false,$list=false) { $n=""; $ts=getTimestampId(); if ($list===false) { foreach ($E as $id=>$input) { if ($refreshed===false || ($refreshed===true && $input['refresh']==1)) { $n.="('".$ts."','".$elementid."','".$id."','".sql_encodeValue($input['refresh'])."','".sql_encodeValue($input['value'])."'),"; } } } else if (is_array($list)) { foreach ($list as $void=>$listInput) { if (array_key_exists($listInput,$E) && ($refreshed===false || ($refreshed===true && $E[$listInput]['refresh']==1))) { $n.="('".$ts."','".$elementid."','".$listInput."','".sql_encodeValue($E[$listInput]['refresh'])."','".sql_encodeValue($E[$listInput]['value'])."'),"; } } } if (!isEmpty($n)) { sql_call("INSERT INTO edomiLive.logicExecQueue (ts,elementid,inputid,refresh,value) VALUES ".rtrim($n,',')); logicMonitor_lbsCall_setInputsQueued($elementid,$ts); } else { logicMonitor_lbsCall_setInputsQueued($elementid,false); } } function logic_getInputsQueued($elementid,$fallback=false,$sync=false) { $r=false; $ts=sql_getValue('edomiLive.logicExecQueue','ts','elementid='.$elementid.' ORDER BY ts ASC LIMIT 0,1'); if (!isEmpty($ts)) { if ($sync) { $r=logic_getInputs($elementid); foreach ($r as $k=>$v) {$r[$k]['queue']=0;} } $ss1=sql_call("SELECT inputid,refresh,value,inputid>0 AS queue FROM edomiLive.logicExecQueue WHERE elementid=".$elementid." AND ts='".$ts."'"); while ($n=sql_result($ss1)) { $r[$n['inputid']]=$n; } sql_close($ss1); sql_call("DELETE FROM edomiLive.logicExecQueue WHERE elementid=".$elementid." AND ts='".$ts."'"); } else if ($fallback || $sync) { $r=logic_getInputs($elementid); foreach ($r as $k=>$v) {$r[$k]['queue']=0;} } logicMonitor_lbsCall_getInputsQueued($elementid,$r); return $r; } function logic_deleteInputsQueued($elementid,$intern=false) { logicMonitor_lbsCall_deleteInputsQueued($elementid,$intern); sql_call("DELETE FROM edomiLive.logicExecQueue WHERE elementid=".$elementid); } function logic_setOutputQueued($elementid,$ausgang,$value) { logicMonitor_lbsCall_setOutputQueued($elementid,$ausgang,$value); sql_call("INSERT INTO edomiLive.RAMknxRead (mode,gaid,gatyp,value) VALUES (6,".$elementid.",'".sql_encodeValue($ausgang)."','".sql_encodeValue($value)."')"); } function logic_getEdomiState() { return ((getSysInfo(1)>=1)?1:0); } function logic_dbKeepalive() { $ss1=sql_call("SELECT COUNT(*) FROM edomiLive.RAMsysInfo"); sql_close($ss1); } function logic_setOutput($elementid,$ausgang,$value) { logicMonitor_lbsCall_setOutput($elementid,$ausgang,$value); sql_call("UPDATE edomiLive.RAMlogicLink SET refresh=1,value='".sql_encodeValue($value)."' WHERE (linktyp=1 AND linkid=".$elementid." AND ausgang='".sql_encodeValue($ausgang)."')"); } function logic_setState($elementid,$status,$delay=0,$interval=false) { if (intVal($status)>0 && intVal($delay)>1) { logicMonitor_lbsCall_setState($elementid,$delay); $ts=intVal(getMicrotime()*1000); if ($interval) { sql_call("UPDATE edomiLive.RAMlogicElement SET status='".intVal($delay)."',statusref='".$ts."',statusint=1 WHERE (id=".$elementid.")"); } else { sql_call("UPDATE edomiLive.RAMlogicElement SET status='".intVal($delay)."',statusref='".$ts."',statusint=0 WHERE (id=".$elementid.")"); } } else { if (intVal($status)>0) { logicMonitor_lbsCall_setState($elementid,1); sql_call("UPDATE edomiLive.RAMlogicElement SET status=1 WHERE (id=".$elementid.")"); } else { logicMonitor_lbsCall_setState($elementid,0); sql_call("UPDATE edomiLive.RAMlogicElement SET status=0 WHERE (id=".$elementid.")"); } } } function logic_getState($elementid) { $tmp=sql_getValue('edomiLive.RAMlogicElement','status','id='.$elementid); if (!isEmpty($tmp)) { if (intVal($tmp)>=1) { logicMonitor_lbsCall_getState($elementid,1); return 1; } else { logicMonitor_lbsCall_getState($elementid,0); return 0; } } logicMonitor_lbsCall_getState($elementid,false); return null; } function logic_getInputs($elementid) { logicMonitor_lbsCall_getInputs($elementid); $r=false; $ss1=sql_call("SELECT value,refresh,eingang FROM edomiLive.RAMlogicLink WHERE (elementid=".$elementid.")"); while ($n=sql_result($ss1)) { $r[$n['eingang']]=$n; } sql_close($ss1); return $r; } function logic_setInputKoValue($elementid,$eingang,$value) { $linkId=sql_getValue('edomiLive.RAMlogicLink','linkid','elementid='.$elementid.' AND eingang='.$eingang.' AND linktyp=0 AND linkid>0'); if (!isEmpty($linkId)) { logicMonitor_lbsCall_setInputKoValue($elementid,$linkId,$eingang,$value); writeGA($linkId,$value); return true; } logicMonitor_lbsCall_setInputKoValue($elementid,false,$eingang,$value); return false; } function logic_setVar($elementid,$varid,$value) { logicMonitor_lbsCall_setVar($elementid,$varid,$value); sql_call("UPDATE edomiLive.RAMlogicElementVar SET value=".sql_encodeValue($value,true)." WHERE (elementid=".$elementid." AND varid='".sql_encodeValue($varid)."')"); sql_call("UPDATE edomiLive.logicElementVar SET value=".sql_encodeValue($value,true)." WHERE (elementid=".$elementid." AND varid='".sql_encodeValue($varid)."' AND remanent=1)"); } function logic_getVar($elementid,$varid) { logicMonitor_lbsCall_getVar($elementid,$varid); $ss1=sql_call("SELECT value FROM edomiLive.RAMlogicElementVar WHERE (elementid=".$elementid." AND varid='".sql_encodeValue($varid)."')"); if ($n=sql_result($ss1)) { sql_close($ss1); return $n['value']; } else { sql_close($ss1); return NULL; } } function logic_getVars($elementid) { logicMonitor_lbsCall_getVars($elementid); $r=false; $ss1=sql_call("SELECT value,varid FROM edomiLive.RAMlogicElementVar WHERE (elementid=".$elementid.")"); while ($n=sql_result($ss1)) { $r[$n['varid']]=$n['value']; } sql_close($ss1); return $r; } function callLogicFunctionExec($functionid,$elementid,$multiTask=false,$initStart=true) {logic_callExec($functionid,$elementid,$multiTask,$initStart);} function setLogicLinkAusgang($elementid,$ausgang,$value) {logic_setOutput($elementid,$ausgang,$value);} function setLogicElementStatus($elementid,$status,$delay=0,$interval=false) {logic_setState($elementid,$status,$delay,$interval);} function getLogicElementStatus($elementid) {return logic_getState($elementid);} function getLogicEingangDataAll($elementid) {return logic_getInputs($elementid);} function setLogicElementVar($elementid,$varid,$value) {logic_setVar($elementid,$varid,$value);} function getLogicElementVar($elementid,$varid) {return logic_getVar($elementid,$varid);} function getLogicElementVarAll($elementid) {return logic_getVars($elementid);} function playSequences() { $ok=false; $ss1=sql_call("SELECT * FROM edomiLive.sequence WHERE (playpointer>0)"); while ($n=sql_result($ss1)) { $ok=true; $ts=getTimestamp(); $d1=strval(substr($ts[0],0,4).substr($ts[0],5,2).substr($ts[0],8,2).substr($ts[0],11,2).substr($ts[0],14,2).substr($ts[0],17,2).$ts[1]); $d2=strval(substr($n['datetime'],0,4).substr($n['datetime'],5,2).substr($n['datetime'],8,2).substr($n['datetime'],11,2).substr($n['datetime'],14,2).substr($n['datetime'],17,2).sprintf("%06d",$n['ms'])); if (strcmp($d1,$d2)>0) { $ss2=sql_call("SELECT * FROM edomiLive.sequenceCmdList WHERE (id=".$n['playpointer'].")"); if ($nn=sql_result($ss2)) { executeCmd($nn,null); $ss3=sql_call("SELECT id FROM edomiLive.sequenceCmdList WHERE (targetid=".$nn['targetid']." AND sort>".$nn['sort'].") ORDER BY sort ASC LIMIT 0,1"); if ($nnn=sql_result($ss3)) { $ts=getTimestamp(); sql_call("UPDATE edomiLive.sequence SET datetime=DATE_ADD('".$ts[0]."', INTERVAL ".$nn['delay']." SECOND),ms='".$ts[1]."',playpointer=".$nnn['id']." WHERE (id=".$n['id'].")"); } else { sql_call("UPDATE edomiLive.sequence SET datetime=NULL,ms=NULL,playpointer=0 WHERE (id=".$n['id'].")"); } sql_close($ss3); } sql_close($ss2); } } sql_close($ss1); return $ok; } function checkZSU() { $now=date('d.m.Y H:i:s'); $date0=date('d.m.Y',strtotime($now)); $hour0=intval(date('H',strtotime($now))); $minute0=intval(date('i',strtotime($now))); $weekday0=intval(date('N',strtotime($now))); $ss1=sql_call("SELECT * FROM edomiLive.timer WHERE (gaid>0)"); while ($n=sql_result($ss1)) { $status=getGADataFromID($n['gaid'],0,'value'); if ($status['value']==1) { $aux=getGADataFromID($n['gaid2'],0,'value'); if ($aux!==false) {$tmp=$aux['value'];} else {$tmp=false;} $ss2=sql_call("SELECT * FROM edomiLive.timerData WHERE (targetid=".$n['id']." AND hour=".$hour0." AND minute=".$minute0." AND d".($weekday0-1)."=1)"); while ($nn=sql_result($ss2)) { if ($nn['cmdid']>0 && checkZSU_date($date0,array($nn['mode'],$nn['d0'],$nn['d1'],$nn['d2'],$nn['d3'],$nn['d4'],$nn['d5'],$nn['d6'],$nn['day1'],$nn['month1'],$nn['year1'],$nn['day2'],$nn['month2'],$nn['year2'],$nn['cmdid'],$nn['d7']),$tmp)) { executeMacroCmdList($nn['cmdid']); } } sql_close($ss2); } } sql_close($ss1); } function checkTSU() { $tmp=date('YmdHi'); $date0=substr($tmp,0,4).'-'.substr($tmp,4,2).'-'.substr($tmp,6,2); $hour0=intval(substr($tmp,8,2)); $minute0=intval(substr($tmp,10,2)); $ss1=sql_call("SELECT * FROM edomiLive.agenda WHERE (gaid>0)"); while ($n=sql_result($ss1)) { $status=getGADataFromID($n['gaid'],0); if ($status['value']==1) { $aux=''; $tmp=getGADataFromID($n['gaid2'],0,'value'); if ($tmp!==false) { if ($tmp['value']!=1) {$aux='AND (d7=0 OR d7=2)';} if ($tmp['value']==1) {$aux='AND (d7=0 OR d7=1)';} } $ss2=sql_call("SELECT cmdid FROM edomiLive.agendaData WHERE (targetid=".$n['id']." AND hour=".$hour0." AND minute=".$minute0.") AND (step=0 OR date2='' OR date2 IS NULL OR date2>='".$date0."') ".$aux." AND
(
(step=0 AND date1='".$date0."')
OR
(step>0 AND unit=0 AND date1<='".$date0."' AND (DATEDIFF('".$date0."',date1) MOD step)=0)
OR
(step>0 AND unit=1 AND date1<='".$date0."' AND (DATEDIFF('".$date0."',date1) MOD (step*7))=0)
OR
(step>0 AND unit=2 AND date1<='".$date0."' AND ((TIMESTAMPDIFF(MONTH,date1,'".$date0."') MOD step=0) AND (DATE_ADD(date1,INTERVAL TIMESTAMPDIFF(MONTH,date1,'".$date0."') MONTH)='".$date0."')))
OR
(step>0 AND unit=3 AND date1<='".$date0."' AND ((TIMESTAMPDIFF(YEAR,date1,'".$date0."') MOD step=0) AND (DATE_ADD(date1,INTERVAL TIMESTAMPDIFF(YEAR,date1,'".$date0."') YEAR)='".$date0."')))
)
ORDER BY id ASC
"); while ($nn=sql_result($ss2)) { if ($nn['cmdid']>0) { executeMacroCmdList($nn['cmdid']); } } sql_close($ss2); } } sql_close($ss1); } function checkAWS($gaid=0,$value=null) { $ts=getTimestampIdWdayTime(); $ss1=sql_call("SELECT a.id,a.playpointer,a.recordpointer,b.id AS ko_id,b.value AS ko_value FROM edomiLive.aws AS a,edomiLive.RAMko AS b WHERE a.gaid>0 AND a.gaid=b.id"); while ($aws=sql_result($ss1)) { if ($aws['ko_value']==1) { if (isEmpty($aws['playpointer'])) { $aws['playpointer']=$ts; $ss2=sql_call("SELECT gaid,gavalue1 FROM edomiLive.awsList WHERE targetid=".$aws['id']." AND gavalue1 IS NOT NULL"); while ($event=sql_result($ss2)) { writeGA($event['gaid'],$event['gavalue1']); } sql_close ($ss2); } if (intval($aws['playpointer'])>intval($ts)) { $ss2=sql_call("SELECT gaid,gavalue FROM edomiLive.awsData WHERE targetid=".$aws['id']." AND (timestamp>=".$aws['playpointer']." OR timestamp<".$ts.") ORDER BY timestamp ASC"); } else { $ss2=sql_call("SELECT gaid,gavalue FROM edomiLive.awsData WHERE targetid=".$aws['id']." AND (timestamp>=".$aws['playpointer']." AND timestamp<".$ts.") ORDER BY timestamp ASC"); } while ($event=sql_result($ss2)) { writeGA($event['gaid'],$event['gavalue']); } sql_close ($ss2); sql_call("UPDATE edomiLive.aws SET playpointer=".$ts." WHERE (id=".$aws['id'].")"); } else if ($aws['ko_value']==2) { if (isEmpty($aws['recordpointer'])) { $aws['recordpointer']=$ts; } if (intval($aws['recordpointer'])>intval($ts)) { sql_call("DELETE FROM edomiLive.awsData WHERE targetid=".$aws['id']." AND (timestamp>".$aws['recordpointer']." OR timestamp<=".$ts.")"); } else { sql_call("DELETE FROM edomiLive.awsData WHERE targetid=".$aws['id']." AND (timestamp>".$aws['recordpointer']." AND timestamp<=".$ts.")"); } if ($gaid>0) { $tmp=sql_getValues('edomiLive.awsList','id,gaid','targetid='.$aws['id'].' AND gaid>0 AND (((gaid2=0 OR gaid2 IS NULL) AND gaid='.$gaid.') OR (gaid2='.$gaid.'))'); if ($tmp!==false) { sql_call("INSERT INTO edomiLive.awsData (timestamp,targetid,gaid,gavalue) VALUES (".$ts.",".$aws['id'].",".$tmp['gaid'].",'".sql_encodeValue($value)."')"); } } sql_call("UPDATE edomiLive.aws SET recordpointer=".$ts." WHERE (id=".$aws['id'].")"); } if ($aws['ko_value']!=1 && !isEmpty($aws['playpointer'])) { sql_call("UPDATE edomiLive.aws SET playpointer=NULL WHERE (id=".$aws['id'].")"); $ss2=sql_call("SELECT gaid,gavalue2 FROM edomiLive.awsList WHERE targetid=".$aws['id']." AND gavalue2 IS NOT NULL"); while ($event=sql_result($ss2)) { writeGA($event['gaid'],$event['gavalue2']); } sql_close ($ss2); } if ($aws['ko_value']!=2 && !isEmpty($aws['recordpointer'])) { sql_call("UPDATE edomiLive.aws SET recordpointer=NULL WHERE (id=".$aws['id'].")"); } } sql_close($ss1); } function recordAWS($gaid,$value) { if ($gaid>0) { $tmp=sql_getValue('edomiLive.awsList','id','gaid='.$gaid.' OR gaid2='.$gaid.' LIMIT 0,1'); if (!isEmpty($tmp)) { checkAWS($gaid,$value); } } } function convertHSVtoRGB($h,$s,$v) { $h/=255; $s/=255; $v/=255; $i=intVal($h*6); $f=$h*6-$i; $p=$v*(1-$s); $q=$v*(1-$f*$s); $t=$v*(1-(1-$f)*$s); if ($i%6==0) {$r=$v; $g=$t; $b=$p;} if ($i%6==1) {$r=$q; $g=$v; $b=$p;} if ($i%6==2) {$r=$p; $g=$v; $b=$t;} if ($i%6==3) {$r=$p; $g=$q; $b=$v;} if ($i%6==4) {$r=$t; $g=$p; $b=$v;} if ($i%6==5) {$r=$v; $g=$p; $b=$q;} if ($r>=0 && $r<=1 && $g>=0 && $g<=1 && $b>=0 && $b<=1) { return array(($r*255),($g*255),($b*255)); } return false; } function convertRGBtoHSV($r,$g,$b) { $r/=255; $g/=255; $b/=255; $max=max($r,$g,$b); $min=min($r,$g,$b); $v=$max; $d=$max-$min; $s=$max==0 ? 0 : $d/$max; if ($max==$min) { $h=0; } else { if ($max==$r) {$h=($g-$b)/$d+($g<$b ? 6 : 0);} if ($max==$g) {$h=($b-$r)/$d+2;} if ($max==$b) {$h=($r-$g)/$d+4;} $h/=6; } if ($h>=0 && $h<=1 && $s>=0 && $s<=1 && $v>=0 && $v<=1) { return array(($h*255),($s*255),($v*255)); } return false; } ?>
Dies erzeugt natürlich recht schnell ein sehr großes Logfile (für ausreichend Plattenplatz sorgen!)
Das ließe sich doch umgehen, indem man periodisch einen SHELL-Befehl zum Löschen des Logs per Logik triggert, oder? Läuft die Logik nicht mehr, wird auch das Log nicht gelöscht...
Ich hatte jetzt gerade ein ähnliches Problem, d.h. die EDOMI Logik Engine stellte jegliche Arbeit ein und es passierte einfach nichts mehr, obwohl alle Prozesse liefen. Es waren auch keine Fehler im Log zu finden. Dies kann eigentlich nur passieren, wenn ein Statement im LBS Bereich eines Logikbausteins einen potentiell blockierenden Befehl ausführt. Um diesen Zustand zu debuggen, habe ich den folgenden Befehl als erste Zeile zur Funktion callLogicFunction() in der Datei /usr/local/edomi/main/include/php/incl_logic.php hinzugefügt:
Damit schreibt die Logikengine jede LBS-Ausführung mit LBS-Nummer (1900XXXX) und LBS-ID (Instanz-Nummer im Logikeditor) in ein Logfile.
Dies erzeugt natürlich recht schnell ein sehr großes Logfile (für ausreichend Plattenplatz sorgen!) und es hat auch eine Auswirkung auf die CPU- und I/O-Last des EDOMI Servers, aber man kann am Ende nachvollziehen, welcher Logikbaustein beim Blockieren der Logik-Engine zuletzt gestartet wurde. Und genau da sollte man dann den Fehler suchen. Danach natürlich nicht vergessen diese Zeile wieder zu löschen oder auszukommentieren.
kann man sich die letzten Zeilen des neuen Logfiles anschauen. Der letzte Eintrag ist dann der Problemkandidat. Sollten beim Ausführen dieses Befehls weiterhin neue Einträge in schneller Folge in dem Logfile auftauchen, dann weiss man, dass die Logikengine noch arbeitet. Solange kein Blockieren aufgetreten ist, kann man auch bedenkenlos die Datei in regelmäßigen Abständen löschen, um Speicherplatz freizugeben.
Evtl. hilft das ja dem ein oder anderen, der auch mal vor einem ähnlichen unerklärbaren Problem steht.
Zuletzt geändert von jonofe; 30.05.2022, 08:28.
Grund: Korrektur tail Befehl
Also Problem ist behoben:
Ich hatte vor ca. einer Woche auf meinem Debian-Server ein "dist-upgrade" durchgeführt. Dabei wurden einige Pakete entfernt, so dass der Logitech Media Server nicht mehr korrekt ausgeführt wurde.
Der SqueezeCommand oder der SqueezeClient in der Version 0.5 kommen damit wohl nicht zurecht und haben die LogikEngine blockiert.
Ich habe bei blockierter Engine den LMS aktualisiert. Ein erneuter Blick auf edomis Send-Rate zeigt, dass die LogikEngine ohne Neustart weiterarbeitet.
Hallo Andre,
danke auch für Deine Antwort. Also weg war der Prozess nicht. War nicht sauber formuliert. Das hatte ich gestern abend auch schon geprüft:
Mal sehen, welcher Baustein es schlussendlich ist. Habe gerade festgestellt, dass mein Logitech Media Server nicht erreichbar ist. Mal sehen, ob es daher kommt.
Ihr solltest zunächst mal feststellen, ob die Logikengine abgestürzt (main.php) oder blockiert ist. Bei Absturz sollte eigentlich ein Fehler im Log stehen, da EDOMI ja einen eigenen Errorhandler hat. Im Idealfall sollten diese Prozesse laufen:
Wenn einer davon nicht da ist, dann ist vermutlich was schief gelaufen, insbesondere gilt das für main, queue, logic.
Gleiches gilt für den mysqld Prozess. Auch dann sollte was im Errorlog stehen.
Ist der proc_logic.php blockiert, dann sollten noch alle Prozess vorhanden sein, aber proc_logic macht nichts mehr, da er evtl. in einer Endlosschleife hängt. Wenn in der Endlosschleife dann noch irgendein usleep() verwendet wird, dann kann man das noch nicht mal an der Prozessorlast erkennen.
Da hilft es nur, über Ausschlussverfahren den Übeltäter ausfindig zu machen. Was natürlich erstaunlich ist, dass es Einzelfälle sind. Bei Verwendung von selbst erstellten LBS, die nicht im DL Portal sind, kann man natürlich wenig zu sagen, da muss man wissen was man tut. Ansonsten kann man sich den LBS Bereich der relevanten Bausteine anschauen und prüfen, ob da was kritisches gemacht wird.
Dann bliebe die Frage, ob sich die Logikengine seitens Entwickler durch Robustheitsmaßnahmen insoweit abschotten ließe, dass ein (Fremd-)LBS diese unter keinen Umständen zum Absturz bringen kann.
Ich bin nicht sicher, ob das wirklich nötig ist. Man sollte einfach alles was über einfaches PHP hinausgeht, in den EXEC-Bereich des LBS packen. Dieser läuft komplett unabhängig von der Hauptlogikschleife und kann diese auch nicht blockieren.
Ich glaube wir hatten für den Herbst auch mal einen Workshop zum Thema LBS Erstellung geplant. Da sollte das dann mit berücksichtigt werden. (maque)
Ja, der Effekt ist genau der, den Du beschreibst.
Ich hatte wohl ein wenig Glück, weil ich zunächst die Logikseiten deaktiviert hatte, bei denen es eine Kommunikation nach Außen gibt.
Meistens war die LogikEngine nach ca. 30 Minuten nicht mehr "aktiv", jetzt bin ich schon bei 2,5 Stunden.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: