"Live" Impulsdauer-Auswertung von Taster über PHP - 64kb Fehlermeldung in Konsole

Hallo Zusammen,
da ich noch nicht aufgegeben habe, einen Dimmer über php und einem kurzen Tastendruck (toggle) ein- und auszuschalten und über einen langen Tastendruck hoch bzw. runterzudimmen solange der Taster gedrückt wird, habe ich versucht, zunächst einmal die Tastendruckdauer auszuwerten.

Habe ähnlich wie hier beschrieben:

mein Skript aufgebaut und folgenden Code erstellt:


<?
ips_sleep(100);
$pressed = 0;
$data1 = getvalue(31760 /*[Merten Wandtaster grau\Data (Boolean)]*/);
echo($data1 . "; " . $pressed . "
");
do {
$data2 = getvalue(29811 /*[Merten Dimmer\Data (Boolean)]*/);
echo(($data2 == true ? "yes" : "no"). "; " . gettype($data2) . "; " . $pressed . "
");
$pressed += 100;
} while ($data1 == true);
?>

Solange der Taster gedrückt wird (Boolean ist 1), soll er die Variable $pressed beginnend mit 0 immer wieder um 100 erhöhen, bis der Taster losgelassen wird. Idee war bis zu einem Wert X Aktion A starten (ein/aus) und mit dem Überschreiten des Werts X Aktion B (Dimmvorgang hoch/runter) starten.

Wenn ich das Skript starte, bekomme ich die Meldung:

„Die Ausgabe ist größer als 64kb und würde die Konsole unnötig verlangsamen. Soll die Ausgabe auf 64kb beschränkt werden?“

Ich klicke auf nein und in der Konsole erscheint auch wie gewünscht ein Ergebnis, aber es kommt die Meldung:

100
200
300

5046000
Output-Buffer exceeds 1024kb. Operation halted

Außerdem wird das Skript in IPS von da an als fehlerhaft ausgewiesen.

Kann mir vielleicht jemand verraten, wie ich diesen Output-Buffer erhöhen kann oder welche Funktion ich nutzen könnte um weitermachen zu können?

Vielen Dank im Voraus.

P.S. Bin absoluter PHP Neuling - bitte bei Tipps berücksichtigen;)

Mach einfach mal weniger Echos. Die Meldung ist zu deinem Schutz da, denn einige MB auf den Schirm an Text zu bekommen, kann ne Weile dauern und ist in den meisten Fällen nicht in deinem Sinne gewesen.

paresy

Hi.

Habe ich. echo gibt jetzt bis 12885300 aus, bis die Meldung kommt. ich vermute, dass die Meldung immer noch nach ca. 1 sek. kommt.

Heisst das jetzt, dass die Funktion richtig läuft und ich den Taster auch nach einem z.B. 20 sek. langen Tastendruck auswerten kann und nur die Konsole von der Limitierung betroffen ist?

Gruß

Du hast gar keine ms pause in deiner Schleife, was soll da denn passieren ?
Ganz ganz schnell Speicher mit echo zumüllen?
Baue einen Sleep ein und Teste wie groß/klein der sein muß damit es sinnvoll geht.
Michael

Hi.
Was ist eine ms pause und wie meinst du das mit dem „sleep einbauen“?
Hast du vielleicht einen link? Das sind meine ersten Gehversuche mit php…

Siehe Zeile 2 Deines Skripts, so etwas soll in die Schleife mit rein

ips_sleep(100);

Erklärung in der Doku

Hi.
Ich kenne diesen Befehl aus der Doku, aber wie kann ich die in die Schleife einbauen?
Gruß

Da du leider nicht schreibst was du eigentlich damit erreichen willst…
Und deine Schleife auch nie ein Ende findet, da du $data1 nie neu mit GetValue befüllst, habe ich mal was angenommen.

<?
$sender=51953;  /* Muß a) das Script Triggern bei änderung auf True, muß wirklich zwischen true und false wechseln, da das Skript sonst nie verlassen wird*/
$empf=51184;  /*Hier mal ein Dimmer... 0.0 - 1.0 = 0% bis 100%*/
$level = 0.0;
do
{
  $level += 0.1; // neuer Level +10%
  WhatEverFürEinGerät_WriteValueFloat($empf,$level);
  IPS_Sleep(1000); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) and ($level<0.9)); //solange $Sender noch true ist und level nicht 100%.
// 10Sek Sender auf True ist 100% Dimmer
?>

Ob es dir hilft… mußt du selber sagen.

Michael

Hi.
Danke für das Feedback.

ich habe das Skript einmal übernommen und abgeändert:


