Wenn keiner schneller ist, poste ich den morgen.
Ankündigung
Einklappen
Keine Ankündigung bisher.
LBS 19001435 / 19001436 Homematic / Homematic IP Einbindung
Einklappen
X
-
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]###Angehängte Dateien
- Likes 1
Kommentar
-
Zitat von PaWi Beitrag anzeigenHallo
Funktionieren diese LBS auch noch mit einer CCU3 Zentrale?
Gruss
Patrick
Kommentar
-
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
-
Zitat von mac29 Beitrag anzeigenDoch 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.....
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 anzeigenEs 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.
Kommentar
Kommentar