Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 19000925 HOMEMATIC-EDOMI-Master und alle darauf basierenden LBSen

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

    #46
    Hallo Gernot,

    ich habe wieder eine Erfolgsmeldung. Deine Bausteine laufen momentan in meine Test-VM einwandfrei.

    Das allerdings erst nachdem ich das Script wie im Post #35 gestartet habe. Auch nach mehrmaligen starten der CCU sowie neu starten der edomi-VM habe ich eine stabile Verbindung.

    Auf meinen produnktiven System läuft es momentan noch nicht, aber ich denke, dass liegt wohl an meiner Konfiguartion.

    Ich danke Dir jedenfalls für Deine ausdauernde Hilfe und werde meinen edomi Server am WE neu aufsetzten und dann Stück für Stück testen, was der Auslöser war.

    Andreas
    Zuletzt geändert von Andreas; 14.09.2017, 04:43.

    Kommentar


      #47
      Das freut mich.

      Bitte berichte dann kurz von deiner Erfahrung.

      Schöne Grüße
      Gernot

      Kommentar


        #48
        Zitat von murelli146 Beitrag anzeigen
        19000925 HOMEMATIC-EDOMI-Master

        Der Baustein dient als Basis für die Anbindung von Homematic an Edomi und enthält auch den XML-RPM-Server
        und die homematic.class .

        Edomi wird einmalig nach der Projektaktivierung an dem XML-RPC Server der CCU2 angemeldet.
        Bei Statusänderung in der Homematic Logikschicht werden Events zum Edomi XML-RPC Server gepusht.
        Die empfangenen Events setzen die im Projekt vorhandenen HM_LBS Ausgänge.

        Es muss das php-xmlrpc Paket installiert werden dabei wird PHP von 5.3.3-48.e16_8 auf 5.3.3-49.el6 geupgraded.

        http://service.knx-user-forum.de/?comm=download&id=19000925

        Mit dem HOMEMATIC-EDOMI-Master als Basis lassen sich einfach Gerätespezifische LBSen erstellen.
        Die Geräte die ich zur Verfügung habe sind bereits umgesetzt.

        Sie können als Grundlage für neue HM LBSen genutzt werden.
        Bitte alle veröffentlichten LBSen übersichtshalber unter diesem Thema hier posten.

        Für die LBS Entwicklung oder bei Verwendung des HM-Universal-LBS werden die Datenpunkte benötigt.

        Die Datenpunkte sind im folgendem PDF beschrieben.
        http://www.eq-3.de/Downloads/eq3/dow..._Endkunden.pdf

        Für die Entwicklung die XML-RPM-Schnittstelle habe ich folgendes PDF verwendet.
        http://www.eq-3.de/Downloads/eq3/dow...XmlRpc_API.pdf

        Die homematic.class.php stammt von Xaver Bauer und wurde hier gefunden:
        https://www.symcon.de/forum/threads/...tic-CCU-BidCos


        Folgende LBSen sind bereits online:

        HOMEMATIC-EDOMI-Master http://service.knx-user-forum.de/?comm=download&id=19000925
        HM-WDS100 Wetterstation http://service.knx-user-forum.de/?comm=download&id=19000926
        HM-Sec-SC-2 Türkontakt http://service.knx-user-forum.de/?comm=download&id=19000927
        HM-PBI-4-FM Tasterschnittstelle http://service.knx-user-forum.de/?comm=download&id=19000928
        HM-RC-Key4-2 Fernbedienung http://service.knx-user-forum.de/?comm=download&id=19000929
        HM-Sec-RHS Fensterkontakt http://service.knx-user-forum.de/?comm=download&id=19001250
        HM-Sec-Key-S Motorschloss http://service.knx-user-forum.de/?comm=download&id=19001251
        HM-Universal-LBS http://service.knx-user-forum.de/?comm=download&id=19001252


        Ich hoffe damit die Brücke von Homatic und Edomi praktikabel gebaut zu haben.

        Jetzt bin ich schon ein bisschen stolz, hab mir auch fast die Zähne ausgebissen.

        Hoffentlich rückt gaert bald die im- u. export Funktion raus,
        weil ich schiebe die Visu vor mich hin und entwickle stattdessen LBSen.

        Schöne Grüße
        Gernot Klobucaric
        Wie setze ich die Rechte auf 777

        Kommentar


          #49
          Wenn Du mir erklärst, warum du jetzt für die paar Worte immer ein Vollzitat machen musst, kann ich Dir vielleicht helfen. vielleicht ist Dir das noch nicht aufgefallen, aber durch die sinnlosen Vollzitate wird der Thread unlesbar. Immerhin hast Du es geschafft in deinen bisherigen 6 Posts mit dem Zitat Button zu antworten.

          Kommentar


            #50
            Wie setze ich die Rechte auf 777
            Code:
            chmod 777 /usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-XML-RPC-Server.php
            chmod 777 /usr/local/edomi/main/include/php/homematic.class.php

            Kommentar


              #51
              Hallo murelli146 ,

              ich habe mir gerade den Code des Master-LBS angeschaut.
              Meiner Meinung nach ist noch ein Bug in Zeile 279. Version von heute.

              PHP-Code:
              $api->HM_init ($ip_edomi.'/shared/php/xml.rpc.edomi.php'$server_id ); 
              müsste doch eigentlich sein:

              PHP-Code:
              $api->HM_init ($ip_edomi.$pfad_Edomi_XML_RPC_Server$server_id ); 
              Oder?
              Das ist vermutlich bisher niemandem aufgefallen, weil vermutlich kein ReInit notwendig war.

              Kommentar


                #52
                Hi murelli146 ,

                noch zwei Anmerkungen:
                1) Du solltest in den Hilfetext unbedingt reinschreiben, dass man nach dem "yum install php-xmlrpc" unbedingt dafür sorgen muss, dass der Apache-PHP-Prozess neu gestartet wird, damit die XMLRPC Extension geladen ist. Am besten einfach bei Edomi in der Admin-Oberfläche auf "Server neustarten" gehen.

                2) Leider sind die Homematic-LBS nicht mehrfach instanziierbar. Das wäre aber notwendig, wenn man neben Homematic-Funk, auch Homematic-Wired und Homematic-IP abdecken möchte. Jeder dieser Schnittstellenprozesse läuft auf einem anderen Port:
                • Homematic-Funk (RFD): Port 2001
                • Homematic-IP (crRFD): Port 2010 (siehe API-Beschreibung)
                • Homematic-Wired: Port 2000

                Kommentar


                  #53
                  Hallo Gernot,
                  WAU!!! Doch da hast Du echt was Schönes umgesetzt!! Respekt!!!
                  Hatte bis jetzt (also bei mir im Haus) noch keinen Anwendungsfall
                  mit Homematic gehabt.
                  Nun aber hat aber ein Freund Homematic IP. Bei API lesen war ich auf die
                  unterschiedlichen Port gestoßen und mich gefragt wie Dein Master LBS
                  damit zurecht kommt.
                  Nun hatte Christian im #52 das Thema angesprochen.
                  Bei lesen Deines Master LBS hatte ich die Codezeile mit dem Port gefunden,
                  aber würde NIE einfach Deinen Master LBS für mich anpassen!!!
                  Nun mal die Frage:
                  Würdest Du den Master LBS für die Unterschiedlichen Homematic Systeme
                  anpassen?
                  Also einen Eingang worin der Nutzer seinen Port eintragen kann?
                  Also DANKE erstmal und Gruß Marcus

                  Kommentar


                    #54
                    Hi murelli146 ,

                    ich habe nun auf die Schnelle Deinen Master- und Universal-LBS kopiert und für Homematic IP angepasst.
                    Bei mir läuft das soweit.

                    LBS Homematic-IP-Master: 19001223
                    LBS Homematic-IP Universal 19001224

                    Achso:
                    Der crRFD scheint etwas anspruchsvoller zu sein, was die XMLRPC-Antworten angeht.
                    Er schickt als erstes ein "listDevices" an den XMLRPC-Server. Die korrekte Antwort ist ein leeres Array.
                    Ich habe Deinen Code angepasst, da hier ein $reply=null zurückgesendet wurde, was aber falsch ist.
                    Auch habe ich bei den $reply[]=null Konstrukten vorsichtshalber ein $reply=array() vorweg eingebaut.

                    Durch die falsche Antwort beim "listDevices" hat der crRFD keine Events gesendet.

                    Kommentar


                      #55
                      Hallo Nanosonde , tunneltruppe

                      vielen Dank für die Hinweise werde sie einpflegen.
                      Der ReInit ist für einen Neustart der CCU2 gedacht damit sich edomi auch gleich wieder initialisiert.
                      Ist mir echt nicht aufgefallen, meine CCU2 scheint stabil seit September ohne Neustart zu laufen.



                      Habe mir den Fall mehrerer Instanzen angesehen und auch schon versucht umzusetzen. Meine Ansätze verliefen ins leere.

                      Mit meinem jetzigen System benötigen wir pro Port einen Master-LBS inkl. Server (da der Server mit dem Master verknüpft ist)

                      Macht das Testen aber einfacher:

                      Hier der aktualisierte Master-LBS:

                      Code:
                      ###[DEF]###
                      [name        = HOMEMATIC-EDOMI-Master    ]
                      
                      [e#1        = Trigger #init=1            ]
                      [e#2        = IP CCU2                    ]
                      [e#3        = Überwachungstrigger         ]
                      [e#4        = Reinit_Zeit_sec #init=900    ]
                      [e#5        = Debug #init=0                ]
                      [e#6        = Port #init=2001            ]
                      
                      
                      [a#1        = Zeitstempel letzter Event    ]
                      [a#2        = Zeit seit Aktualisierung    ]
                      [a#3        = Laufzeit Script    ]
                      
                      [v#1        = 0                            ]    // E1 refresh
                      [v#3        = 0                            ]    // E3 refresh
                      [v#200        = 0                            ]    //Zeitstempel letzer Externer Aufruf
                      
                      ###[/DEF]###
                      
                      
                      ###[HELP]###
                      HOMEMATIC-EDOMI-Master
                      von Gernot Klobucaric (murelli146)
                      
                      Der Baustein dient als Basis für die Anbindung von Homematic an Edomi.
                      Edomi wird einmalig nach der Projektaktivierung an dem XML-RPC Server der CCU2 angemeldet.
                      Bei Statusänderung in der Homematic Logikschicht werden Events zum Edomi XML-RPC Server gepusht.
                      Die empfangenen Events setzen die im Projekt vorhandenen HM_LBS Ausgänge.
                      
                      Installation:
                      Auf der Konsole von Edomi "yum install php-xmlrpc" ausführen.
                      Edomi Server neustart erforderlich.(Admin Oberfläche > Server neustarten)
                      PHP wird dabei von 5.3.3-48.e16_8 auf 5.3.3-49.el6 geupgraded.
                      
                      Im Anhang die Dateien in folgende Verzeichnisse kopieren:
                      HOMEMATIC-EDOMI-Master-XML-RPC-Server.php     nach /usr/local/edomi/www/shared/php/        (Rechte auf 777)
                      homematic.class.php                            nach /usr/local/edomi/main/include/php/        (ev. Rechte auf 777)
                      
                      In /usr/local/edomi/www/shared/php/ werden folgende Dateien nach dem ersten Start angelegt.
                      HOMEMATIC-EDOMI-Master-daten-Server.data        > Serverlog zwischenspeicher
                      HOMEMATIC-EDOMI-Master-daten-edomi_lbs.data        > Angemeldete LBS Ausgänge und Master-ID
                      HOMEMATIC-EDOMI-Master-daten-hm_events.data        > Von der CCU2 aktuell empfangene Daten
                      
                      Beschreibung:
                      E1 Trigger:
                          1 Anmeldung von Edomi an der CCU2
                          0 Abmeldung von Edomi an der CCU2
                          Der Eingang wird mit 1 initialisiert und startet bei Projektaktivierung die Anmeldung.
                      E2 IP der CCU2
                      E3 Überwachungstrigger
                          Triggert die Überwachung der CCU2 Anmeldung
                          empfohlen SystemKO 5min Trigger
                      E4 Zeit (sec) nach der Edomi neu an der CCU2 angemeldet werden soll wenn bis dahin keine neuen Daten eintreffen.
                          z.B. Die Wetterstation sendet ca. alle 180sec ihre Werte. In diesem Fall gebe ich die Zeit mit 900sec. an.
                      E5 Debug 0 AUS / 1 Ein
                          Im Errorlog wird auch zusätzlich der Log vom HOMEMATIC-EDOMI-Master-XML-RPC-Server geschrieben.
                      
                      A1 Zeitstempel wann der letzte Event von der CCU2 empfangen wurde.
                      A2 Zeit in sec. seit letzter Aktualisierung von Events.
                      A3 Skriptlaufzeit zum Beobachten wenn viele Ausgänge und Events registriert sind.
                      
                      homematic.class.php wurde von Xaver Bauer geschrieben.
                      Fundort: https://www.symcon.de/forum/threads/26863-PHP-(ist)-Klasse-zur-Steuerung-der-Homematic-CCU-BidCos
                      
                      V1.00    initiale Version
                      V1.01    Bugfix
                          > Server Dateirechte prüfen
                          > Customlog wird nur geprüft wenn Debug an ist
                          > Hilfe ergänzt
                      
                      ###[/HELP]###
                      
                      
                      ###[LBS]###
                      <?
                      function LB_LBSID($id)
                      {
                          if ($E=logic_getInputs($id))
                          {
                              if (getLogicElementStatus($id)==0)                //LBS läuft nicht?
                              {
                                  if ($E[1]['refresh']==1)                     // Nach Systemstart an CCU2 anmelden oder manuell abmelden
                                  {
                                      setLogicElementVar($id,1,1);
                                      callLogicFunctionExec(LBSID,$id);        //EXEC-Script starten
                                  }
                                  elseif ($E[3]['refresh']==1)                 // Überwachung CCU2 aktualisierung
                                  {
                                      setLogicElementVar($id,3,1);
                                      callLogicFunctionExec(LBSID,$id);        //EXEC-Script starten
                                  }
                              }
                          }
                      }
                      ?>
                      ###[/LBS]###
                      
                      
                      ###[EXEC]###
                      <?
                      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                      include '/usr/local/edomi/main/include/php/homematic.class.php';
                      $start=microtime();
                      /*****************************************************************************************************************************************************
                      
                          HOMEMATIC-EDOMI-Master
                              Date        : 24.08.2017
                              Version        : 1.01
                              Autor        : (c)2017 Gernot Klobucaric
                              Kontakt        : knx-user-forum.de
                              Member        : murelli146
                      
                      *****************************************************************************************************************************************************/
                      sql_connect();
                      
                      // Initialisierung
                      $E=getLogicEingangDataAll($id);                //aktuellen Daten aller Eingänge in $E schreiben
                      $trigger=$E[1]['value'];                    //An- bzw. Abmelden
                      $ip=$E[2]['value'];                            //CCU2 IP Adresse
                      $port=$E[6]['value'];                        //CCU2 XML-RPC Port
                      $server_id='Edomi';                            //ID zur Anmeldung an CCU2
                      $re_init_time=$E[4]['value'];                //Zeit bis zur Reinitalisierung an CCU2
                      $loglevel=$E[5]['value'];                    //Loglevel 0=Aus 1>=Ein
                      $ip_edomi = global_serverIP;                //IP Adresse von Edomi
                      
                      $pfad_hm_data='/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-daten-hm_events.data';        // Pfad der empfangenen Events von der CCU
                      $pfad_lbs_data='/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-daten-edomi_lbs.data';        // Pfad zum LBS Ausgangsregister
                      $pfad_server_debug = '/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-daten-Server.data';    // Pfad für den Edomi XML-RPC-Server log
                      $pfad_Edomi_XML_RPC_Server='/shared/php/HOMEMATIC-EDOMI-Master-XML-RPC-Server.php';                    // WEB Pfad an den die CCU2 die Daten pusht
                      $name_customlog = '19000925-HOMEMATIC-EDOMI-Master';                                                // Name der Log Datei
                      $pfad_customlog = '/usr/local/edomi/www/data/log/CUSTOMLOG_'.$name_customlog.'.htm';                // Pfad der Customlog Datei
                      $api=new HomeMaticUpnpDevice($ip.':'.$port);
                      
                      /*****************************************************************************************************************************************************
                      
                          Aktualität der Events
                              Berechnung des Events alter für die Reinitialisierung
                              und ausgabe der Ergebnisse auf den Ausgängen.
                      
                      *****************************************************************************************************************************************************/
                      $letzer_event_zeit=getLogicElementVar($id, 200);
                      $aktuelle_zeit=time();
                      $events_alter=$aktuelle_zeit - $letzer_event_zeit;
                      setLogicLinkAusgang($id,1,date("d.m.y-H:i:s",$letzer_event_zeit));
                      setLogicLinkAusgang($id,2,$events_alter);
                      
                      /*****************************************************************************************************************************************************
                      
                          Dateien für Datenübergabe prüfen und ggf. erstellen
                              Customlog Rechte setzen wenn log gelöscht wurde
                      
                      *****************************************************************************************************************************************************/
                      logging( 'Dateiprüfung:');
                      if($loglevel > 0)
                      {
                          if(file_exists($pfad_customlog)==1)
                          {
                              if(substr(sprintf('%o', fileperms($pfad_customlog)), -4)!='0666')
                              {
                                  chmod ($pfad_customlog, 0666);
                                  logging( 'File: '.$pfad_customlog.' Rechte auf 0666 gesetzt');
                              }
                          }
                      }
                      
                      if(file_exists('/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-XML-RPC-Server.php')>0)
                      {
                          logging( 'File: HOMEMATIC-EDOMI-Master-XML-RPC-Server.php Rechte:'.substr(sprintf('%o', fileperms('/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-XML-RPC-Server.php')), -4));
                          if(substr(sprintf('%o', fileperms('/usr/local/edomi/www/shared/php/HOMEMATIC-EDOMI-Master-XML-RPC-Server.php')), -4)!='0777')
                              {
                                  logging( '!!!!! Achtung Rechte auf 777 setzen !!!!!');
                              }
                      }
                      else
                      {
                          logging( 'File: HOMEMATIC-EDOMI-Master-XML-RPC-Server.php fehlt !?!?!?!?!? Installation prüfen');
                      }
                      
                      if(file_exists('/usr/local/edomi/main/include/php/homematic.class.php')>0)
                      {
                          logging( 'File: homematic.class.php Rechte:'.substr(sprintf('%o', fileperms('/usr/local/edomi/main/include/php/homematic.class.php')), -4));
                          if(substr(sprintf('%o', fileperms('/usr/local/edomi/main/include/php/homematic.class.php')), -4)!='0777')
                              {
                                  logging( '!!!!! Achtung Rechte auf 777 setzen !!!!!');
                              }
                      }
                      else
                      {
                          logging( 'File: homematic.class.php fehlt !?!?!?!?!? Installation prüfen');
                      }
                      
                      if(file_exists($pfad_hm_data)!=1)
                      {
                          $i=fopen($pfad_hm_data,'w');
                          chmod ($pfad_hm_data, 0666);
                          fclose($i);
                          logging( 'File:  '.$pfad_hm_data.'  angelegt');
                      }
                      else
                      {
                          logging( 'File:  '.$pfad_hm_data.'  vorhanden. Rechte:'.substr(sprintf('%o', fileperms($pfad_hm_data)), -4));
                      }
                      
                      if(file_exists($pfad_lbs_data)!=1)
                      {
                          $i=fopen($pfad_lbs_data,'w');
                          chmod ($pfad_lbs_data, 0666);
                          fclose($i);
                          logging( 'File:  '.$pfad_lbs_data.'  angelegt');
                      }
                      else
                      {
                          logging( 'File:  '.$pfad_lbs_data.'  vorhanden. Rechte:'.substr(sprintf('%o', fileperms($pfad_lbs_data)), -4));
                      }
                      
                      /*****************************************************************************************************************************************************
                      
                          Server LOG aktivieren / deaktivieren
                              Serverlog Datei wird erstellt bzw.gelöscht
                              Dient auch als Schalter für den Serverlog (Wenn Datei vorhanden wird der Serverlog aktiviert)
                      
                      
                      *****************************************************************************************************************************************************/
                      if($loglevel > 0)
                      {
                          if(file_exists($pfad_server_debug)!=1)
                          {
                              $i=fopen($pfad_server_debug,'w');
                              chmod ($pfad_server_debug, 0666);
                              fclose($i);
                          }
                      }
                      else
                      {
                          if(file_exists($pfad_server_debug)==1)
                          {
                              unlink($pfad_server_debug);
                          }
                      }
                      
                      /*****************************************************************************************************************************************************
                      
                      Server An- und Abmeldung mit Überwachung (re-init)
                          E1 triggert bei Systemstart die An- bzw. Abmeldung an der Homematic CCU2 (1 Anmeldung / 0 Abmeldung)
                              Die LBS ID wird für den EDOMI-XML-RPC Server in das LBS Ausgangsregister geschrieben (lbs_register['Master'])
                          E3 triggert z.B. alle 15 Minuten die Überprüfung und reinitialisiert ggf. die Anmeldung
                      
                      *****************************************************************************************************************************************************/
                      if (getLogicElementVar($id,1)==1)
                      {
                          logging( '************Trigger -> E1 Server An- und Abmeldung*****************************************************************************************');
                          if($trigger==1)            //Anmeldug an der CCU2
                          {
                              $api->HM_init ($ip_edomi.$pfad_Edomi_XML_RPC_Server, '' );
                              $api->HM_init ($ip_edomi.$pfad_Edomi_XML_RPC_Server, $server_id );
                              logging( 'An CCU2 angemeldet:'.$ip_edomi.$pfad_Edomi_XML_RPC_Server);
                              $lbs_register=File_Get_Array_From_JSON($pfad_lbs_data);
                              $lbs_register['Master']=$id;
                              File_Put_Array_As_JSON($pfad_lbs_data, $lbs_register);
                              logging( 'LBS ID '.$id.' in File:  '.$pfad_lbs_data."['Master'] geschrieben");
                          }
                          else                    //Abmeldug von der CCU2
                          {
                              $api->HM_init ($ip_edomi.$pfad_Edomi_XML_RPC_Server, '' );
                              logging( 'Von CCU2 abgemeldet');
                          }
                          setLogicElementVar($id,1,0);
                          setLogicElementVar($id,3,0);
                          logging( '__________________________________________________Trigger E1 ENDE _________Laufzeit: '.(microtime()-$start).'sec___________________________');
                          setLogicLinkAusgang($id,3,(microtime()-$start));
                          sql_disconnect();
                          return;
                      }
                      //Überprüfung der Aktualität der Events
                      if (getLogicElementVar($id,3)==1 && $trigger==1)
                      {
                          logging( '************Trigger -> E3 Server Reinitialisierung_Überprüfung_auf_aktualität**************************************************************');
                          if(($events_alter >= $re_init_time) )
                          {                        //Event Daten zu alt > Reinitialisierung
                              $api->HM_init ($ip_edomi.$pfad_Edomi_XML_RPC_Server, $server_id );
                              logging( 'An CCU2 reinitialisiert, Events waren zu alt');
                          }
                          else                    //Event Daten sind aktuell
                          {
                              logging( 'Events sind aktuell');
                          }
                          setLogicElementVar($id,1,0);
                          setLogicElementVar($id,3,0);
                          logging( '__________________________________________________Trigger E3 ENDE __________Laufzeit: '.(microtime()-$start).'sec__________________________');
                          setLogicLinkAusgang($id,3,(microtime()-$start));
                          sql_disconnect();
                          return;
                      }
                      
                      /*****************************************************************************************************************************************************
                      
                          Externer Aufrurf des EXEC-Scripts
                      
                              Der EDOMI XML-RPC Server löst das Script beim Empang neuer Events von der Homematic CCU2 aus
                              Es werden die empfangenen Daten von einem File in ein Array geschrieben.
                              Die regiestrierten Homematic LBS Ausgänge werden auch in ein Array geschrieben.
                              Es wird geprüft ob die empfangenen Daten zu einem registrierten Ausgang gehören.
                              Die Treffer werden dann in die entsprechenden LBS Ausgänge geschrieben
                      
                          Homematic Array Aufbau
                              $hm[0][0][0]Interface ID
                                       [1]HM_Addresse
                                       [2]Value_Key
                                       [3]Value
                              $hm[0][1][0]Interface ID
                                       [1]HM_Addresse
                                       [2]Value_Key
                                       [3]Value
                              $hm[0][2] usw.
                              $hm[Master] HOMEMATIC-EDOMI-Master LBS_ID
                      
                          Homematic Array Aufbau
                              $lbs['$id']['$id'][LBS_Ausgang][HM_Addresse][Value_Key] > Der Index ist die ID_Nummer
                              $out[0]['$id'][LBS_Ausgang][HM_Addresse][Value_Key]        > Der Index ist von 0 aufsteigend
                              $out[1]['$id'][LBS_Ausgang][HM_Addresse][Value_Key]
                              $out[2]['$id'][LBS_Ausgang][HM_Addresse][Value_Key]
                      
                      *****************************************************************************************************************************************************/
                      if(getLogicElementVar($id, 1)!=1 && getLogicElementVar($id, 5)!=1)
                      {
                      // Nur bei externem Aufruf (E1=0 und E3=0)
                          logging( '**************************************Trigger -> Externer Aufruf XML-RPC-Server*************************************************************');
                          $hm=File_Get_Array_From_JSON($pfad_hm_data);
                      // Serverlog in Edomilog nachtragen
                          $zeilen=file($pfad_server_debug);
                          foreach ($zeilen as $zeile)
                          {
                              logging( 'Serverlog:'.$zeile);
                          }
                          logging( 'Daten vom Server im JOSON Format:',$hm);
                      // LBS Ausgänge vom Textfile in $lbs schreiben und index neu anordnen
                          $lbs=File_Get_Array_From_JSON($pfad_lbs_data);         // Index enspricht der LBS ID
                          unset($lbs['Master']);                                //LBS Master ID Indexeintrag löschen
                          logging( 'LBS Ausgänge im JOSON Format:',$lbs);
                          $out=null;
                          if (is_array($lbs) || is_object($lbs))
                          {
                              foreach($lbs AS $name)
                              {
                                  $out[]=$name;                                // Index startet von 0
                              }
                              $lbs=$out;
                          }
                          logging( 'LBS Ausgänge im JOSON Format:',$lbs);
                      // Vergleich empangener Events mit den angemeldeten LBS Ausgeängen (treffer werden in $lbs_output gespeichert)
                          $lbs_output=null;
                          for($i=0; $i<count($hm[0]); $i++)                // Events werden nacheinander abgearbeitet
                          {
                              for($i2=0; $i2<count($lbs); $i2++)            // LBS_IDs werden abgearbeitet
                              {
                                  for($i3=0; $i3<count($lbs[$i2]); $i3++)    // LBS Ausgänge werden abgearbeitet
                                  {    
                      #logging( 'Debug:',"if(($hm[0][$i]['params'][1]==$lbs[$i2][$i3][2])&&($hm[0][$i]['params'][2] == $lbs[$i2][$i3][3]))");
                                      if(($hm[0][$i]['params'][1]==$lbs[$i2][$i3][2])&&($hm[0][$i]['params'][2] == $lbs[$i2][$i3][3]))
                                      {    // HM_Addressen und Value_Key von beiden Arrays werden verglichen ob vorhanden
                                          if (is_bool($hm[0][$i]['params'][3]))
                                          {    //Typenänderung bei bool auf int
                                              settype($hm[0][$i]['params'][3],'int');
                                          }
                                          $lbs_output[]=array($lbs[$i2][$i3][0],$lbs[$i2][$i3][1],$hm[0][$i]['params'][3]);    // Das Ausgangsregister wird geschrieben
                                          break;                                                                                // und die Schleife abgebrochen
                                      }
                                  }
                              }
                          }
                      // Ausgabe der Teffer auf die LBS Ausgänge
                          if(is_null($lbs_output)==false)
                          {
                          logging( 'LBS Ausgänge setzen:');
                              for($i=0; $i<count($lbs_output); $i++)
                              {
                                  $lbs_id=$lbs_output[$i][0];
                                  $lbs_out=$lbs_output[$i][1];
                                  $lbs_value=$lbs_output[$i][2];
                                  setLogicLinkAusgang($lbs_id,$lbs_out,$lbs_value);
                                  logging('setLogicLinkAusgang('.$lbs_id.','.$lbs_out.','.$lbs_value.')');
                              }
                          }
                          else
                          {
                              logging( 'Keine empfangenen Events für LBS Ausgänge');
                          }
                      // Zeitstempel für nächsten Aufruf speichern (Berechnung Aktualität der Daten)
                          setLogicElementVar($id,200,$aktuelle_zeit);
                          setLogicElementVar($id,1,0);
                          setLogicElementVar($id,3,0);
                          logging( '__________________________________________________Externer Aufrurf ENDE ___Laufzeit: '.(microtime()-$start).'sec___________________________');
                      }
                      /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Externer Aufrurf ENDE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
                      setLogicLinkAusgang($id,3,(microtime()-$start));
                      sql_disconnect();
                      
                      /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
                      /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXEC LBS ENDE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
                      /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
                      
                      /*****************************************************************************************************************************************************
                      
                          Funktionen:
                          logging(Nachricht,Array)                                    | Edomi Logging
                          File_Put_Array_As_JSON('/Pfad/Datei',Inhalt_Array)          | Schreiben eines Arrays in eine Datei
                          File_Get_Array_From_JSON('/Pfad/Datei')                     | Lesen eines Arrays von einer Datei
                      
                      *****************************************************************************************************************************************************/
                      
                      //Edomi Logging
                      function logging( $msg, $var = NULL)
                      {
                          global $loglevel;
                          global $name_customlog;
                          if ($loglevel > 0)
                          {
                              writeToCustomLog($name_customlog,'debug',$msg);
                              if (isset($var))
                              {
                                  writeToCustomLog($name_customlog,'debug',json_encode($var));
                              }
                          }
                      }
                      //Schreiben eines Arrays in eine Datei
                      function File_Put_Array_As_JSON($FileName, $ar)
                      {
                          return file_put_contents($FileName, json_encode($ar));
                      }
                      //Lesen eines Arrays von einer Datei
                      function File_Get_Array_From_JSON($FileName)
                      {
                          if (! is_file($FileName))
                          {
                              logging( "Fatal: Die Datei $FileName gibt es nicht.");
                              return;
                          }
                          if (! is_readable($FileName))
                          {
                              logging( "Fatal: Die Datei $FileName ist nicht lesbar.");
                              return;
                          }
                          return json_decode(file_get_contents($FileName), true);
                      }
                      
                      ?>
                      ###[/EXEC]###
                      Wenn die Tests bei euch erfolgreich verlaufen sehe ich mir mehrere Instanzen nochmal an.
                      Leider habe ich keine Geräte zum Testen.

                      Mit der Vorlage einer meiner LBSen müstet ihr einen eigenen LBS machen. (wenn ich die Gerätetype kenne, kann ich auch behilflich sein)
                      Ihr müsstet mit dem hier geposteten Master LBS den Port mit eurem LBS testen.

                      Schöne Grüße
                      Gernot

                      Kommentar


                        #56
                        Nanosonde
                        Cool dann kann ich mich einfach zurück lehnen und lass dich mal weiter machen.

                        Bin natürlich jederzeit behilflich.

                        Schöne Grüße
                        Gernot

                        Kommentar


                          #57
                          Hallo Christian und Gernot,
                          DANKE für die suppi schnell Umsetzung!!!
                          Leider kenne ich mich mit dem Umfang der API Umsetzung in einen LBS
                          nicht aus, aber eine Frage:
                          Ist es sehr aufwendig den Rauchmelder und den Heizkörperregler in einen
                          LBS abzubilden?
                          Diese zwei Bauteile hat mein Freund im Einsatz und so könnte ich Ihm
                          (er halt noch Philips HUE) eine EDOMI Visu aufsetzen. Dann hätte er ein Handyapp
                          Für die gesamte Wohnungssteuerung!!
                          Aber bis hierhin: VIELEN DANK!!!
                          Gruß Marcus

                          Kommentar


                            #58
                            Hi tunneltruppe ,

                            eigentlich benötigtst Du nicht zwingend einen speziellen LBS für jeden Homematic-Gerätetyp.
                            Du kannst auch einfach den Homematic bzw. Homematic-IP Universal-LBS nehmen.
                            Dort trägst Du dann nur die IP-Adresse der CCU2(E2), die Geräteadresse(E4), den Kanal(E6) und schließlich den gewünschten Parameter(E7) ein, den Du angezeigt bzw. ändern möchtest.

                            Ich empfehle Dir, das XML-API-Addon auf der CCU2 zu installieren.
                            Dort rufst Du dann die Funktion "statelist.cgi" auf.

                            Für einen Homematic-IP Rauchwarnmelder sieht das dann so aus:

                            HTML-Code:
                            <device name="HmIP-SWSD 000A570XXXXXXX" ise_id="2332" unreach="false" config_pending="false">
                            <channel name="HmIP-SWSD 000A570XXXXXXX:0" ise_id="2333" visible="true" operate="true">
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.CONFIG_PENDING" type="CONFIG_PENDING" ise_id="2334" value="false" valuetype="2" valueunit="" timestamp="0" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.DUTY_CYCLE" type="DUTY_CYCLE" ise_id="2338" value="false" valuetype="2" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.LOW_BAT" type="LOW_BAT" ise_id="2339" value="false" valuetype="2" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.RSSI_DEVICE" type="RSSI_DEVICE" ise_id="2343" value="181" valuetype="8" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.RSSI_PEER" type="RSSI_PEER" ise_id="2344" value="0" valuetype="8" valueunit="" timestamp="0" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.TIME_OF_OPERATION" type="TIME_OF_OPERATION" ise_id="2345" value="192" valuetype="8" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.UNREACH" type="UNREACH" ise_id="2346" value="false" valuetype="2" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:0.UPDATE_PENDING" type="UPDATE_PENDING" ise_id="2350" value="false" valuetype="2" valueunit="" timestamp="0" operations="5"/>
                            </channel>
                            <channel name="HmIP-SWSD 000A570XXXXXXX:1" ise_id="2354" visible="true" operate="true">
                            <datapoint name="HmIP-RF.000A570XXXXXXX:1.ERROR_CODE" type="ERROR_CODE" ise_id="2355" value="0" valuetype="16" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:1.SMOKE_DETECTOR_ALARM_STATUS" type="SMOKE_DETECTOR_ALARM_STATUS" ise_id="2356" value="0" valuetype="16" valueunit="" timestamp="1515128256" operations="5"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:1.SMOKE_DETECTOR_COMMAND" type="SMOKE_DETECTOR_COMMAND" ise_id="2357" value="" valuetype="16" valueunit="" timestamp="0" operations="2"/>
                            <datapoint name="HmIP-RF.000A570XXXXXXX:1.SMOKE_DETECTOR_TEST_RESULT" type="SMOKE_DETECTOR_TEST_RESULT" ise_id="2358" value="0" valuetype="16" valueunit="" timestamp="1515128256" operations="5"/>
                            </channel>
                            </device>
                            Kanal 0 wird immer für Verwaltungszwecke benutzt (LOWBAT, UNREACH, CONFIG_PENDING).
                            Von Interesse ist hier z.B. auf Kanal 1 der Parameter SMOKE_DETECTOR_ALARM_STATUS. Den trägst Du nun am Eingang E7 des Universal LBS ein.
                            Die Adresse ist der HEX-String, den ich ge'X't habe.

                            Für Homematic IP empfehle ich auch die technische Dokumentation des Herstellers.
                            Für normale Homematic Geräte kann das hier hilfreich sein. Oder auch hier die technische Dokumentation des Herstellers.

                            Unbenannt2.PNG
                            Zuletzt geändert von Nanosonde; 05.01.2018, 10:22.

                            Kommentar


                              #59
                              Achso, noch ein kleiner Wunsch von mir.
                              Wenn der eine oder andere jetzt einen "speziellen" LBS schreibt, der direkt alle Datenpunkte eines Gerätetyps abbildet, so möchte hier darum bitten, dass auch mind. die Verwaltungsfunktionen (wenn vorhanden!) LOWBAT, UNREACH, STICKY_UNREACH, DUTY_CYCLE, etc. mit als Ausgang zur Verfügung gestellt werden. So kann man dann nämlich komfortabel eine Logik bauen, die einen benachrichtigt, falls mal die Batterie leer ist o.ä..

                              Kommentar


                                #60
                                Hallo Christian,
                                DANKE für die Erklärung!!!
                                Hatte ich mir so auch gedacht, aber Deine "Erläuterung" bringt mich weiter.
                                Ich habe zwar als Leihgabe nur eine Homematic-IP Gateway, aber hab mir mal eine
                                CCU2 gekauft um Dein Beispiel auszuprobieren!!
                                Ein Rauchmelder ist auch bestellt, so kann ich mal übern!!! Wenn das alles läuft teste
                                ich den Heizkörperregler!!!
                                Ich melde mich bestimmt mit Fragen oder Beispielen, wenn es läuft…
                                DANKE DIR!!!
                                Gruß Marcus

                                Kommentar

                                Lädt...
                                X