IPS_GetUpdateMicrotime vs. IPS_GetVariable

Hi,

auch auf die Gefahr hin, dass die Frage in irgendeinerweise schon gestellt wurde (die Boardsuche habe ich angestrengt und bin aus den paar Sachen nicht schlauer geworden)…

Wie bekomme ich

IPS_GetUpdateMicrotime("Variable");

mit IPS_GetVariable ebenfalls in eine Zeile, sodass ich die alten Scripte anpassen kann, wie dieses z.B.

<?
/*
***************************************
Bewegungsmelder-Dachboden zurück setzen
***************************************
File     : Bewegungsmelder-DBO_setback.ips.php
Trigger  : Variable "DBO_BEW_MELD_HELL"
Interval : OnChange
*/

$timer = (GetValueInteger("DBO_BEW_MELD_HELL_TIMER")+ 1);                    // Instance-Timer abfragen und "Sicherheits-Sekunden"
$timer2 = GetValueInteger("DBO_BEW_MELD_HELL_TIMER");
$time = microtime(true);                                                      // aktuelle Zeit in Sekunden mit Nachkommastelle
$timeupdate = IPS_GetUpdateMicrotime("DBO_BEW_MELD_HELL");                   // Update-Zeit   in Sekunden mit Nachkommastelle



if(GetValueBoolean("DBO_BEW_MELD_HELL"))
{
   if(IPS_GetScriptTimer("Bewegungsmelder-DBO_setback") == 0)                // Script-Timer abfragen
   {
   IPS_SetScriptTimer("Bewegungsmelder-DBO_setback", ($timer));           // Script-Timer setzen
   }
      else
      {
         if ( ($time - $timeupdate) > $timer2)                                   // Wenn neu ausgelöst wird
         {
         SetValueBoolean("DBO_BEW_MELD_HELL", false);                           // nach Ablauf des Timers Script neu starten und Variable auf false setzen
         //SetValueBoolean("DBO_BEW_MELD_DUNKEL", false);
         IPS_SetScriptTimer("Bewegungsmelder-DBO_setback", 0);                  // Script-Timer auf 0 setzen
         }
      }
}
      else
      {
      IPS_SetScriptTimer("Bewegungsmelder-DBO_setback", 0);
      }
?>

Das sind mindestens 20 ähnliche Scripte die ich umstellen müsste von V1 zu V2.

Vielen Dank schonmal vorab!

Also ich habe hier gerade keine V2 am laufen, aber so müßte das gehen:


$timeupdate = IPS_GetVariable(ID von DBO_BEW_MELD_HELL);$timeupdate = $timeupdate[VariableUpdated];

Mann könnte sich auch mit einer Funktion behelfen, die den alten Befehl wiederherstellt, würde ich aber nicht empfehlen.

:frowning:
Nee, das funktioniert leider nicht.
Ich habe das Script eben nochmals mit der V1 probiert. Dort funktioniert es tadellos.

@paresy
Dabei ist mir aufgefallen, dass die FS20-Bewegungsmelder nicht korrekt aus der V1 übernommen werden. In V2 werden diese nur mit den BOOLEAN (TRUE) und mit DATA eingetragen, obwohl auch der TIMER übertragen wird.
Von V1 zu V2 wird daraus eine FS20EX-Instanz. Lege ich eine neue FS20-Instanz an, kann ich dem TIMER auch wieder eine Variable zuweisen, da diese Zeile dann vorhanden ist. Das ist dann wohl ein BUG!
Wer möchte schon alle zig Instanzen neu anlegen?

So wie der Stand der V2 jetzt ist, kann man eigentlich alles neu machen.
Da gibts noch viel zu tun. Da das ja alles noch „Beta“ ist, lässt sich das verzeihen, keine Frage, aber da man die Subscription ja weiter bezahlt und die V1 keine Updates mehr bekommt, begeistert mich das allerdings nicht so sehr, als Betatester zu bezahlen. Ich habe lange gewartet, bis ich den Umstieg versuchte und mir eigentlich nun schon eine relativ ausgewachsene „Beta“ versprochen, aber das ist noch zu buggi.
Vielleicht solltest du auch noch den „IPS_GetUpdateMicrotime“-Befehl weiter behalten, oder zumindest die Umstellung auf das neue Format automatisieren.
Man kann doch nicht alle Projekte, die man damals in mühevoller Arbeit und Erprobungszeit erstellt hat, wieder neu aufreissen.
Mir ist ebenfalls aufgefallen, das für einige Befehle, wie z.B. „IPS_GetScriptTimer“ jetzt die (Skript-)ID angegeben werden muss. Da ich bisher nur den Name verwendet habe, heisst das zusätzlich nochmals alle Skripte danach absuchen und umstellen. Das ist ein ziemlich wildes Durcheinander bei der Umsetzung!
Jedenfalls bin ich erstmal ziemlich erschrocken und ich hoffe, das bekommst du noch in Griff. Ich weiss, dass das alles sehr viel Arbeit bedeutet und man sieht ja auch, dass schon sehr viel Leistung im neuen Paket steckt, aber bitte gestalte den Umstieg für die V1-Leute einfacher, sonst wird das ein ziemlich demontivierender Kampf.

