Timer Event

Sobald ich das Timer Event ausführe in einem Script bekomme ich Kernel-Fehlermeldungen
Nehme ich Timer Event wieder raus, alles OK :confused:

Was mache ich oder ist hier falsch?

So ab und an werden auch die Daten nicht ausgewertet, welche vom EDIP eingehen.
Daten im COM und Regvariable sind einwandfrei und aktuell, nur das Script wird nicht immer ausgeführt.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : edip_test.ips.php
Trigger  : 
Interval : 
*/




   if($IPS_SENDER == "TimerEvent")
{
   //Display und Beleuchtung ausschalten
   COMPort_SendText(40079, chr(27)."DA".chr(27)."YH".chr(0));
   IPS_SetScriptTimer("edip_test", 0);
   
   exit;
}

   IPS_SetScriptTimer("edip_test", 120);

   //Hauptmenü zeigen
   COMPort_SendText(40079, chr(27)."MT".chr(1));

   //Uhrzeit schreiben
   COMPort_SendText(40079, chr(27)."ZC".chr(120).chr(2).GetValueString("TIME_STRING").chr(0));

   //Display einschalten und dimmen
   COMPort_SendText(40079, chr(27)."DE");
   COMPort_SendText(40079, chr(27)."YH".chr(30));

   //Werte formatieren und ins Display schreiben
   $Temp = GetValueFloat("ks300_temp_ist");
   $Temp = number_format($Temp, 1, ".", ".");
   COMPort_SendText(40079, chr(27)."ZR".chr(150).chr(33)."$Temp".chr(0));
   $Feuchte = GetValueInteger("ks300_luftfeuchte");
   $Feuchte = number_format($Feuchte, 1, ".", ".");
   COMPort_SendText(40079, chr(27)."ZR".chr(150).chr(43)."$Feuchte".chr(0));
   $Wind = GetValueFloat("ks300_wind_ist");
   $Wind = number_format($Wind, 1, ".", ".");
   COMPort_SendText(40079, chr(27)."ZR".chr(150).chr(53)."$Wind".chr(0));
   $Regen = GetValueInteger("ks300_regenmenge");
   $Regen = number_format($Regen, 1, ".", ".");
   COMPort_SendText(40079, chr(27)."ZR".chr(150).chr(63)."$Regen".chr(0));
   
   //Meldungen ins Display schreiben und bei Alarm Buzzer für ..ms einschalten
   $Alarm = GetValueBoolean("Alarm");
   If ($Alarm)
   {
   COMPort_SendText(40079, chr(27)."YS".chr(25));
   }
   COMPort_SendText(40079, chr(27)."ZL".chr(58).chr(103).GetValueString("Alarmtext").chr(0));
   COMPort_SendText(40079, chr(27)."ZL".chr(58).chr(115).GetValueString("Batterie_Meldung").chr(0));

   exit;

?>

Daten von EDIP

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Daten_Edip.ips.php
Trigger  : 
Interval : 
*/


  //Buffer auslesen
  $daten = GetValueString("edip_daten");
  $eingabe = substr($daten, -1);
  //echo ("$eingabe");
  switch ($eingabe)

{
  //Touchtaste-Hauptmenü startet Runscript
  case "M";
  IPS_RunScript("edip_test");
  break;
  //Touchfeld startet Runscript
  case "E":
  IPS_RunScript("edip_test");
  break;
  //Touchtaste Wetter startet TM-Wetter
  case "W":
  COMPort_SendText(40079, chr(27)."MT".chr(20));
  break;
  //Touchtaste Heizung startet TM-Heizung
  case "H":
  COMPort_SendText(40079, chr(27)."MT".chr(21));
  break;
  
}
?>

ersetz mal deine exit’s durch return’s

Gruss,
Olli

Hi Olli,

Super, Danke. Fehler ist weg .

Allerdings ist das Problem mit ausführen des Scripts immer noch da.

Gut hat auch damit nichts zutun. Hast Du eine Idee oder einen Vorschlag für mich.

bei case „M“ hast du ein „;“ und kein „:“

Peinlich, Peinlich :stuck_out_tongue:

Danke!

Ändert aber an der Sache auch nicht´s.

Wenn ich Klavier auf dem EDIP spiele :slight_smile: geht es irgendwann wieder. Die Daten kommen aber einwandfrei an :confused:

Ich glaube ich habe es gefunden, bin am testen.

ich habe kein edip - also kann ich nur vermuten…

mit deinem


$eingabe = substr($daten, -1); 

nimmst du nur das letzte Zeichen - ist da evtl. noch mehr brauchbares dabei was behandelt werden muss? Mach mal Debug-Ausgaben von $daten (aber nicht mit echo)…

