Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 19001435 / 19001436 Homematic / Homematic IP Einbindung

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

    #91
    Wenn keiner schneller ist, poste ich den morgen.
    Mfg Micha
    Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

    Kommentar


      #92
      Das wäre sehr nett von Dir

      Vielen Dank
      Grüße
      Matthias

      ​​​​​​

      Kommentar


        #93
        Sorry aber gestern ist es halt nichts geworden.....


        19001435:
        PHP-Code:
        ###[DEF]###
        [name        = Homematic Event Receiver v0.1]

        [e#1        = Start/Stop #init=1]
        [e#2        = Loglevel #init=8]
        [e#3        = IP address CCU2 #init=192.168.10.12]

        [a#1        = Msg Queue ID]

        [v#1        = 0    ]                 // start daemon only once
        [v#2        = 0 ]                  // Message Queue ID

        [v#100        = 0.1 ]                  // Version
        [v#101        = 19001435 ]          // LBS No.
        [v#102        = HM Event Receiver ] // LBS Name
        [v#103        = 0 ]                  // Log Level
        [v#104        = 0 ]                  // One logfile per instance
        [v#105        = 1 ]                  // log ID in each line

        ###[/DEF]###

        ###[HELP]###
        Homematic Event Receiver
        ========================
        This LBS is used to realize Homematic event reception from a connected CCU2 (or derivates like OCCU or Rasperrymatic). 
        The LBS provides an XMLRPC server which is registered to the CCU2 and enables to reception of XMLRPC calls from the CCU2 interface daemons.
        Currently it supports Homematic BidCos-RF and Homematic IP devices.

        Requirements:
        * php-process, php-xmlrpc (yum install php-process php-xmlrpc) (PHP will be upgraded from 5.3.3-48.e16_8 to 5.3.3-49.el6)
        * attached file homematic.class.php has to be copied to /usr/local/edomi/main/include/php

        Notes:
        The EXEC part of this LBS is split into two main parts: the XMLRPC server script and the actual LBS EXEC daemon script.
        If the script EXE190014135.php is called externally via HTTP request, the XMLRPC server script is executed.
        Otherwise the LBS EXEC daemon part is executed, when it is started by Edomi. 

        The XMLRPC server script creates a debug log under /data/log/hm_xmlrpcsrv_debug which shows the result of the last script run.

        Technically this LBS instance sets the outputs of the registered Homematic device LBS instances instead of the Homematic device LBS instances themselves.
        By doing this one communication back from the event receiver LBS to the device LBS is skipped. 
        It is realized by sending the device LBS instance ID to the event receiver LBS for later usage.

        E1: Start/stop this LBS
        E2: Enable Logging (0-none|1-emerg|2-alert|3-crit|4-err|5-warning|6-notice|7-info|8-debug)
        E3: IP address of CCU2 to connect to 

        A1: Message Queue ID

        V1: Indicator whether daemon is running
        V2: Message Queue ID

        V100: Version
        V101: LBS Number
        V102: Log file name
        V103: Log level
        V104: One log file per LBS instance
        V105: log ID in each log entry

        Changelog:
        ==========
        v0.1: Initial version

        ###[/HELP]###

        ###[LBS]###
        <?
        function LB_LBSID_logging($id, $msg, $var = NULL, $priority = 8)
        {
            $E = getLogicEingangDataAll($id);
            $logLevel = getLogicElementVar($id, 103);
            if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
                $logLevelNames = array(
                    'none',
                    'emerg',
                    'alert',
                    'crit',
                    'err',
                    'warning',
                    'notice',
                    'info',
                    'debug'
                );
                $version = getLogicElementVar($id, 100);
                $lbsNo = getLogicElementVar($id, 101);
                $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo";
                $logName = preg_replace('/ /', '_', $logName);
                if (logic_getVar($id, 104))
                    $logName .= "-$id";
                if (logic_getVar($id, 105) == 1)
                    $msg .= " ($id)";
                strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
                writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
                if (isset($var)) {
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var));
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT  END  ================");
                }
            }
        }

        function LB_LBSID($id) {
            if ($E = logic_getInputs($id)) {
                setLogicElementVar($id, 103, $E[2]['value']); // set loglevel to #VAR 103
                LB_LBSID_logging($id, 'LBS Homematic Event Receiver started');
                $msg = array();
                if ($E[1]['refresh'] == 1) {
                    if ($E[1]['value'] == 1) { // if LBS is activated
                        if (logic_getVar($id, 1) == 0) {
                            logic_setVar($id, 1, 1);
                            mt_srand();
                            $msgQueueId = mt_rand();
                            LB_LBSID_logging($id, "MSGQID generated: $msgQueueId");
                            logic_setVar($id, 2, $msgQueueId);
                            logic_callExec(LBSID, $id);
                        }
                        $msg['start'] = 1;
                    } elseif ($E[1]['value'] == 0) {
                       $msg['stop'] = 1;
                    }
                }
                
                // send message to EXEC daemon
                if (count($msg)) {
                    LB_LBSID_logging($id, "Message:", $msg);
                    $msg_queue_id = logic_getVar($id, 2);
                    LB_LBSID_logging($id, "MSGQID used: $msg_queue_id");
                    $msg_queue = msg_get_queue($msg_queue_id);
                    msg_send($msg_queue, $msg_queue_id, $msg);
                }
                
                LB_LBSID_logging($id, 'LBS Homematic Event Receiver ended');
            }
        }

        ?>
        ###[/LBS]###

        ###[EXEC]###
        <?

        // Detect if need to run the XMLRPC server script or the LBS daemon script
        if (array_key_exists("REQUEST_METHOD", $_SERVER))
        {

        /**********************************************************************
         *     START of XMLRPC server script 
         **********************************************************************/

        $path_server_debug = dirname(__FILE__)."/../../log/hm_xmlrpcsrv_debug.log";

        function var_dump_file($var)
        {
            global $path_server_debug;
            ob_flush();
            ob_start();
            var_dump($var);
            file_put_contents($path_server_debug, ob_get_contents(), FILE_APPEND);
            ob_end_clean();
        }

        function debug($variable, $output_json=false)
        {
            global $path_server_debug;

            if($output_json==true)
                $out=json_encode($variable);
            else 
                $out=$variable;
            
            $handle = fopen ($path_server_debug, 'a');
            fwrite ($handle, $out."\n");
            fclose ($handle);
            
            return;
        }

        function event($interface_id, $address, $value_key, $value)
        {
            debug('event('.$interface_id.', '.$address.', '.$value_key.', '.$value.')');

            $tmp_split = explode('-', $interface_id);
            $prefix = $tmp_split[0];
            $msg_queue_id = $tmp_split[1];
            if (msg_queue_exists($msg_queue_id)) {
                $q=msg_get_queue($msg_queue_id);
                $msg['event'] = array(
                            'interface_id_prefix' => $prefix,
                            'address' => $address,
                            'param'   => $value_key,
                            'value'   => $value
                        );
                if (!msg_send($q, $msg_queue_id, $msg, true, false, $msgerr)) {
                debug('Msg not sent to message queue. Error: '.$msgerr);
                    }
            }
            return null;
        }

        function rpc_event($method_name, $params)
        {
            debug('RPC method event()');
            var_dump_file($params);

            return call_user_func_array($method_name, $params);
        }

        function rpc_system_multicall($method_name_system_multicall, $params)
        {
            debug('RPC method system.multicall()');
            $params=$params[0];
            var_dump_file($params);

            $result=array();
            foreach($params as $index => $value) {
                $method = $value['methodName'];
                $methodparams = $value['params'];
                $result[] = call_user_func_array($method, $methodparams);
            }

            return $result;
        }

        function rpc_unused($method_name, $params) 
        {
            switch ($method_name)
            {
                case "listDevices":
                    $result=array();
                    break;
                case "newDevices":
                    $result=null;
                    break;
                case "deleteDevices":
                    $result=null;
                    break;
                case "updateDevice":
                    $result=null;
                    break;
                case "replaceDevice":
                    $result=null;
                    break;
                case "readdedDevice":
                    $result=null;
                    break;
                default:
                    $result=array();
                    for($i=0; $i<count($params[0]); $i++)
                    {
                        $result[]=null;
                    }
            }
        return $result;
        }

        // Clear server debug log
        $handle = fopen ($path_server_debug, 'w');
        fwrite ($handle,'');
        fclose ($handle);

        debug('>>XMLRPC server script START<<');

        //var_dump_file($_ENV);
        var_dump_file($_SERVER);

        // Read input stream (HTTP request from CCU2)
        $request_xml = file_get_contents("php://input");
        debug('>>REQUEST<< :'.$request_xml, true);

        // Create XMLRPC server object
        $xmlrpc_server = xmlrpc_server_create();

        // Register local methods for XMLRPC interface
        xmlrpc_server_register_method($xmlrpc_server, "event", "rpc_event");
        xmlrpc_server_register_method($xmlrpc_server, "listDevices", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "newDevices", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "deleteDevices", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "updateDevice", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "replaceDevice", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "readdedDevice", "rpc_unused");

        xmlrpc_server_register_method($xmlrpc_server, "system.multicall", "rpc_system_multicall");
        xmlrpc_server_register_method($xmlrpc_server, "system.listMethods", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "system.methodHelp", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "system.methodSignature", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "system.describeMethods", "rpc_unused");
        xmlrpc_server_register_method($xmlrpc_server, "system.getCapabilities", "rpc_unused");

        // Prepare response for CCU2 XMLRPC client
        $response=xmlrpc_server_call_method($xmlrpc_server, $request_xml, null);
        $size=count($response);

        // Output HTTP Header for response
        header('Content-type: text/xml');
        header("Content-length: $size");
        echo $response;

        debug('>>Response<< :'.$response, true);

        // Remove XMLRPC server object
        xmlrpc_server_destroy($xmlrpc_server);
        debug('>>XMLRPC server script END<<');

        /**********************************************************************
         *     END of XMLRPC server script 
         **********************************************************************/
         
        }
        else // if (array_key_exists("REQUEST_METHOD", $_SERVER))
        {
         
        /**********************************************************************
         *     START of EDOMI LBS daemon script
         **********************************************************************/

        function logging($id, $msg, $var = NULL, $priority = 8)
        {
            $E = getLogicEingangDataAll($id);
            $logLevel = getLogicElementVar($id, 103);
            if (is_int($priority) && $priority <= $logLevel && $priority > 0) {
                $logLevelNames = array(
                    'none',
                    'emerg',
                    'alert',
                    'crit',
                    'err',
                    'warning',
                    'notice',
                    'info',
                    'debug'
                );
                $version = getLogicElementVar($id, 100);
                $lbsNo = getLogicElementVar($id, 101);
                $logName = getLogicElementVar($id, 102) . "-LBS$lbsNo";
                $logName = preg_replace('/ /', '_', $logName);
                if (logic_getVar($id, 104))
                    $logName .= "-$id";
                if (logic_getVar($id, 105) == 1)
                    $msg .= " ($id)";
                strpos($_SERVER['SCRIPT_NAME'], $lbsNo) ? $scriptname = 'EXE' . $lbsNo : $scriptname = 'LBS' . $lbsNo;
                writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . $msg);
                if (isset($var)) {
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT START ================");
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t" . json_encode($var));
                    writeToCustomLog($logName, str_pad($logLevelNames[$logLevel], 7), $scriptname . " [v$version]:\t================ ARRAY/OBJECT  END  ================");
                }
            }
        }

        function bool2int($var)
        {
            if (is_bool($var)) {    
                settype($var,'int');
                return $var;
            }
            else {
                return $var;
            }
        }

        //
        // error_off() : switch off error reporting
        // error_on() : switch on error reporting
        //
        function myErrorHandler($errno, $errstr, $errfile, $errline)
        {
            global $id;
            logging($id, "File: $errfile | Error: $errno | Line: $errline | $errstr ");
        }

        function error_off()
        {
            $error_handler = set_error_handler("myErrorHandler");
            error_reporting(0);
        }

        function error_on()
        {
            restore_error_handler();
            error_reporting(E_ALL);
        }

        include dirname(__FILE__)."/../../../../main/include/php/homematic.class.php";
        require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");

        set_time_limit(0);
        sql_connect();

        // -------------------------------
        // Daemon was started
        // -------------------------------

        error_off();

        $lbs_register=array();

        $msgQID = logic_getVar($id, 2);
        logging($id, "MSGQID: $msgQID");
        $msg_queue = msg_get_queue($msgQID);

        $path_xmlrpcsrv='/data/liveproject/lbs/EXE19001435.php'; //'/admin/lbs/homematic/hm_xmlrpcsrv.php';

        if ($E = logic_getInputs($id)) {
            
            $ip=$E[3]['value'];
            $hm_api=new HomeMaticUpnpDevice($ip.':2001');
            $hmip_api=new HomeMaticUpnpDevice($ip.':2010');
            
            while (getSysInfo(1) >= 1) { // Main loop (exits if EDOMI is shut down or restarted)

                $result = msg_receive($msg_queue, $msgQID, $msgtype, 32768, $msg, true, MSG_IPC_NOWAIT, $msg_error); // non blocking            
                if ($result) {
                    foreach ($msg as $cmd => $value) {
                        logging($id, "Command received by daemon: $cmd");
                        switch ($cmd) {
                            case 'start':
                                logging($id, "Starting Homematic Event Receiver daemon", null, 7);
                                logic_setOutput($id, 1, $msgQID);
                                $hm_api->HM_init (global_serverIP.$path_xmlrpcsrv, '' );
                                $hm_api->HM_init (global_serverIP.$path_xmlrpcsrv, 'edomi_hm-'.$msgQID );
                                $hmip_api->HM_init (global_serverIP.$path_xmlrpcsrv, '' );
                                $hmip_api->HM_init (global_serverIP.$path_xmlrpcsrv, 'edomi_hmip-'.$msgQID );
                                logging($id, "XMLRPC server URL: ".global_serverIP.$path_xmlrpcsrv);
                                break;
                            case 'stop':
                                logging($id, "Stopping Homematic Event Receiver daemon", null, 7);
                                $hm_api->HM_init (global_serverIP.$path_xmlrpcsrv, '' );
                                $hmip_api->HM_init (global_serverIP.$path_xmlrpcsrv, '' );
                                logic_setVar($id, 1, 0);
                                logic_setOutput($id, 1, '');
                                $lbs_register=array();
                                break 3;
                            case 'event':
                                logging($id, "Event received:", $value);
                                $hmdev_system = $value['interface_id_prefix'];
                                $hmdev_address = $value['address'];
                                $hmdev_param = $value['param'];
                                if (array_key_exists($hmdev_system, $lbs_register)) {
                                    if (array_key_exists($hmdev_address, $lbs_register[$hmdev_system])) {
                                        if (array_key_exists($hmdev_param, $lbs_register[$hmdev_system][$hmdev_address])) {
                                            $lbsid  = $lbs_register[$hmdev_system][$hmdev_address][$hmdev_param]['lbsid'];
                                            $output = $lbs_register[$hmdev_system][$hmdev_address][$hmdev_param]['output'];
                                            $value  = bool2int($value['value']);
                                            logic_setOutput($lbsid, $output, $value);
                                        }
                                    }
                                }
                                break;
                            case 'register':
                                logging($id, "HM Device LBS register:", $value, 7);
                                $hmdev_system=$value['system'];
                                $hmdev_lbsid=$value['lbsid'];
                                $hmdev_params=$value['outparams'];
                                foreach($hmdev_params as $chan_paramname => $output) {
                                    $tmp_split = explode('.', $chan_paramname);
                                    $hmdev_channel = $tmp_split[0];
                                    $hmdev_param = $tmp_split[1];
                                    $hmdev_address=$value['address'].':'.$hmdev_channel;
                                    $lbs_register[$hmdev_system][$hmdev_address][$hmdev_param] = array('lbsid' => $hmdev_lbsid, 'output' => $output);
                                }
                                logging($id, "Currently known Homematic LBS:", $lbs_register);
                                break;
                            case 'unregister':
                                logging($id, "HM Device LBS unregister:", $value, 7);
                                $hmdev_system=$value['system'];
                                $hmdev_lbsid=$value['lbsid'];
                                $hmdev_params=$value['outparams'];
                                foreach($hmdev_params as $chan_paramname => $output) {
                                    $tmp_split = explode('.', $chan_paramname);
                                    $hmdev_channel = $tmp_split[0];
                                    $hmdev_param = $tmp_split[1];
                                    $hmdev_address=$value['address'].':'.$hmdev_channel;
                                    unset($lbs_register[$hmdev_system][$hmdev_address][$hmdev_param]);
                                }
                                logging($id, "Currently known Homematic LBS:", $lbs_register);
                                break;
                        }
                    }                
                }
                
                // give back some CPU time if there is nothing to do
                $mqst = msg_stat_queue($msg_queue);
                if ($mqst['msg_qnum'] == 0)
                    usleep(10 * 1000);
                
            } // end of check for EDOMI shutdown
        }

        logging($id, "Homematic Event Receiver daemon stopped", null, 7);
        msg_remove_queue($msg_queue);

        error_on();

        sql_disconnect();

        /**********************************************************************
         *     END of EDOMI LBS daemon script
         **********************************************************************/

         } // Final closing curly brace of 
           // if (array_key_exists("REQUEST_METHOD", $_SERVER)) ... else ...
         
        ?>
        ###[/EXEC]###
        Und im Anhang die benötigte homematic Klasse.
        Angehängte Dateien
        Mfg Micha
        Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

        Kommentar


          #94
          Vielen Dank ... heute gleich mal antesten...
          Grüße
          Matthias

          ​​​​​​

          Kommentar


            #95
            Hallo

            Funktionieren diese LBS auch noch mit einer CCU3 Zentrale?

            Gruss
            Patrick

            Kommentar


              #96
              Hallo,

              (Editiert, nach dem Post)

              -- Habe den Konfigurations-Fehler selbst gefunden.

              Danke für das LBS - Hilft mir ungemein
              daniel42
              Forums-Einsteiger
              Zuletzt geändert von daniel42; 23.05.2020, 17:11. Grund: Problem selbst gelöst

              Kommentar


                #97
                Zitat von PaWi Beitrag anzeigen
                Hallo

                Funktionieren diese LBS auch noch mit einer CCU3 Zentrale?

                Gruss
                Patrick
                Ja, der Baustein funktioniert bei mir auf einer CCU3 / Raspberrymatic ohne Probleme.

                Kommentar


                  #98
                  Hallo Zusammen

                  Ich habe mir nun auch eine CCU3 zugelegt und würde diese gerne an Edomi anbinden.
                  Im Moment habe ich nur einen Fensterkontakt, kann diesen aber nicht in Edomi einbinden,
                  da er mir immer eine Fehlermeldung gibt, sobald ich eine 1 auf E10 (LBS Homematic Generic Device)
                  oder eine 1 auf E6 (LBS HM-Sec-RHS Fensterkontakt) setze.

                  Als Device Adress habe ich HM:SecSCGEQ0084954 (auch HMIP:SecSCGEQ0084954 versucht) eingegeben, dies sollte doch stimmen und dann über den Kanal 1
                  den Status abfragen mit 1:STATE.

                  Kann mir da jemand weiterhelfen?
                  fehler.png homematic.png logik.png

                  Kommentar


                    #99
                    Fehler gefunden, Device war falsch eingegeben, es war nur "HM:GEQ0084954" notwendig, vielleicht hilft dies mal jemand.....

                    Kommentar


                      Doch noch eine Frage:
                      Laufen diese beiden LBS auch unter CentOS 7? Hat dies jemand bereits getestet?
                      Ich benutze im Momnet noch 6.5, aber ein Wechsel steht im Raum.....

                      Kommentar


                        Zitat von mac29 Beitrag anzeigen
                        Doch noch eine Frage:
                        Laufen diese beiden LBS auch unter CentOS 7? Hat dies jemand bereits getestet?
                        Ich benutze im Momnet noch 6.5, aber ein Wechsel steht im Raum.....
                        Hallo zusammen,

                        ich möchte nochmal auf die Frage bzgl. CentOS 7 zurückkommen. Ich bin gerade dabei, mein System umzustellen. Es funktioniert alles soweit, außer der HM Event Receiver LBS (19001435). Zwar kann ich über den HM Generic Device LBS (19001436) die Homematic Geräte schalten und auch abfragen, allerdings funktionieren die Statusänderungen durch den Event Receiver nicht mehr.

                        Hat eventuell jemand eine Idee oder schon Lösung? Mit meinen begrenzten PHP Kenntnissen komme ich da nicht weiter


                        EDIT: Hat sich erledigt, hab alle Pakete aktualisiert, nun läuft alles. Kann also bestätigen, dass die LBS (jedenfalls mit meinen HM/HMIP Komponenten) mit CentOS7 funktionieren.

                        Zuletzt geändert von benniey; 07.09.2020, 16:28.

                        Kommentar


                          Zitat von Nanosonde Beitrag anzeigen
                          Es gibt aber etwas Neues: https://github.com/hobbyquaker/RedMatic

                          Node-Red direkt auf einer CCU3 oder RaspberryMatic als Addon Software.

                          Einfach installieren und danach noch unter "Manage palette" den Node "node-red-contrib-knxjs" hinzufügen.
                          Dann hat man die KNX-Anbindung direkt auf der CCU3 mit Hilfe von Node-Red.

                          So kann man dann sehr einfach die Homematic-Datenpunkte auf den KNX schreiben lassen und umgekehrt.
                          works like a charm - danke für diesen supertipp!!!

                          Kommentar


                            Kann nun auch bestätigen: LBS laufen auf CentOS 7.6, verwendet wird die CCU3.

                            Kommentar


                              Ich musste beim der CCU3 in der Firewall Konfiguration "Homematic XML-RPC API" auf "Eingeschränkt" setzten damit die Daten ankamen.... Nur falls jemand auch mal sucht.

                              Kommentar


                                Hallo,

                                ich habe das Problem, das beim importieren der Logik der Import abstürzt. Es sind nur noch die sich bewegenden zwei Halbkreise zu sehen und es passiert nichts mehr.
                                Version 2.03

                                Kommentar

                                Lädt...
                                X