Also ich habe das jetzt mal in der V2 probiert und es funktioniert so wie es soll.


$timeupdate = IPS_GetVariable(15341  /*[test	estbool]*/);
echo $timeupdate = $timeupdate[VariableUpdated];

Ausgabe:


1230289444.805

Die Variable muß natürlich auch Aktualisiert sein. Sonst ist die Ausgabe 0!

Du hast recht, der Befehl liefert, was erwünscht ist.

<?
/*
*****************************************
 Bewegungsmelder-Wohnzimmer zurück setzen
*****************************************
File     : Bewegungsmelder-WZI_setback.ips.php
Trigger  : Variable "WZI_BEW_MELD_HELL"
Interval : OnChange
*/

      
$timer = (GetValueInteger("WZI_BEW_MELD_HELL_TIMER")+ 2);                    // Instance-Timer abfragen und "Sicherheits-Sekunden"
$timer2 = GetValueInteger("WZI_BEW_MELD_HELL_TIMER");
$time = microtime(true);                                                      // aktuelle Zeit in Sekunden mit Nachkommastelle
//$timeupdate = IPS_GetUpdateMicrotime("WZI_BEW_MELD_HELL");                   // Update-Zeit   in Sekunden mit Nachkommastelle
$timeupdate = IPS_GetVariable(32891 /*[Wohnzimmer\Bewegungsmelder Wohnzimmer Immer\WZI_BEW_MELD_HELL]*/ );
$timeupdate = $timeupdate[VariableUpdated];

echo "timer=";
echo $timer;
echo " timer2=";
echo $timer2;
echo " time=";
echo $time;
echo " timeupdate=";
echo $timeupdate;
echo " Differenz=";
echo $time-$timeupdate;


if (GetValueBoolean("WZI_BEW_MELD_HELL"))
{
   if(IPS_GetScriptTimer(41731 /*[Wohnzimmer\Bewegungsmelder-WZI_setback]*/ ) == 0)                // Script-Timer abfragen
   {
   IPS_SetScriptTimer(41731 /*[Wohnzimmer\Bewegungsmelder-WZI_setback]*/ , $timer);           // Script-Timer setzen
   }
      else
      {
         if ( ($time - $timeupdate) > $timer)                                   // Wenn neu ausgelöst wird
         {
         SetValueBoolean("WZI_BEW_MELD_HELL", false);                           // nach Ablauf des Timers Script neu starten und Variable auf false setzen
         //SetValueBoolean("WZI_BEW_MELD_DUNKEL", false);
         IPS_SetScriptTimer(41731 /*[Wohnzimmer\Bewegungsmelder-WZI_setback]*/ , 0);                  // Script-Timer auf 0 setzen
         }
      }
}
      else
      {
      IPS_SetScriptTimer(41731 /*[Wohnzimmer\Bewegungsmelder-WZI_setback]*/ , 0);
      }
?>
timer=62 timer2=60 time=1230293481.7544 timeupdate=1230293397.226 Differenz=84.528370857239

Dann scheint aber das ganze Script, so wie es in V1 noch anstandslos funktioniert, in V2 nicht mehr zu funktionieren. Das irretiert mich ja noch mehr:rolleyes: Die Variable wird einfach nicht mehr auf FALSE zurück gesetzt.:confused:

P.S. Welche Methode setzt du ein, um solche Variable zurückzusetzen (die vom Sender kein FALSE bekommen)?

Hallo nancilla,

ich denke die Variable WZI_BEW_MELD_HELL ist die Instanzvariable deines PIRI´s. Leider sind alle Instanzvariablen in der V2 ReadOnly, sprich Du kannst sie aus einem Skript nicht mehr zurücksetzen.

Was ich jetzt noch ganz dunkel zu wissen meine ist, Du brauchst die Variable des PIRIs nicht mehr zurücksetzen, das kann die Instanz selbst.

Hallo!

Ja.

Leider sind alle Instanzvariablen in der V2 ReadOnly, sprich Du kannst sie aus einem Skript nicht mehr zurücksetzen.

Das wäre natürlich die Erklärung! (Würde mich aber vor weiteren Problemen in anderen weitaus umfangreicheren Scripten stellen)
Ich habe das schon öfters bei Probelaufen einiger anderer Scripte gelesen… die Meldung, das Variablen geschützt sind.