<?
$sender=31760 /*[Merten Wandtaster grau\Data (Boolean)]*/;  /* Muß a) das Script Triggern bei änderung auf True, muß wirklich zwischen true und false wechseln, da das Skript sonst nie verlassen wird*/
$empf=24294 /*[Merten Dimmer\Intensity]*/;  /*Hier mal ein Dimmer... 0.0 - 1.0 = 0% bis 100%*/
$level = 0;
do
{
  $level += 10; // neuer Level +10%
  ZW_DimSet(52530 /*[Merten Dimmer]*/,$level);
  IPS_Sleep(1000); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) and ($level<90)); //solange $Sender noch true ist und level nicht 100%.
// 10Sek Sender auf True ist 100% Dimmer
?>

Wenn ich das Skript starte und der Dimmer ist bei 0%, dann steigt der Dimmwert einmalig auf 10%.
Ein erneutes Ausführen führt zu keiner Änderung… Wo liegt der Fehler?

Die schleife wird gleich verlassen, weil der Taster nicht gedrückt ist.
Das script muss somit über den Taster gestartet werden. Da zu ein auslösendes Eregnis erstellen. Trigger ist die Variable des Tasters, Ziel ist das Script.
Michael

Kommando zurück.
Es klappt - irgendwie.
Wenn ich die Taste gedrückt halte, steigt der Dimmwert, aber beim loslassen fällt er wieder auf 10 % zurück - nicht schlecht :slight_smile:
Jetzt noch Toggle, damit der Dimmer hoch und runterdimmt und bei kurzem tastendruck ein und aus und Cäsar ist happy - nach 3 Wochen rumspielerei.
Danke Michael

Dann ist das Ereigniss vermutlich falsch konfiguriert.
Auslösten nur bei true, und dann sollte es passen.
Natürlich geht kurzer Tastendruck oder wieder runterdimmen so jetzt noch nicht.
Michael

Hast recht, ich habe im Ereignis von Variablenänderung auf True gestellt, dann dimmt er solange hoch, bis ich loslasse und lässt dann den letzten Dimmwert:) Excellent.
Ich weiss, ich sollte mein Glück nicht überspannen, aber wäre es im Bereich des Möglichen, wenn es für Dich nicht zu lange dauert, mir auch bei dem Rest zu helfen? Hat nicht die Eile, ich habe seit Wochen nix geschafft, da kann ich auch noch warten, falls es länger dauert…
Auf jeden Fall vielen Dank

Momentan ziemlich eng. Aber wenn ich Luft habe, versuche ich dran zu denken.
Vom Handy aus aber schwer was zu testen :smiley:
Sonst schick mir eine PN als Erinnerung.
Michael

getapatalkt -> Schreibfehler und Zeilenumbrüche sind optional.

Gerne gerne.

Habe jetzt gerade versucht, die Dimmrichtung zu ändern, indem ich eine zusätzliche Variable in IPS erstellt habe, die zwischen True auf False wechselt, wenn ich den Taster drücke, aber irgendwo ist so eine verflixte Klammer falsch gesetzt. „unexpected else in zeile 15“:

<?
$sender=31760 /[Merten Wandtaster grau\Data (Boolean)]/; /* Muß a) das Script Triggern bei änderung auf True, muß wirklich zwischen true und false wechseln, da das Skript sonst nie verlassen wird*/
$empf=24294 /[Merten Dimmer\Intensity]/; /Hier mal ein Dimmer… 0.0 - 1.0 = 0% bis 100%/
$level = 0;
$dimmrichtung=29885;
if ($dimmrichtung = true)
{do
{
$level += 5; // neuer Level +10%
ZW_DimSet(52530 /[Merten Dimmer]/,$level);
IPS_Sleep(10); //1sek Pause
$data1 = getvalue($sender); //data1 neu holen, sonst wird die Schleife nie verlassen!
echo „level:“.$level."
„;
} while (($data1 == true) and ($level<90)); //solange $Sender noch true ist und level nicht 100%.
else {do
{
$level -=5; // neuer Level +10%
ZW_DimSet(52530 /[Merten Dimmer]/,$level);
IPS_Sleep(10); //1sek Pause
$data1 = getvalue($sender); //data1 neu holen, sonst wird die Schleife nie verlassen!
echo „level:“.$level.“
";
} while (($data1 == true) and ($level<90)); //solange $Sender noch true ist und level nicht 100%.
}

// 10Sek Sender auf True ist 100% Dimmer
?>

Runterdimmen, habe nur mal gespielt, weiss nicht, ob es so geht :o

Bei Dir im Skript fehlt im ersten Teil die } Klammer der if-Bedingung vor der else :wink: … und wieder nicht in php-Tags :rolleyes:

