Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS für Internorm Gateway (Mediola) - Fensterkontakte

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS für Internorm Gateway (Mediola) - Fensterkontakte

    Hallo zusammen,

    nach langer Zeit ist es heute den Internorm Technikern gelungen mein Internorm Gateway (=Mediola AIO Gateway V4) gemeinsam mit den Funk-Fensterkontakten in Betrieb zu nehmen.
    Und ja - ich gebe graderaus zu dass es ein Planungsfehler war in meinem Haus nicht gleich verkabelte Reed Fensterkontakte zu verbauen

    Hier nun mein Problem:
    Ich kann den Status der Fensterkontakte einfach per Webpage auslesen:
    http://<GatewayIP>/command?XC_FNC=GetStates
    Und hier bekomme ich dann einen einfachen Text zurück:
    {XC_SUC}[{"type":"IW","adr":"FF","state":"0010:00"},{"type" :"IW","adr":"01366B01","state":"0011:00"},{"type": "IW","adr":"01366B02","state":"0012:07"},{"type":" IW","adr":"01366B03","state":"0012:01"},{"type":"I W","adr":"01366B04","state":"0012:02"},{"type":"IW ","adr":"01366B05","state":"0012:03"}]
    Die (für mich relevante) Syntax habe ich folgendermaßen nachvollziehen können:
    • Hinter "adr" finde ich die Unique Adresse des Fensterkontaktes
      Hier könnte ich also eine Zuordnung zum Klartext meines Fensters machen (z.B. 01366B01 = Büro)
    • Hinter "state" finde ich den Zustand des Fensters (0110 & 0010=offen / 0111&0011 = gekippt / 0112&0012 = offen)
      • Eine Spezialität ist dass hierbei das 2. Digit angibt ob das Fenster links oder rechts angeschlagen ist - ist für mich aber irrelevant
    Mein Problem ist jetzt dass ich einiges der LBS Codes zwar lesen kann - im schreiben aber ein absoluter Legastheniker bin.

    Könnte mich einer von euch in die richtige Richtung schubsen wie ich mir vielleicht doch einen LBS zusammenschustern könnte - ev. zusammengeklaut/kopiert von bereits bestehenden Lösungen?

    Ich denke so in der Richtung dass als Eingangsparameter der o.g. String eingelesen wird und dann ein Array von "offen/gekippt/geschlossen" zurückgemeldet wird mit dem ich dann arbeiten könnte?!
    Die Reihenfolge bleibt immer gleich, auch die Menge der Adressen (ich bekomme ja keine Fenster dazu)

    Habt ihr hier Ideen - oder ist die platte Antwort "lern programmieren"?!

    schöne Grüße

    #2
    Kurz mal angetestet:

    Code:
    <?php
    $_buffer ='{XC_SUC}[{"type":"IW","adr":"FF","state":"0010:00"},{"type" :"IW","adr":"01366B01","state":"0011:00"},{"type": "IW","adr":"01366B02","state":"0012:07"},{"type":" IW","adr":"01366B03","state":"0012:01"},{"type":"I W","adr":"01366B04","state":"0012:02"},{"type":"IW ","adr":"01366B05","state":"0012:03"}]';
    preg_match_all('/adr"\:"(.*?)".*?state":"(.*?):/si', $_buffer, $result, PREG_PATTERN_ORDER);
    $serial = $result[1];
    $state = $result[2];
    foreach($serial as $key => $value) {
        echo "Serial ".$value ." Zustand ".$state[$key]."</br>";
    }
    ?>
    Ergibt:

    Code:
    Serial FF Zustand 0010
    Serial 01366B01 Zustand 0011
    Serial 01366B02 Zustand 0012
    Serial 01366B03 Zustand 0012
    Serial 01366B04 Zustand 0012
    Serial 01366B05 Zustand 0012
    Kannst Du damit was anfangen?

    Kommentar


      #3
      DrCoffee
      teste mal das hier:
      Code:
      ###[DEF]###
      [name        = Test    ]
      
      [e#1        = trigger]
      [e#2        = IP]
      
      [a#1        =SN 1]
      [a#2        =Status 1]
      [a#3        =SN 2]
      [a#4        =Status 2]
      [a#5        =SN 3]
      [a#6        =Status 3]
      [a#7        =SN 4]
      [a#8        =Status 4]
      [a#9        =SN 5]
      [a#10        =Status 5]
      [a#11        =SN 6]
      [a#12        =Status 6]
      [a#13        =SN 7]
      [a#14        =Status 7]
      [a#15        =SN 8]
      [a#16        =Status 8]
      [a#17        =SN 9]
      [a#18        =Status 9]
      [a#19        =SN 10]
      [a#20        =Status 10]
      
      ###[/DEF]###
      
      
      ###[HELP]###
      
      ###[/HELP]###
      
      
      ###[LBS]###
      <?
      function LB_LBSID($id) {
          if ($E=logic_getInputs($id)) {    
              if ($E[1]['refresh']==1 && $E[2]['value']!='' && logic_getVar($id,1) != 1) {
                  callLogicFunctionExec(LBSID,$id);
              }
      
          }
      }
      ?>
      ###[/LBS]###
      
      
      ###[EXEC]###
      <?
      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
      sql_connect();
      
      $result= array();
      $serial= array();
      $state= array();
      
      if ($E=getLogicEingangDataAll($id)) {
          logic_setVar($id,1,1);
          function HomepageLaden($url, $postdata)
              {
              $agent = "Chrome v1.0 :)";
              $header[] = "Accept: text/vnd.wap.wml,*.*";
              //$header[] = "cache-control: no-cache";
              $header[] = "cache-control:max-age=300";
              $ch = curl_init($url);
      
              if ($ch)
                  {
                  curl_setopt($ch,    CURLOPT_RETURNTRANSFER, 1);
                  curl_setopt($ch,    CURLOPT_USERAGENT, $agent);
                  curl_setopt($ch,    CURLOPT_HTTPHEADER, $header);
                  curl_setopt($ch,    CURLOPT_FOLLOWLOCATION, 1);
      
                  if (isset($postdata))
                      {
                      curl_setopt($ch,    CURLOPT_POST, 1);
                      curl_setopt($ch,    CURLOPT_POSTFIELDS, $postdata);
                      }
      
                  $tmp = curl_exec ($ch);
                  curl_close ($ch);
                  }
              return $tmp;
              }
      
      
              $_url = 'http://'.$E[2]['value'].'/command?XC_FNC=GetStates';
              $_buffer = HomepageLaden($_url, "");
              if ($_buffer <>''){
                  preg_match_all('/adr"\:"(.*?)".*?state":"(.*?):/si', $_buffer, $result, PREG_PATTERN_ORDER);
                  $serial = $result[1];
                  $state = $result[2];
                  $n=1;
                  foreach($serial as $key => $value) {
                      if ($state[$key] == '0010') $state[$key] = 0;
                      if ($state[$key] == '0011') $state[$key] = 1;
                      if ($state[$key] == '0012') $state[$key] = 2;
                      setLogicLinkAusgang($id,$n,$value);
                      setLogicLinkAusgang($id,$n+1,$state[$key]);
                      $n = $n+2;
                  }
          }
      }
      logic_setVar($id,1,0);
      sql_disconnect();
      ?>
      ###[/EXEC]###
      Dann sollte Status 0 = zu, Status 1 = gekippt und Status2 = offen sein
      Zuletzt geändert von vento66; 31.07.2017, 20:06.

      Kommentar


        #4
        Hi Micha,

        wow - vielen Dank dafür! Heute komme ich wohl dank meiner Zwerge nicht mehr zum testen, ich hoffe mal auf morgen!

        vielen Dank für die schnelle Antwort
        Andreas

        Kommentar


          #5
          Hi Micha,

          puh.. nachdem die Kids krank sind - vertragen die Temperaturwechsel scheinbar nicht soo gut, hat sich das Ausprobieren deines LBS etwas hingezogen. Ich bin aktuell auch noch nicht so ganz damit durch, irgendwie will's nicht so richtig. Da das aber auch gut an mir liegen kann will ich hier mal nur ein Status rückmelden.
          Ich habe versucht ganz simpel einen 1min Trigger am Trigger Eingang anzulegen, die IP Adresse gepflegt und dann an SN1 und Status 1 eine Ausgangsbox angehängt deren Status ich dann in der Visu anzeigen lassen will.
          Leider bleibt die Visu jedoch komplett leer?!

          Da ich den Fehler allerdings noch bei mir (bin EDOMI Anfänger) vermute - werde ich mich nochmal länger dran hängen sobald die Kids wieder fit sind und ich abends hoffentlich mal wieder Zeit habe.

          Gruß
          Andreas

          Kommentar


            #6
            Hi Micha,

            hmm - jetzt hatte ich noch etwas mehr Zeit mich mit deinem Baustein auseinander zu setzen - allerdings ohne Erfolg. Ich habe die RegEx noch geringfügig verändert um diese besser an das Feedback meines Internorm (Mediola) Gateway anzupassen:
            Code:
            /adr"\:"01366B(.*?)".*?state":"(.*?):/si
            Dann hatte ich "einfach" versucht eine Ausgangsbox an den LBS anzuschliessen und einen KO zu definieren den ich dann in der Visu anzeigen wollte - alles noch ganz simpel.. (dachte ich).
            Leider schaffe ich es nicht dass in der Visu irgendwas angezeigt wird - der Wert der KO scheint auch leer zu bleiben - hast du eine Idee warum?

            Nachdem jetzt auch alle Fenster in dem Gateway sind - hier mal noch der volle Output der unter der aufgerufenen URL kommt:
            {XC_SUC}[{"type":"IW","adr":"FF","state":"0011:00"},{"type" :"IW","adr":"01366B01","state":"0011:00"},{"type": "IW","adr":"01366B02","state":"0011:01"},{"type":" IW","adr":"01366B03","state":"0011:02"},{"type":"I W","adr":"01366B04","state":"0012:01"},{"type":"IW ","adr":"01366B05","state":"0012:07"},{"type":"IW" ,"adr":"01366B06","state":"0012:01"},{"type":"IW", "adr":"01366B07","state":"0012:01"},{"type":"IW"," adr":"01366B08","state":"0011:01"},{"type":"IW","a dr":"01366B09","state":"0012:04"},{"type":"IW","ad r":"01366B10","state":"0012:01"},{"type":"IW","adr ":"01366B11","state":"0011:02"},{"type":"IW","adr" :"01366B12","state":"0111:02"},{"type":"IW","adr": "01366B13","state":"0112:01"},{"type":"IW","adr":" 01366B14","state":"0112:00"},{"type":"IW","adr":"0 1366B15","state":"0012:01"},{"type":"IW","adr":"01 366B16","state":"0112:02"},{"type":"IW","adr":"013 66B17","state":"0012:01"},{"type":"IW","adr":"0136 6B18","state":"0012:02"},{"type":"IW","adr":"01366 B19","state":"0112:01"},{"type":"IW","adr":"01366B 20","state":"0012:03"},{"type":"IW","adr":"01366B2 1","state":"0112:00"}]


            Hier der KO:

            Kommunikationsobjekt.png
            Hier der LBS mit der Ausgangsbox und eingetragener IP - der Trigger ist ein "Minütlicher"
            --> die URL die du im LBS aus der IP baust funktioniert astrein - das konnte ich testen:
            http://192.168.178.18/command?XC_FNC=GetStates

            Logikeditor.png
            Hier das Visuelement

            Visueditor.png

            Kommentar


              #7
              An der Regex brauchst erst mal gar nichts rumschrauben, bis Du nicht weist, ob von deinem Server überhaupt was zurückkommt

              Kommentar


                #8
                Hmm... kommen tut was wenn ich die URL händisch eingebe.
                Die Ergänzung in der RegEx war nur nötig weil der erste Treffer sonst die FF Adresse wäre die allerdings keinem Fenster entspricht.

                Habe ich den LBS denn richtig verdrahtet?

                Kommentar


                  #9
                  Kommt auch was im LBS an? Sonst müsste man erst mal einen Debug Ausgang schaffen, der den kompletten ankommenden String enthält. Wenn Du den FF nicht brauchst, kann das nachher noch abgefangen werden.

                  Kommentar

                  Lädt...
                  X