Thema geschlossen
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 19
  1. #1
    Registriert seit
    Mar 2006
    Beiträge
    3,421

    Standard [HM-Instanzen] Batteriezustand, Erstellen, Ändern u. Löschen der Variablen

    Hervorgegangen aus diesem Thread und diesem Thread ist meine Gesamtlösung:

    Das Setzen des Batteriezustands in die entsprechenden Boolean-Variablen und falls die Variablen noch nicht existieren, werden sie automatisch mit frei wählbarem Namen angelegt. Zudem besteht die Möglichkeit, die Variablen umzubenennen oder zu löschen.

    Achtung! Werden die Variablen gelöscht und danach neu angelegt, haben sich die ID's geändert!

    Beim ersten Durchlauf (wenn die Variablen neu angelegt werden müssen) können einige Sekunden vergehen, bevor alles "an Ort und Stelle ist"

    PHP-Code:
    <?
    /*
    *******************************************************************************************
    Auslesen des Batteriezustands an HM-Instanzen - Erstellen, Löschen, Umbenennen der Variablen
    *******************************************************************************************
    File     :  
    Trigger  :  
    Interval :  
    */

    $ccu HM_GetHost(ObjektID von HomeMatic Socket);     // IP der Homematic-CCU abfragen
    $function 1;                                     // Funktion 1 = Abfrage des Batteriezustands

    $lbname  "Batterie";                             // Variablenname für LOW-BATT
    $altname "HM-Batterie";                             // Alternativer Name der Variable (beim UMBENENNEN)

    $create 1;                                       // ERSTELLEN [Variable 1=Anlegen(Beibehalten) / 0=Löschen]
    $rename 0;                                       // UMBENENNEN [1=JA / 0=NEIN]


    if (!$create)  $rename 0;                        // Wenn Löschen, dann nicht gleichzeitig Umbenennen


    // *******************************CCU abfragen - BEGINN**********************************
    function GetDeviceStatus($ccu$function$devices, &$status)
    {
    $singleresult false;

        
    // Check if $devices is an array or not
        
    if (is_string($devices))
        {
           
    $singleresult true;
            
    $devicelist = array($devices);
        }
        else
        {
           
    $devicelist $devices;
        }

        
    // Prepare array for status values
        
    $status array_flip($devicelist);

        
    // Build request for CCU
        
    $request "";
        foreach(
    $devicelist as $serial)
        {
           if (
    $function == 1)
           {
                
    $request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.LOWBAT').Value();\r\n";
            }
            else
            {
                
    $request .= "var $serial = dom.GetObject('BidCos-RF.$serial:0.STICKY_UNREACH').State();\r\n";
            }
        }

        
    // Open socket for CCU-connection
        
    $fp fsockopen ($ccu8181$errno$errstr2);
        if (!
    $fp)
        {
            
    $status $errno "|" $errstr;
            return 
    false;
        }

        
    // Sending request to CCU
        
    stream_set_blocking($fp1); // sicher gehen, dass der stream im non blocking Mode arbeitet
        
    $st "POST /tclrega.exe HTTP/1.1\r\nContent-type: application/x-www-form-urlencoded\r\n" .
                
    "Content-Length: " strlen($request) . "\r\nConnection: Close\r\n\r\n";
        
    fputs($fp$st $request);

        
    // Receiving result from CCU
        
    $t "";
        
    $start false;
        while (!
    feof($fp))
        {
            
    $st fgets($fp);
            if (
    $start$t .= $st;
            if (
    $st == "\r\n"$start true;
        }
        
    fclose($fp);

        
    // Convert result to XML
        
    $xml = new SimpleXMLElement($t);

        
    // Walk through each key and copy status infos to result-array
       
    foreach($xml as $key => $value)
        {
           if (
    array_key_exists($key$status)) $status[$key] = (strtolower((string)$value) == "true");
        }
        if (
    $singleresult$status $status[$devices];
       return 
    true;
    }
    // *******************************CCU abfragen - ENDE**********************************



    $alleInstanzen IPS_GetInstanceListByModuleType(3);                     // alle I/O Instanzen suchen

    // Array ausgeben
    foreach($alleInstanzen AS $id)
       {
       
    $instanz IPS_GetInstance($id);
        
    $instanz $instanz['ModuleInfo'];
        
    $instanz $instanz['ModuleName'];
            if (
    $instanz == "HomeMatic Device")                            // Vergleich ob das Array den Instanz-Name ausgibt
            
    {
                if (
    $create)
                {
                
    $adresse HM_GetAddress($id);                                    // HM-Seriennummer ermitteln
                
    $devices substr($adresse,0,10);                                     // HM-Seriennummer ohne Sub-Adresse(:xx)
                    
    if ( (@!IPS_GetVariableIDByName($lbname$id) ) > 0)     // Überprüfen ob Variable schon existiert, Ergebnis = NEIN
                    
    {
                    
    $newid IPS_CreateVariable(0);                                // Variable anlegen
                    
    IPS_SetVariableCustomProfile ($newid"~Battery");       // Variablenprofil einstellen
                    
    IPS_SetName($newid$lbname);                           // Name für Variable schreiben
                    
    IPS_SetParent($newid$id);                              // Unter Parent-ID verschieben
                    
    GetDeviceStatus($ccu$function$devices, &$status);    // Funktion - Abfrage der CCU
                    
    SetValueBoolean($newid$status);                        // Wert in Variable schreiben
                    
    }
                    else
                    {
                    
    $newid IPS_GetVariableIDByName($lbname$id);         // Überprüfen ob Variable schon existiert, Ergebnis = JA
                        
    if ($rename)
                        {
                       
    IPS_SetName($newid$altname);                           // Name für Variable neu schreiben
                       
    }
                       else
                        {
                        
    GetDeviceStatus($ccu$function$devices, &$status);    // Funktion - Abfrage der CCU
                        
    SetValueBoolean($newid$status);                        // Wert in Variable schreiben
                       
    }
                    }
                }
                else
                {
                
    $newid IPS_GetVariableIDByName($lbname$id);         // Überprüfen ob Variable existiert, Ergebnis = JA
                
    IPS_DeleteVariable($newid);                              // Variablen ($lbname) löschen
                
    }
            
            }
        }
    ?>
    Geändert von nancilla (05.01.10 um 21:36 Uhr) Grund: Warnmeldung beim bei nicht existierender Instanz beseitigt
    Gruß nancilla

  2. #2
    Registriert seit
    Dec 2006
    Beiträge
    77

    Hallo nancilla,

    vielen Dank für das Skript.

    Ich habe es übernommen und ausprobiert. Die Variablen für den Batteriestatus wurden noch angelegt, da diese gefehlt haben.

    Hat alles und super funktioniert.

    Wäre nett, wenn Du noch einen Beitrag mit einem Link zu diesem Script im Homematic-Ordner erstellst.

    Das Skript ist absolut hilfreich bei der Anlage der Variablen. IPS legt nicht alle (so wie in der Doku genannt) Variablen automatisch an.

    Das Skritp ist absout top, notwendig und Voraussetzung für weitere Entwicklungen und Auswertungen.

    Danke für die investierte Zeit.

    Viele Grüße
    wesseli

  3. #3
    Registriert seit
    Mar 2006
    Beiträge
    3,421

    Danke!

    Ich habe das selbe Script auch auf die "STICKY-UNREACH" Funktion abgeändert (Var-Namen etc.) und extra laufen. Mit Absicht habe ich diese Funktion hier nicht mit eingebaut, weil es eigentlich reicht, die "LOW-BATT"-Abfrage 1-2 mal täglich ausführen zu lassen, jedoch die "STICKY-UNREACH"-Abfrage öfters (bei mir momentan stündlich).
    Gruß nancilla

  4. #4
    Registriert seit
    Apr 2009
    Beiträge
    11

    hi nancilla,

    Frage kann man das Script vielleicht auch so umschreiben, dass es die aktuellen Status von mehren Sensoren (Fenster-Kontakte) ausliest und diese in einer bestimmten Variable speichert.

    Gruß

    Jay
    Geändert von Jay (05.04.10 um 07:58 Uhr)

  5. #5
    Registriert seit
    May 2010
    Beiträge
    41

    Hallo Zusammen,

    das Script funktioniert bei mir leider nicht. Sobald ich
    es ausführe, erscheint dieser Fehler:

    ____________________________________

    Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\Programme\IP-Symcon\scripts\47503.ips.php:83
    Stack trace:
    #0 C:\Programme\IP-Symcon\scripts\47503.ips.php(83): SimpleXMLElement-&gt;__construct('')
    #1 C:\Programme\IP-Symcon\scripts\47503.ips.php(129): GetDeviceStatus('192.168.2.2', 1, 'GEQ0233297', Array)
    #2 {main}
    thrown in C:\Programme\IP-Symcon\scripts\47503.ips.php on line 83

    ____________________________________


    Die Geräte SN: GEQ0233297 ist die Homematic Wetterstation (Kombisensor OC3)

    Habe IP-Symcon via LAN-Adapter und BidCos-Service laufen.


    Kann mir bitte jemand helfen???

    Tausend Dank!
    Micha

  6. #6
    Registriert seit
    Mar 2006
    Beiträge
    3,421

    Hi Micha,

    das Script ist für den direkten Zugriff über die CCU geschrieben.
    Ich gehe davon aus, dass es über den Bidcos-Service und den LAN-Adapter nicht funktioniert.

    Mit meiner Konstellation kann ich aber einen Test direkt nur mit LAN-Adapter nicht nachstellen.
    Geändert/angepasst werden müsste eigentlich nur...
    PHP-Code:
    // *******************************CCU abfragen - BEGINN**********************************
    ............
    // *******************************CCU abfragen - ENDE********************************** 
    Wenn überhaupt geht mit dem BC-Service.... Eventuell kann das jemand anpassen?
    Gruß nancilla

  7. #7
    Registriert seit
    May 2010
    Beiträge
    41

    Hallo nancilla,

    danke für Deine schnelle Antwort.
    Ich habe bereits das Script an einigen Stellen angepasst.
    Eine Vernindung zum BidCos Service besteht. zumindest bekomme ich hier keine Fehlermeldung.

    Ändere ich z.B. den Port im Script, erhalte ich sofort einen Verbindungsfehler.

    Es muss also noch was anderes sein. Irgendwie scheint es so, als ob das Script Schreibprobleme mit der XML Datei hat.

    Ich schau mir das nochmal an.
    Falls zwischenzeitlich irgendjemand eine Lösung in Verbindung mit dem LAN-Adapter hat, würde ich mich über eine kurze Antwort sehr freuen.


    Danke und Grüße,
    Micha

  8. #8
    Registriert seit
    Aug 2008
    Ort
    Flensburg
    Beiträge
    382

    Hallo Nancilla, (ist das wirklich Dein Name?)
    das script schein zu laufen... vielen Dank dafür.
    Ich bekomme allerdings Fehlermeldungen mit denen ich nicht so recht was anfangen kann. Vielleicht hast Du hier eine Idee?
    array_flip() expects parameter 1 to be array, boolean given in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 41

    Warning: Invalid argument supplied for foreach() in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 45

    Warning: array_key_exists() expects parameter 2 to be array, null given in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 88

    Warning: array_key_exists() expects parameter 2 to be array, null given in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 88

    Warning: array_key_exists() expects parameter 2 to be array, null given in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 88

    Warning: Variable wurde als "Nur-Lesen" markiert und kann nicht verändert werden in C:\Programme\IP-Symcon\scripts\23508.ips.php on line 130
    PHP-Code:
    #40:     // Prepare array for status values
    #41:    $status = array_flip($devicelist);

    #45:     foreach($devicelist as $serial)

    #88:       if (array_key_exists($key, $status)) $status[$key] = (strtolower((string)$value) == "true");

    #130:      SetValueBoolean($newid, $status);                        // Wert in Variable schreiben 
    Würde mich freuen wenn Du hier weiterhelfen kannst... Wie "gesagt" das Script scheint zu laufen aber die Fehlermeldungen hätte ich doch gerne weg. Mit fehlt hierzu (noch) das nötige PHP Wissen.

    Liebe Grüße aus Handewitt
    //Sven

  9. #9
    Registriert seit
    Mar 2006
    Beiträge
    3,421

    Zitat Zitat von _Sven_ Beitrag anzeigen
    Hallo Nancilla, (ist das wirklich Dein Name?)
    ist doch mein Nick.

    Tritt der Fehler mit CCU oder LAN-Adapter auf?
    Gruß nancilla

  10. #10
    Registriert seit
    Aug 2008
    Ort
    Flensburg
    Beiträge
    382

    Guten Morgen,
    der Fehler tiritt in Verbindung mit der CCU auf.

    Allen einen Sonnigen Tag

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 22.11.09, 13:10
  2. Abfrage der Aktualisierungszeit einer Variablen?
    Von mr_cg im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 3
    Letzter Beitrag: 05.10.08, 14:50
  3. Antworten: 11
    Letzter Beitrag: 15.08.08, 18:36
  4. Variablen, Bemerkung/Alias und löschen
    Von ralf im Forum Allgemeine Diskussion
    Antworten: 2
    Letzter Beitrag: 21.01.07, 16:35
  5. Frage zu IP-Symcon bezüglich der zyklischen Abfrage des I/O-Moduls memPIO
    Von blood3d@gmx.de im Forum Allgemeine Diskussion
    Antworten: 0
    Letzter Beitrag: 12.12.05, 15:17