Desweiteren: muss der Input-Buffer „edip_daten“ nach der ‚Abholung‘ nicht ggf. noch gelöscht werden mit:


SetValueString("edip_daten",""); 

?

Gruss,
Olli

Wenn das RegisterVariable auf Overwrite steht. Nein.

Hier ein Snippet wie ich es mache:


//Buffer auslesen
$event=$IPS_VALUE; //GetValueString("TouchLCDEvent");

//Events auswerten
if(substr($event, 0, 3)==chr(27).chr(65).chr(1)) {
 //Button gedrückt
 switch(ord($event{3}))
 {
  case EV_MAIN_START:
   OpenMenu(MNU_START);
   break;
  case EV_MAIN_LIGHT:
   OpenMenu(MNU_LIGHT);
  ...
 }
}

paresy

Hi Olli,

man könnte sicher noch das 2te byte mit auswerten ob es aber was ändert muss ich testen.
Die Daten lösche ich nicht, werden bei jedem Tatstendruck überschrieben.

PS: Fehler ist immer noch da, sporadisch :confused:

Wenn das RegisterVariable auf Overwrite steht.

steht sie.

@ paresy, deine Ausgabe hab ich mir auch schon angesehen.

Nur so wirklich kann ich mir da leider nichts drunter vorstellen.

Das mit substr habe ich ja schon begriffen.

Das ord gibt den ASCII Wert zurück.

Erklär es mal für Dummies :slight_smile:

:confused: Bild vergessen :slight_smile:

Baue einfach nach jedem 8. Befehl in Folge 100ms Pause in.
In deinem Screenshot sieht man am Ende nämlich sehr viele Befehle ohne Pause.

Das hat sich bei mir als sehr gut erwiesen.

Andernfalls überforderst du das gute LCD :slight_smile:

paresy

Ich denke das Problem ist ein anderes.

Mit dem Befehl case „E“ muss er das Display starten, was er nicht immer macht.

wie kann ich denn die $daten debuggen, so wie Olli das beschrieben hat.

Ansonsten sind die Daten ja einwandfrei im Com und Registervariable vorhanden.

Steh im Moment auf dem Schlauch.

Alles andere funktioniert ja auch.

Was ich allerdings noch gerne wüsste, wie betreibe ich das EDIP mit Smartprotokoll an IPS?

Debuggen:


IPS_LogMessage("EDIP Receive", "bla bla");

und dann bei IPS unter „Kernel / Custom“ nachschauen.

:slight_smile: bla bla :slight_smile:

Danke Olli :slight_smile:

es ist in der Tat so, das die Daten nicht ankommen wenn das Display aus ist.

Nach Klavier spielen geht es dann irgendwann an.

Die Daten, ich wiederhole mich, kommen aber in COM und Variable einwandfrei an.

Bin Ratlos :mad:

So noch mal alles nach geschaut.

Daten kommen überall an, bis auf Kernel/Custom

Kernel/Debug zeigt den Tastendruck auch noch an

 //Buffer auslesen
  $daten = GetValueString("edip_daten");
  $eingabe = substr($daten, -1);
  IPS_LogMessage("$daten", " ");

sollte ja so stimmen, zeigt ja auch ´Daten im Kernel/Custom an, wenn es denn geht.

Mit welchem Event-Typ triggerst du dein Skript durch die Variable?

Ups, kleine Überscheidung userer Post’s…

also wird dein Skript jedesmal getriggert? Dann erübrigt sich meine letztze Frage.

Welche Daten werden in dein Skript hinein gesendet? Konvertiere doch mal die einzelnen Bytes deiner Empfangsdaten in Dezimale- oder Hex-Zahlen als String und schreibe die in die Debugausgabe -> um zu schauen was für Daten-Pakete du überhaupt im Skript empfängst.

Mit den Eingaben von den Tasten

M startet das Script ediptest von einer Unterseite.

E startet das Script ediptest nach Ablauf TimerEvent neu.

Wenn M getoucht wird, startet auch E automatisch.


  //Buffer auslesen
  $daten = GetValueString("edip_daten");
  $eingabe = substr($daten, -1);
  IPS_LogMessage("$daten", " ");
  //echo ("$eingabe");
  switch ($eingabe)

{
  //Touchtaste-Hauptmenü startet Runscript
  case "M":
  IPS_RunScript("edip_test");
  break;
  //Touchfeld startet Runscript
  case "E":
  IPS_RunScript("edip_test");
  break;

Zum konvertieren der Daten in dezimale Zahlen und Ausgabe:


$s = "";
for($i=0; $i<strlen($daten); $i++)
{
   $s = $s.intval(substr($daten,$i,1))." ";
}
IPS_LogMessage("daten:", $s);