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

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

    Einen Kommentar schreiben:


  • vbernd
    antwortet
    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!!!

    Einen Kommentar schreiben:


  • benniey
    antwortet
    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.

    Einen Kommentar schreiben:


  • mac29
    antwortet
    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.....

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • mac29
    antwortet
    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

    Einen Kommentar schreiben:


  • daniel42
    antwortet
    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.

    Einen Kommentar schreiben:


  • daniel42
    antwortet
    Hallo,

    (Editiert, nach dem Post)

    -- Habe den Konfigurations-Fehler selbst gefunden.

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

    Einen Kommentar schreiben:


  • PaWi
    antwortet
    Hallo

    Funktionieren diese LBS auch noch mit einer CCU3 Zentrale?

    Gruss
    Patrick

    Einen Kommentar schreiben:


  • messen1980
    antwortet
    Vielen Dank ... heute gleich mal antesten...

    Einen Kommentar schreiben:


  • vento66
    antwortet
    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

    Einen Kommentar schreiben:


  • messen1980
    antwortet
    Das wäre sehr nett von Dir

    Vielen Dank

    Einen Kommentar schreiben:


  • vento66
    antwortet
    Wenn keiner schneller ist, poste ich den morgen.

    Einen Kommentar schreiben:


  • messen1980
    antwortet
    Würde gerne den Baustein 19001295 (Homematic Fensterkontakte) nutzen, dieser setzt aber den
    LBS 19001435 Homematic Event Receiver voraus.
    Finde diesen im DL Bereich leider nicht...

    Hat hier jemand ne Info für mich, kann mir den LBS jemand zur Verfügung stellen?!

    Vielen Dank

    Einen Kommentar schreiben:


  • Nanosonde
    antwortet
    Zitat von trollmar Beitrag anzeigen
    Hi Nanosonde .
    Danke fürs teilen.

    Is das von dir ?


    Ist es mit redmatic möglich
    Homematic Stellantriebe direkt anzusprechen bei Raumtemperatur über knx ?
    Nein, ist nicht von mir.
    Ich bin immer wieder erstaunt, wieviel Zeit manche Leute so haben.

    Zu den Stellantrieben kann ich leider nichts sagen. Frage doch mal bei hobbyquaker nach.
    Oder mach ein Issue auf.

    Einen Kommentar schreiben:

Lädt...
X