<?
$sender=31760 /*[Merten Wandtaster grau\Data (Boolean)]*/;  /* Muß a) das Script Triggern bei änderung auf True, muß wirklich zwischen true und false wechseln, da das Skript sonst nie verlassen wird*/
$empf=24294 /*[Merten Dimmer\Intensity]*/;  /*Hier mal ein Dimmer... 0.0 - 1.0 = 0% bis 100%*/

$level = getvalue($empf);

if ($level > 0) {
do
{
  $level -= 10; // neuer Level -10%
  ZW_DimSet(52530 /*[Merten Dimmer]*/,$level);
  IPS_Sleep(1000); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) and ($level == 0));
} else {
do
{
  $level += 10; // neuer Level +10%
  ZW_DimSet(52530 /*[Merten Dimmer]*/,$level);
  IPS_Sleep(1000); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) and ($level<90)); //solange $Sender noch true ist und level nicht 100%.
// 10Sek Sender auf True ist 100% Dimmer
}
?> 

Hi.
Mia Culpa,

wie geht das genau mit dem Code einfügen? Über das Raute Icon?
Das Skript funktioniert teilweise.
Das Hochdimmen von Wert 0 aus klappt, wenn man gedrückt hält. Wenn ich dann loslasse und wieder gedrückt halte, dimmt der Dimmer eine Stufe runter - dann muss ich loslassen und noch einmal drücken, damit er wieder eine Stufe tiefer dimmt. Erst wenn er wieder bei 0 angekommen ist, führt ein Gerückthalten zu einem Hochdimmvorgang.
Das ist schon mal ein großer Fortschritt. Ich freue mich, auch wenn es noch nicht klappt. Hatte eigentlich hier gelesen, dass mein Vorhaben nicht richtig funktionieren würde, aber jetzt habe ich hoffnung:)

4-5 Punkte:
Du musst mit getvalue den wert der Dimmrichtung holen.
Und es muss bei der if Abfrage == stehen.
Ausserdem die schon besagte Klammer vor dem else.
Und dann muss es bei der zweite Schleife auch >10 sein.
Die pausen mit sleep und die Schritte nicht zu klein machen, sonst bekommst du noch Probleme mit deinem Funkverkehr. Da ich ZWave nicht habe, k.A. was hier sinnvoll ist.
Michael

getapatalkt -> Schreibfehler und Zeilenumbrüche sind optional.

Antworten -> mittlere Bilderzeile ganz rechts aussen … php-Blatt :wink:

Das Skript funktioniert teilweise

Deins, oder meins? Hast Du meins mal probiert?

Hi.
Habe jetzt das Skript etwas abgeändert und die „Und“-Bedingung entfernt, so dass jetzt in beide Richtung bei gedrückthalten gedimmt wird.

Leider geht das hochdimmen aufgrund der Bedingung (meine Vermutung: „if ($level > 0) {
do…“ nur, wenn das Licht aus ist. Danach gehts nur runter. Deswegen wollte ich eine zusätzliche boolean Variable in IPS erstellen, die mit jedem Klick von True auf False und zurück wechselt. In Abhängigkeit vom Status dieser Variable soll dann hoch, bzw. runtergedimmt werden.

Problem: Ich habe dieser Variable den Merten Taster als Ereignis hinzugefügt (Variablenänderung), aber die Variable ändert sich nicht…
Wenn ich die Forensuche nach „Variable ändern Ereignis“ starte, kriege ich 17 Seiten an Ergebnissen…
Der bisherige Code:

<?
$sender=31760 /*[Merten Wandtaster grau\Data (Boolean)]*/;  /* Muß a) das Script Triggern bei änderung auf True, muß wirklich zwischen true und false wechseln, da das Skript sonst nie verlassen wird*/
$empf=24294 /*[Merten Dimmer\Intensity]*/;  /*Hier mal ein Dimmer... 0.0 - 1.0 = 0% bis 100%*/

$level = getvalue($empf);

if ($level > 0) {
do
{
  $level -= 5; // neuer Level -10%
  ZW_DimSet(52530 /*[Merten Dimmer]*/,$level);
  IPS_Sleep(100); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) /*and ($level == 0)*/);
} else {
do
{
  $level += 5; // neuer Level +10%
  ZW_DimSet(52530 /*[Merten Dimmer]*/,$level);
  IPS_Sleep(100); //1sek Pause
  $data1 = getvalue($sender);  //data1 neu holen, sonst wird die Schleife nie verlassen!
  echo "level:".$level."
";
} while (($data1 == true) /*and ($level<90)*/); //solange $Sender noch true ist und level nicht 100%.
// 10Sek Sender auf True ist 100% Dimmer
}
?>

Yeah, es klappt mit dem PHP Code;)