+ Antworten
Ergebnis 1 bis 7 von 7
  1. #1
    Registriert seit
    May 2017
    Beiträge
    79

    Standard Skriptausführung bei Variablenänderung nicht zuverlässig

    Hallo,

    ich habe folgende Situation:

    - Anwesenheitserkennung per FritzProject (funktioniert astrein)
    - Skript, das abhängig von Anwesenheitserkennung die Zirkulationspumpe an oder aus schaltet (niemand da = aus)

    PHP-Code:
    <?

    //37251 Variable Anwesenheit
    //52915 Variable Leistung Zirkulation

    $Anwesenheit GetValueBoolean(37251);

    if (
    $Anwesenheit == 'true'){
        
    IPS_Sleep(2000);
        
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 15'); // Pumpe einschalten
        
    IPS_Sleep(5000);
        
    $Zirkulation_Status trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
        
    IPS_Sleep(1000);
        
    SetValueFloat(52915$Zirkulation_Status);
    }

    elseif (
    $Anwesenheit == 'false'){
        
    IPS_Sleep(2000);
        
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 0'); // Pumpe ausschalten
        
    IPS_Sleep(5000);
        
    $Zirkulation_Status trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
        
    IPS_Sleep(1000);
        
    SetValueFloat(52915$Zirkulation_Status);
    }

    else 
    $Anwesenheit true;

    ?>
    Ich habe es erst mit der Wartezeit versucht, hilft aber nichts.
    Manchmal funktioniert die Schaltung, manchmal auch nicht. Hat jemand eine Idee?
    Ich konnte noch kein Muster feststellen. Auffällig ist, dass das Skript direkt nach Auslösung fertig sein soll laut Zeitstempel. Wenn es korrekt klappt, hat der Zeitstempel einige Sekunden Differenz.
    Geändert von Peter1984 (29.09.18 um 21:23 Uhr)

  2. #2
    Registriert seit
    Mar 2008
    Ort
    Ruesselsheim
    Beiträge
    3,381

    Zitat Zitat von Peter1984 Beitrag anzeigen
    Hallo,

    ich habe folgende Situation:

    - Anwesenheitserkennung per FritzProject (funktioniert astrein)
    - Skript, das abhängig von Anwesenheitserkennung die Zirkulationspumpe an oder aus schaltet (niemand da = aus)

    PHP-Code:
    <?

    if ($Anwesenheit == 'true')

    elseif (
    $Anwesenheit == 'false'){
        

    ?>
    Soweit ich weiss werden Strings , also zb ´falsé , immer als
    TRUE angesehen. Nimm mal die Anfuehrungszeichen raus.



    Gesendet von iPad mit Tapatalk

  3. #3
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    8,635

    Wird das Script nur durch die Variable 37251 gestartet?
    Dann braucht es kein GetBoolean.
    $IPS['VALUE'] enthält dann immer den neuen Wert von 37251.
    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  4. #4
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,330

    Hallo Peter,

    du solltest dir über das ganze Script nochmal Gedanken machen.

    PHP-Code:
    if ($Anwesenheit == true
    oder einfach
    PHP-Code:
    if ($Anwesenheit 
    ist das gleiche.

    Würde dann so aussehen.

    PHP-Code:
    if ($Anwesenheit ) {
    ///
    } else {
    ///

    Deine ganzen sleeps sind eher unpassend, da sie dir das Script entsprechend lange blockieren. Bei etlichen Scripten dieser Art steht dein IPS irgendwann still.

    PHP-Code:
    else $Anwesenheit true
    soll was bewirken? Im Moment nichts. Wenn müsstest Du mit SetValue setzen.
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  5. #5
    Registriert seit
    May 2017
    Beiträge
    79

    Zitat Zitat von 1007 Beitrag anzeigen
    Soweit ich weiss werden Strings , also zb ´falsé , immer als
    TRUE angesehen. Nimm mal die Anfuehrungszeichen raus.
    Das hat leider nichts verändert.

    Zitat Zitat von Nall-chan Beitrag anzeigen
    Wird das Script nur durch die Variable 37251 gestartet?
    Dann braucht es kein GetBoolean.
    $IPS['VALUE'] enthält dann immer den neuen Wert von 37251.
    Michael
    Würde ich dann die Schleife so schreiben?

    PHP-Code:
    if ($IPS['37251']=true
    Zitat Zitat von RWN Beitrag anzeigen
    Hallo Peter,

    du solltest dir über das ganze Script nochmal Gedanken machen.

    PHP-Code:
    if ($Anwesenheit == true
    oder einfach
    PHP-Code:
    if ($Anwesenheit 
    ist das gleiche.

    Würde dann so aussehen.

    PHP-Code:
    if ($Anwesenheit ) {
    ///
    } else {
    ///

    Deine ganzen sleeps sind eher unpassend, da sie dir das Script entsprechend lange blockieren. Bei etlichen Scripten dieser Art steht dein IPS irgendwann still.

    PHP-Code:
    else $Anwesenheit true
    soll was bewirken? Im Moment nichts. Wenn müsstest Du mit SetValue setzen.
    Die Sleeps hatte ich nur drinnen, da ich vermutet hatte, das shell_exec zu lange braucht, um den Wert in die Wärmepumpe zu schreiben. Habe sie wieder rausgenommen.

    Die else-Bedingung habe ich auch wieder raus, da ich dachte, das auf jeden Fall eine drin sein muss. Habe die Doku missverstanden.

    Was mir inzwischen aufgefallen ist: Führe ich das Skript manuell aus, klappt es.

    Ab und an passiert aber folgendes (Zeitstempel beachten):

    Name:  Bildschirmfoto 2018-09-30 um 10.07.05.png
Hits: 121
Größe:  44.6 KB

    Dann reagiert der Auslöser, das Skript läuft aber scheinbar nicht.

    Aktuell sieht das Skript so aus:

    PHP-Code:
    <?
    $Anwesenheit 
    GetValueBoolean(37251);

    if (
    $Anwesenheit==true){
        
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 15'); // Pumpe einschalten
        
    $Zirkulation_Status trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
        
    SetValueFloat(52915$Zirkulation_Status);
    }

    else{
        
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 0'); // Pumpe ausschalten
        
    $Zirkulation_Status trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
        
    SetValueFloat(52915$Zirkulation_Status);
    }
    ?>

  6. #6
    Registriert seit
    Jan 2007
    Ort
    Nidda(Hessen)
    Beiträge
    7,330

    Wenn, wäre es so richtig.

    PHP-Code:
    if($_IPS['VALUE']) 
    Dein Script läuft doch nur ein paar ms.

    Bau dir doch mal ein LogMessage in if und else ein.

    Hier nachzulesen.

    https://www.symcon.de/service/dokume...blen/#Variable

    und hier.

    https://www.symcon.de/service/dokume...ps-logmessage/
    Geändert von RWN (30.09.18 um 10:08 Uhr)
    Gruß Rainer


    Unmögliches wird sofort erledigt, Wunder dauern etwas länger.


  7. #7
    Registriert seit
    May 2017
    Beiträge
    79

    Hallo zusammen,

    Im Logfile ist mir nichts aufgefallen.
    Ich habe das Problem jetzt so gelöst, das ich den Teil der die Einstellung vom Bus liest in ein anderes Skript ausgelagert habe, das eh 1x pro Minute den Status zahlreicher Werte vom Ebus liest.
    Ich vermute der Fehler kam daher dass auf dem Bus erst geschrieben und direkt danach der Wert vom Bus gelesen werden sollte. Evtl Zuviel für den Buskoppler?

    Habe es jetzt 10x probiert, hat immer funktioniert.
    Dank eurer Hilfe ist das Skript jetzt wenigstens schön 😉

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 28.01.18, 10:35
  2. Skriptausführung bei Fehler wiederholen
    Von CarnivoreD im Forum Skripte, PHP, SQL
    Antworten: 10
    Letzter Beitrag: 01.04.17, 20:34
  3. Antworten: 8
    Letzter Beitrag: 16.05.15, 11:25
  4. Skriptausführung bei Webfront- oder Mobilezugriff
    Von Clipper_l im Forum Skripte, PHP, SQL
    Antworten: 9
    Letzter Beitrag: 14.11.11, 18:33