Du brauchst die Variable des PIRIs nicht mehr zurücksetzen, das kann die Instanz selbst.

Wie und wo kann ich das aktivieren?

Hallo,

da mußt Du einen PIRI-Spezialisten fragen, habe leider noch keine.

Vielleicht hilft Dir das weiter.

Anscheinend wird die Variable nach der im PIRI eingestellten Zeit durch einen emulierten Timer zurückgesetzt.

Das wäre natürlich die Erklärung! (Würde mich aber vor weiteren Problemen in anderen weitaus umfangreicheren Scripten stellen)
Ich habe das schon öfters bei Probelaufen einiger anderer Scripte gelesen… die Meldung, das Variablen geschützt sind.

Zum Thema ReadOnly-Variablen kannst Du dich gerne hier einlesen. War eine lange Diskussion.

Aha, Danke für den Hinweis!

Das würde wohl auch so funktionieren, wenn die FS20-Instanzen aus V1 richtig übernommen wären, so wie ich es hier schrieb…

Heisst, ich muss doch alles neu machen… sch…!:mad:

Hallo nancilla,

Deinen Unmut kann ich verstehen, ich habe mir auch ein komplett neues Konzept für meine Skripte überlegen dürfen…

… sprich, ich habe bei NULL angefangen, dass einfachste ist das Anlegen der Instanzen.

Dafür hast Du anschließend ein bereinigtes IPS V2.

Ich habe den kompletten Neuanfang letztendlich nicht bereut.

Hallo Werner,

und ich dachte, ich bringe das „zwischen den Jahren“ auf die Reihe.
Nun bin ich aber restlos entsetzt über den Updatevorgang V1>V2 !!!
Da kann ich mir dann auch sämtliche Vorarbeiten sparen.
Das ist ja… [:erstmal sprachlos]…ich weiss nicht, was ich davon halten soll :eek: Alle Zeit, die man bisher in funktionierende Scripte der V1 gesteckt hat dahin… das kann doch nicht die Politik von IP-SYMCON sein!
Wenn das immer so sein wird, z.B. Umstellung auf V3 :wink: …ich mag garnicht daran denken… nee, nee, nee …[:Schimpfen] [:Meckern] [:Fluchen]… nee, nee, nee …bin erstmal weg…

Hallo nancilla,

auch in der V1 waren schon Diskussionen das man an den Variablen der Instanzen nicht schrauben sollte, die Variable soll ja den Zustand der Instanz wiedergeben und wann man die verändert dann ist das nicht mehr gegeben.

Aber wie gesagt, mir erging es ebenso.

Trotzdem viel Spaß mit der V2, ich habe den Umstieg nicht bedauert, mittlerweile nach 2 Wochen Arbeit läuft alles so wie ich es wollte, eigentlich sogar besser.

Hallo Werner,

das „freut“ mich, dass ich nicht alleine bin :o
Ich habe den Nachmittag schonmal genutzt um alle Instanzen neu anzulegen und die Rücksetzscripte zu entfernen. Das finde ich ja gut, dass die Variablen sich selbst nach Timer zurücksetzen, aber bei vielen anderen Scripten stoße ich immer mehr auf Unverträglichkeiten mit alten Befehlen. Schade, dass das beim Update nicht noch mehr automatisch ablaufen kann.

Heute war jedenfalls nur „manuelle“ Haus-Steuerung möglich, weil ich V2 gleich auf dem richtigen Steuerrechner konfiguriere und V1 dann gestört wäre, wenn es nebenbei auch auf die selben Geräte zugreift.

Es wäre schöner, wenn ich die Konsole der V2 offline verwalten könnte, ohne dass der Serverdienst laufen muss, dann hätte ich mir das nach Belieben einteilen können, wann ich was mache.

Hier ist der nächste Leidensgenosse :wink: werde wohl auch nochmal bei NULL anfangen :mad:
Der Umstieg ist wirklich sehr steinig…leider

Dabei ist mir aufgefallen, dass die FS20-Bewegungsmelder nicht korrekt aus der V1 übernommen werden. In V2 werden diese nur mit den BOOLEAN (TRUE) und mit DATA eingetragen, obwohl auch der TIMER übertragen wird.
Von V1 zu V2 wird daraus eine FS20EX-Instanz. Lege ich eine neue FS20-Instanz an, kann ich dem TIMER auch wieder eine Variable zuweisen, da diese Zeile dann vorhanden ist. Das ist dann wohl ein BUG!

@nancilla

…da hast Du recht, fällt mir bei der Migration auf die V2 auch gerade auf.
Ich werde das mal als Fehler in der Projektverwaltung vermerken.