+ Antworten
Ergebnis 1 bis 8 von 8
  1. #1
    Registriert seit
    Jan 2007
    Ort
    Etzenrot
    Beiträge
    155

    Standard Edip Funktionen

    Hallo

    bin gerade am Experimentieren mit edip und da wurde es mir irgendwann zu blöd immer alle Zahlen mit chr umrechnen zu lassen. Und wenn man mit zwei edips schafft, von denen einer mit xbee verbunden ist, der andere aber am comport hängt muss man jedes überarbeitete Script von Hand wieder neu anpassen.
    Ausserdem verliert man bei den langen reihen leicht den Überblick. Jeder der mit edip schafft weiß was ich meine
    PHP-Code:
    RegVar_SendText(20289 /*[Diverse\Edip 1\Register Xbee]*/,chr(27)."AT".chr(0).chr(0).chr(120).chr(20).chr(154).chr(0)."$titel".chr(0)); //Titel anzeigen 
    Also hab ich mir gedacht bau dir doch ne edip Funktion. Gesagt getan.

    Nach einigen Tests hat sich nun diese Funtion ergeben.
    Somit sieht das Beispiel von oben nun so aus:
    PHP-Code:
    edip("AT,0,0,120,20,154,0,$titel"); 
    Wichtig ist hier das man nur " benutzt. Bei ' würde statt dem Inhalt von $titel wirklich $titel ausgegeben.
    PHP-Code:
    function edip($input)
    {
    $input=split(",",$input); //$input in ein array umwandeln
    $daten chr(27);//erstes Zeichen #
    switch (strtoupper($input[0])) // Sonderfälle für AT und ZL wenn man "nur" eine Zahl ausgeben möchte
    {
    case 
    "AT":
    $daten .= "AT";
    for (
    $i=1;$i<7;$i++)
        {
                
    $daten .= chr($input[$i]);
        }
        
    $daten .= vokal($input[7]);

       
    $daten.=chr(0);
    break;
    case 
    "AU":
    $daten .= "AU";
    for (
    $i=1;$i<6;$i++)
        {
                
    $daten .= chr($input[$i]);
        }

        
    $daten.=chr(0);
    break;
    case 
    "AK":
    $daten .= "AK";
    for (
    $i=1;$i<7;$i++)
        {
                
    $daten .= chr($input[$i]);
        }

        
    $daten .= vokal($input[7]);
        
    $daten.=chr(0);
    break;
    case 
    "AJ":
    $daten .= "AJ";
    for (
    $i=1;$i<7;$i++)
        {
                
    $daten .= chr($input[$i]);
        }

        
    $daten .= vokal($input[7]);
        
    $daten.=chr(0);
    break;
    case 
    "ZL":

    $daten .= "ZL".chr($input[1]).chr($input[2]).vokal($input[3]);
    $daten.=chr(0);
    break;
    case 
    "ZC":

    $daten .= "ZC".chr($input[1]).chr($input[2]).vokal($input[3]);
    $daten.=chr(0);
    break;
    case 
    "ZR":

    $daten .= "ZR".chr($input[1]).chr($input[2]).vokal($input[3]);
    $daten.=chr(0);
    break;
    Default:
    for (
    $i=0;$i<count($input);$i++)
        {
        if (
    is_numeric($input[$i])) // überprüfen ob Text oder Zahl
            
    $daten .= chr($input[$i]);
        else
            
    $daten .= $input[$i];
         }

    break;
    }
    //echo $daten;

    RegVar_SendText(20289 /*[Diverse\Edip 1\Register Xbee]*/,$daten); //daten ans edip senden über xbee

    //COMPort_SendText(46080 /*[Objekt #46080 existiert nicht]*/,$daten); //daten an edip übertragen


    }

    function 
    vokal($text)
    {
       
    $text str_replace("Ä""\x8E"$text);
        
    $text str_replace("ä""\x84"$text);
        
    $text str_replace("Ö""\x99"$text);
        
    $text str_replace("ö""\x94"$text);
        
    $text str_replace("ü""\x81"$text);
        
    $text str_replace("Ü""\x9A"$text);
        
    $text str_replace("ß""\xE1"$text);
    return 
    $text;

    Musste leider für AT und ZL eine eigene Abfrage einbauen, da der Text wenn er nur aus einer Zahl besteht auch umgerechnet wird.

    Hab erst gedacht das die Funktion grössere Programme langsamer macht, also schnell eine schleife, 100 Durchgänge, gebaut und einige Daten ans edip gesendet. Die Laufzeit ist bei AT und ZL bis auf ein paar ms gleich, erst bei BA und BR ist mir ein Unterschied von 100 ms aufgefallen. Aber damit kann ich gut leben, sende ja selten innerhalb von 10 Sekunden 400 Befehle ans edip.

    Vielleicht kanns ja jemand brauchen.

    Gruß Jannis
    Geändert von Jannis (27.10.09 um 15:19 Uhr) Grund: Funktion überarbeitet z.B. ÄÖÜ umwandlung

  2. #2
    Registriert seit
    Aug 2005
    Ort
    Fürstenfeldbruck-Aich (Bayern)
    Beiträge
    4,051

    Hallo Jannis,

    vielen Dank für die Funktion, werde ich bei meinem bald anstehenden Edip-Projekt einmal anwenden.

    Vielleicht kann es Ferengi an die Skriptbeispiele hängen.
    Gruß
    Werner

    Komponenten:: Homematic(CCU) 250DP, EATON-MOELLER, 1-Wire, WMRS200, 15" Touchdisplay
    Software::
    IPS V4.x, iMobile, WebFront, Logitech Media Server 7.8.x, SONOS
    Hardware:: IPS-Server: ESXi 6.x, Windows 10 Ent, 4 Kerne, 8GB RAM

  3. #3
    Registriert seit
    Jan 2007
    Ort
    Etzenrot
    Beiträge
    155

    Standard edip screenshot mit IPS

    Hallo

    wollte eigentlich nur "schnell" nen Screenshot von meinem edip haben um ne Frage verständlicher zu formulieren, aber da ich zu faul war das edip abzufotografieren dachte ich mir machs doch schnell mal mit IPS.
    Naja schnell wars nich aber immerhin funktionierts jetzt ganz gut.

    Der Befehl den man ans edip senden muss ist
    PHP-Code:
    COMPort_SendText(46080 /*[Serial Port]*/,chr(27)."UH".chr(10).chr(15).chr(50).chr(55)); //daten an edip übertragen 
    wobei 10,15 die erste Ecke ist und 50,55 die zweite Ecke(immer x,y) ist.

    Soweit so klar.
    Das edip antwortet dann mit ESC UL 40,40 und dann die BHL daten.
    Das Auslesen übernimmt dieses Skript für die Registervariable, wobei Ihr natürlich nur die Caseanweisung für U(85) braucht und sie bei eurem Programm einfügen müsst.

    PHP-Code:
    $id_Register 15719 /*[edip\Register Variable]*/;
    $buf RegVar_GetBuffer($id_Register); //Puffer einlesen
    if ($IPS_SENDER == "RegisterVariable")
    $buf .=  $IPS_VALUE// neuen Wert hinzufügen
    $id ord(substr($buf,0,1)); //ersten wert auslesen
    print $id."  ";

    if (
    $id == "27")  //27 = ESC
        
    {
        switch (
    ord(substr($buf,1,1)))
        {
        case 
    "85":
        
    $breite ord(substr($buf,5,1)); //breite der blh datei
        
    $hoch =ord(substr($buf,6,1)); //höhe
        
    $max intval(($breite+7)/8)*$hoch//Anzahl der Bytes (formel ausm edip handbuch)
        
    if ((strlen($buf))>($max+5))  //Schauen ob alles empfangen wurde 
            
    {
            
    $bufsubstr($buf,5,($max+2)); //ESC UL und startwerte abziehen

            
    $Pfad "c:/test1.blh"//Dateiname
            
    unlink($Pfad); //alte datei löschen
          
    $Attribut "ab";
         
    $open fopen($Pfad,$Attribut);          //Öffnen
              
    fwrite($open,$buf);                   //schreiben
           
    fclose($open);                           //schließen
           
    RegVar_SetBuffer($id_Register,"");  // Puffer löschen
            
    IPS_SetScriptTimer($IPS_SELF,0);
              }
        else
            {
            
    RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
           
    }
        break;
        case 
    "65"//A befehle auslesen
       
    if ((strlen($buf))>3)  //Schauen ob alles empfangen wurde
            
    {
            
    $id ord(substr($buf,3,1)); // 4 zahl ist die NR.
            
    print "erfolgreich ".$id;
            
    setvalue(35128 /*[edip\Taste]*/,$id);
            if ((
    strlen($buf))>4)
            {
               
    RegVar_SetBuffer($id_Register,substr($buf,4,10));
               
    IPS_SetScriptTimer($IPS_SELF,2);
            }
            else
            {
            
    RegVar_SetBuffer($id_Register,"");  // Puffer löschen
            
    IPS_SetScriptTimer($IPS_SELF,0);
            }
            }
        else
            {
            
    RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
            
    IPS_SetScriptTimer($IPS_SELF,2);
          print 
    "nochnicht1";
          }
        break;
       case 
    "66"//Bargrafen auslesen

            
    if ((strlen($buf))>4)  //Schauen ob alles empfangen wurde
            
    {
            
    $id ord(substr($buf,3,1)); // 4 zahl ist die NR.
            
    $wert ord(substr($buf,4,1));
            print 
    "erfolgreich ".$id." Wert: ".$wert;
            
    setvalue(19564 /*[edip\Schieber]*/,$id);
            
    setvalue(51784 /*[edip\Wert]*/,$wert);
            if ((
    strlen($buf))>5)
            {   
    RegVar_SetBuffer($id_Register,substr($buf,5,20));
               
    IPS_SetScriptTimer($IPS_SELF,2);
            }
            else
            
    RegVar_SetBuffer($id_Register,"");  // Puffer löschen
            
    }
            else
            {
            
    RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
          
    IPS_SetScriptTimer($IPS_SELF,2);
            print 
    "nochnicht2";
          }
        break;
       default:
        if ((
    strlen($buf))==1)
            {
    RegVar_SetBuffer($id_Register,$buf); // Puffer setzten
            
    print "nur 1 empfangen";
            }
        else
            {
            
    RegVar_SetBuffer($id_Register,""); // Puffer rücksetzten
            
    IPS_SetScriptTimer($IPS_SELF,0);
          print 
    "Fehler";
          }
        }
        }
    else     
    // Sonstige Taste gesendet
        
    { if ((strlen($buf))>1)
            {
             
    RegVar_SetBuffer($id_Register,"");  // Puffer löschen
             
    IPS_SetScriptTimer($IPS_SELF,0);
            print 
    "Overflow";

            }
    setvalue(38542 /*[edip\Befehl]*/,$id);
    IPS_SetScriptTimer($IPS_SELF,0);

    Manchmal klappts nicht auf Anhieb , denn wenn nur ein byte fehlt/zuviel ist öffnet der Bitmapeditor vom edip die Datei nicht mehr. Deswegen auch der
    PHP-Code:
    substr($buf,5,($max+2)); 
    $max anzahl der Bytes plus je ein byte für Breite und Höhe.
    Dann einfach nochmal probieren oder IPS die anzahl der bytes überprüfen lassen und wenn da was nicht passt dann nochmal senden.

    Was ich noch nicht ausprobiert hab wie ich die BLH datei automatisch in bmp umwandle, aber den arbeitsschritt kann man ja noch von Hand machen. (oder hat jemand n Tip dazu?)

    Vielleicht kanns ja jemand gebrauchen z.B. um den Zeichenbereich auszulesen und abzuspeichern.

    Gruß Jannis

  4. #4
    Registriert seit
    Jan 2007
    Ort
    Etzenrot
    Beiträge
    155

    Standard Funktion überarbeitet

    So bin endlich dazugekommen die Function mal zu überarbeiten(siehe erster Beitrag) da ÄÖÜ nicht richtig dargestellt wurden.

    Gruß Jannis

    P.S. Danke RWN hab die Lösung bei Deinem Newstickerbeitrag abgeschaut.

  5. #5
    Registriert seit
    Feb 2009
    Beiträge
    191

    Standard Kommaproblem

    Hallo Jannis,

    ... sollte im Text oder in einer auszugebenden Zahl jedoch ein "," vorkommen, so wird Text abgeschnitten.

    Ich habe das mit Deinen Funktionen so gelöst:

    1.) die vokal-Funktion rufe ich extra auf (nicht gemeinsam mit edip), und wandle ein "," in das Zeichen \xFB um.

    2.) in der edip-Funktion , eine Zeile vor der Ausgabe auf dem EDIP mache ich eine Rückumwandlung aller \xFB in ","

    Klappt perfekt :-)

    Gruss NBA

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    1,429

    Hallo NBA,

    stehe gerade genau vor dem gleichem Kommaproblem.

    Kannst du evtl. nochmal genau erläutern, wie du was geändert hast.
    Evtl. ein Beispiel deiner Function?

    Danke u. Gruß,
    Doc

  7. #7
    Registriert seit
    Feb 2009
    Beiträge
    191

    Standard Komma auf edip ausgeben

    Hallo,

    also ich mache das so:

    1.) Janis ursprüngliche edip-Funktion ist an der markierten Stelle erweitert:

    PHP-Code:
    <?
    // require("29316.ips.php"); //Edip-Funktion

    function edip($input)

    {
    $input=split(",",$input); //$input in ein array umwandeln
    $daten chr(27);            //erstes Zeichen #
    switch ($input[0])         // Sonderfälle für AT und ZL wenn man "nur" eine Zahl ausgeben möchte
    {
    case 
    "AT":
    $daten .= "AT";
    for (
    $i=1;$i<7;$i++)
        {
                
    $daten .= chr($input[$i]);
        }
        
    $daten .= $input[7];

    break;
    case 
    "ZL":
    $daten .= "ZL".chr($input[1]).chr($input[2]).$input[3];

    break;
    Default:
    for (
    $i=0;$i<count($input);$i++)
        {
        if (
    is_numeric($input[$i])) // überprüfen ob Text oder Zahl
            
    $daten .= chr($input[$i]);
        else
             
    $daten .= $input[$i];
        }
    break;
    }
    $daten.=chr(0); // NUL hintenanfügen


    //--- ## Änderung 24.10.2009 ---------------------------------
    // Sonderzeichen durch Komma ersetzen
    $daten str_replace("\xFB"","$daten);  // Rückumwandlung FB in Komma ","
    // -----------------------------------------------------------

    //RegVar_SendText(40644 /*[edip]*/,$daten); //daten ans edip senden über xbee
    COMPort_SendText(40644 /*[edip]*/,$daten); //daten an edip mit comport übertragen
    }

    ?>
    dann habe ich mir eine extra-Funktion zur Ausgabe von Texten gemacht:
    An der Stelle "Komma in Sonderzeichen" wandle ich das Komma in das Sonderzeichen um.

    PHP-Code:
    <?

    // require("24170.ips.php"); //Texte umwandeln

    function edip_texte($inputx)
    {
    // $inputx = str_replace('+', ' ',$inputx);
    $inputx str_replace("Ä","Ä",$inputx);
    $inputx str_replace("ä","ä",$inputx);
    $inputx str_replace("Ö","Ö",$inputx);
    $inputx str_replace("ö","ö",$inputx);
    $inputx str_replace("%F6","ö",$inputx);
    $inputx str_replace("%FC","ü",$inputx);
    $inputx str_replace("Ãœ","Ü",$inputx);
    $inputx str_replace("ü","ü",$inputx);
    $inputx str_replace("ß","ß",$inputx);
    $inputx str_replace("Ä""\x8E"$inputx);
    $inputx str_replace("ä""\x84"$inputx);
    $inputx str_replace("Ö""\x99"$inputx);
    $inputx str_replace("ö""\x94"$inputx);
    $inputx str_replace("ü""\x81"$inputx);
    $inputx str_replace("Ü""\x9A"$inputx);
    $inputx str_replace("ß""\xE1"$inputx);
    $inputx str_replace(",""\xFB"$inputx);   // Komma in Sonderzeichen

    //mehrfache Leerzeichen raus
    $inputx str_replace("  "" "$inputx);
    $inputx str_replace("  "" "$inputx);
    $inputx str_replace("  "" "$inputx);
    $inputx str_replace("  "" "$inputx);

    return 
    $inputx;

    }

    ?>
    Die Anwendung erfolgt so:

    PHP-Code:
    require("29316.ips.php"); //Edip-Funktion
    require("24170.ips.php"); //Texte umwandeln

    $R=edip_texte("Äääh, es ist jetzt: 10,3 Grad heiß !!");
    edip("ZL,20,80,$R") ; 

    Viel Spass
    Gruss NBA
    Geändert von RWN (28.11.09 um 22:56 Uhr)

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    1,429

    Hallo NBA,

    danke für die schnelle Antwort, werde ich heute mal testen.

    @Jannis
    Ist es mit deiner Funktion auch so möglich, Bitmaps zum eDip hochzuladen (zur direkten Anzeige)?
    Irgendwie kommt da bei mir nur Datenmüll an.
    Hattest du das evtl. mal getestet?

    Viele Grüße,
    Doc
    Geändert von Doctor Snuggles (29.11.09 um 17:21 Uhr)

Ähnliche Themen

  1. Komfortable TTS Ausgabe Funktion
    Von Ferengi-Master im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 97
    Letzter Beitrag: 24.07.13, 11:09
  2. PHP Details zur Funktion preg_match() gesucht
    Von a.he im Forum Skripte, PHP, SQL
    Antworten: 2
    Letzter Beitrag: 14.06.09, 18:58
  3. Frage zur Funktion "IsTimeBetween"
    Von todorb im Forum Allgemeine Diskussion
    Antworten: 17
    Letzter Beitrag: 28.11.08, 23:35
  4. RECONNECT Funktion
    Von guyabano im Forum Dashboard
    Antworten: 2
    Letzter Beitrag: 09.11.06, 20:49
  5. Globale Variable in einer Funktion
    Von helitron im Forum Allgemeine Diskussion
    Antworten: 2
    Letzter Beitrag: 03.06.05, 14:48