Aahhh, ganz nah dran…
Was hast Du als zweite Sendeinstanz hinterlegt, ich glaube das ist der Knackpunkt.
Gruß, Fred
Aahhh, ganz nah dran…
Was hast Du als zweite Sendeinstanz hinterlegt, ich glaube das ist der Knackpunkt.
Gruß, Fred
Die zweite Sende-Instanz ist das neu angelegte Shutter-Modul selber.
Denn nur so hast du Zugriff auf deine Variablen(„Moving“, …).
z.B
$running = CreateVariableByName($SC_INSTANCE2, "Moving", 0);
$value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE2, "StatusVariable"));
// Funk-ID aus Variable holen
$funk_ID = GetValue(IPS_GetVariableIDByName("Funk_ID", $SC_INSTANCE2));
Hoffe ich konnte dir helfen.
lg
Marco
Ich habe es noch nicht ganz verinnerlicht, wo ist der Verweis/Verknüpfung auf die Aktoradresse (in diesem Fall A12) ?
Die momentane Struktur habe ich mal angehängt, auch die Fehlermeldung beim Einmessen.
Habe ich eigentlich Deinen Teil für den ShutterControl richtig in das Script eingebaut (siehe weiter oben im Topic) ?
Wir nähern und der Lösung immer mehr, viel kann ich nicht mehr falsch gemacht haben…
Gruß,
Fred
Ja da fehlen dir wohl noch ein paar Essentielle Dinge.
Ich hab es für mich so gelöst, daß ich die meisten Instanz ID’s in einem globalen Script definiere. Darum fasst überall Konstanten.
Ausserdem schalte ich die Lightmanager nach getaner Arbeit wieder ab, bzw. morgens wieder ein. Darum das Script. Wenn du das nicht brauchst kannst du es vorerst auskommentieren.
Was noch wichtig ist, ist die funk_ID deines Rollladen Aktors.
Diese muss unter der Shutter-Instanz liegen.
Ah, ich sehe gerade die Frage nach der Aktor Adresse. Siehe eine Zeile darüber.
Hier die Übersetzung dazu:
SET_HID_STATUS = angehängtes Script zum Suchen und Öffnen einer HID
JB_LIGHTMANAGER = Instanz ID des Lightmanagers
define („JB_LIGHTMANAGER_VENDORID“, 5824);
define („JB_LIGHTMANAGER_PRODUCTID“, 2610);
Open_HID.txt (1.74 KB)
welche Jalousien Aktoren benutzt du?
Und weißt du auch wie die Steuerbefehle aussehen?
Ich nutze im Erdgeschoss noch die Düwi 5247 für die Rolläden.
Als Steuerbefehle kenne ich die vier aus der SC-Doku.
Zum Testen habe ich mal ein Script wie folgt verwendet:
<?php
$status = 10036 /*[JB Lightmanager\Rolladen\Kamin links (Shutter Control Aktor A12)]*/;
SC_Move($status, 50);
?>
wobei $status die ID der SC-Instanz ist.
Wobei ich es noch immer nicht verstanden habe, wie die Aktor-ID hinterlegt werden kann.
Gruß,
Fred
Wie schon beschrieben brauchst du eine Adresse (Funk) die du steuern willst.
Nachdem über die Shutter-Instanz keine Adresse abrufbar ist, musst du dich selbst darum kümmern.
Bei mir heißt diese Funk_id und liegt immer unter der jeweiligen Shutter-Instanz. Siehe Seite 3 ganz unten.
So hole ich die dann auch im eigentlichen Shutter-Script ab.
$funk_ID = GetValue(IPS_GetVariableIDByName("Funk_ID", $SC_INSTANCE2));
Hier baue ich die Adresse und den Steuerbefehl zusammen:
Wie du siehst benutze ich hier die funk_ID die ich zuvor abgeholt habe.
HID_SendEvent($SC_INSTANCE,0,chr(0x15).chr($funk_ID).chr(0x74).chr(0x02).chr(0x00).chr(0x00).chr(0x00).chr(0x00));
Im Endeffekt mache ich nichts anderes als das ich einen Sequenz über den Lightmanager sende der eine Adresse und einen Aktion beinhaltet.
Als Steuerbefehl meinte ich eher die des Aktors.
lg
Marco
Ich sehe, Du hast als String „0x00“ hinterlegt in der Funk-ID.
Ist das also die umgerechnete Aktorenadresse ?
Wenn ja, gibt es sicher ein HIlfsprogramm oder eine Anleitung mit der man diese Umwandlungen machen kann ?
siehe hier:
http://www.ip-symcon.de/forum/f67/jbmedia-lightmanager-steuerung-kommandozeile-12308/#post110703
Angelernte Aktoren werden der Reihenfolge nach vergeben.
Funk_ID:
Aktor 1 = 0x00
Aktor 2 = 0x01
Aktor 3 = 0x02
usw.
Marco
Ich habe den Code von macgyver auf die Nutzung meiner LightManager-Klasse umgestrickt, die Adresse (Funk-ID) des Rollladens ist dabei im Klartext (etwa 1, 2 oder 3…) in der Variable „Kanal“ zu hinterlegen:
case "{E6D7692A-7F4C-441D-827B-64062CFE1C02}": //Light-Manager Pro
$running = CreateVariableByName($SC_INSTANCE2, "Moving", 0);
$value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE2, "StatusVariable"));
$shutterID = GetValue(IPS_GetVariableIDByName("Kanal", $SC_INSTANCE2));
switch($SC_DIRECTION)
{
case SC_DIRECTION_STOP:
if(GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
break;
case SC_DIRECTION_UP:
if(!GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_UP);
SetValue($running, true);
}
if($SC_DURATION > 0)
{
IPS_Sleep($SC_DURATION);
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
else
SetValue($running, false);
break;
case SC_DIRECTION_DOWN:
if(!GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_DOWN);
SetValue($running, true);
}
if($SC_DURATION > 0)
{
IPS_Sleep($SC_DURATION);
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
else
SetValue($running, false);
break;
}
break;
Ansonsten lässt sich die Adresse auch mit folgendem Codeschnipsel „umrechnen“ (aus $actor = 1 wird dann $address = 0x00 usw.):
$address = dechex(intval($actor) - 1);
Ah, sehr interessant !
KannSt Du bitte mal über das Shuttercontrol script schauen, das ich weiter oben gepostet haben und kurz bewerten, ob ich dein Teil von macgyver richtig eingebaut habe, dann kann ich Deinen Teil auch noch übernehmen.
Danke
Dein Skript sieht soweit korrekt aus :). Funktioniert es denn auch mittlerweile?
Mein „umgestrickter“ Code ersetzt den von macgyver - du solltest diesen nicht zusätzlich einfügen, sondern alternativ. In jenem Falle ist der Anfang des ShutterControl-Skriptes noch wie folgt zu modifizieren:
<?php
include('LightManager.ips.php');
ini_set('max_execution_time', 60);
Hallo,
komme leider erst jetzt wieder dazu, mich mit dem Thema zu beschäftigen.
Ich poste dann die Ergebnisse.
Grüße,
Fred
Hallo iP-Symcon Gemeinde,
Habe seit ca. 1Monat Symcon und Plugwise und HomeMatic
laufen ( Dank an die User ).
Wollte wie hier beschrieben auch den LightManager Pro einbinden, ohne Erfolg:o.
Wenn ich einen Befehl abschicke leuchtet die Led rot ( an LM-Hardware ) kurz auf.
Es tut sich aber nichts!
So und nun möchte ich bei dem Programm LightManager die Kommunikation mitlesen.
Wie geht das?
Hatte im Forum auch bei der direkten Steuerung von Plugwise ohne Server folgendes gelesen:
• serielle Verbindung aufgebaut
• RegVar angelegt
Habe eine Instanz SerialPort eingerichtet.
Bei mir ist nur der COM3 Port vorhanden.
Der Port kann nicht geöffnet werden?!
Was mach ich falsch?
Da ich ein Neuling bei Symcon bin, bitte ich um eine einfache ( Schritt für Schritt ) Erklärung.
Danke:)
Aktor
<?
include('LightManager.ips.php');
$mode = GetValueBoolean(13970 /*[LightManager Pro\AktorSchalten\Status]*/) ? LightManager::INTERTECHNO_OFF : LightManager::INTERTECHNO_ON;
LightManager::InterTechno_SwitchMode('A7', $mode, 13970 /*[LightManager Pro\AktorSchalten\Status]*/, true);
?>
LightManager
<?
/**
* Klasse zur Ansteuerung des jbmedia Light-Manager Pro per HID-Instanz
* Beinhaltet aus Gründen der IPS-Konformität und Wumpus-Widmung ausschließlich statische Methoden
* Unterstützte Systeme: InterTechno, Uniroll, FS20 (rudimentär)
*
* @author tpmaerk
*/
class LightManager
{
const INTERTECHNO_OFF = 0x00;
const INTERTECHNO_ON = 0x01;
const INTERTECHNO_TOGGLE = 0x02;
const INTERTECHNO_TURN_LEFT = 0x03;
const INTERTECHNO_TURN_RIGHT = 0x04;
const UNIROLL_UP = 0x01;
const UNIROLL_STOP = 0x02;
const UNIROLL_DOWN = 0x04;
const FS20_OFF = 0x00;
const FS20_ON = 0x11;
const FS20_TOGGLE = 0x12;
private static $FS20_Housecode;
private static $instanceId;
/**
* Konfiguration: ID der LightManager-Instanz setzen
*
* @param string $instanceId ID der LightManager-Instanz
* @return void
*/
public static function setInstanceId($instanceId)
{
self::$instanceId = $instanceId;
}
/**
* Befehl an LightManager senden (Wrapper für HID_SendEvent())
*
* @param mixed $command Abzusetzender Befehl
* @return boolean Rückgabe von HID_SendEvent()
*/
private static function _sendCommand($command)
{
return HID_SendEvent(self::$instanceId, 0, $command);
}
/**
* InterTechno-Adressen (A1 - P16) in internes Hex-Format übersetzen
*
* @param string $actor Adresse des Aktors (etwa 'A1')
* @return string Adresse im internen Hex-Format
*/
public static function InterTechno_TranslateAddress($actor)
{
$group = ord(strtoupper(substr($actor, 0, 1))) - 65;
$channel = intval(substr($actor, 1)) - 1;
return '0x'.dechex($group).dechex($channel);
}
/**
* InterTechno-Aktor schalten
*
* @param string $actor Adresse des Aktors (etwa 'A1')
* @param int $mode Schaltmodus (vordefinierte Konstante angeben)
* @param int $statusID ID der Status-Variable (etwa 12345)
* @param boolean $isAdaptable true, falls Aktor lernfähig, ansonsten false (Default)
* @return void
*/
public static function InterTechno_SwitchMode($actor, $mode, $statusID, $isAdaptable = false)
{
$address = self::InterTechno_TranslateAddress($actor);
$type = !$isAdaptable ? chr(0x06).chr(0x00) : chr(0x07).chr(0x01);
self::_sendCommand(chr(0x05).chr($address).chr($mode).$type.chr(0x00).chr(0x00).chr(0x00));
$msg = ($mode == self::INTERTECHNO_ON) ? true : false;
$msg = ($mode == self::INTERTECHNO_TOGGLE) ? !GetValueBoolean($statusID) : $msg;
SetValueBoolean($statusID, $msg);
}
/**
* Lernfähigen InterTechno-Aktor dimmen
*
* @param string $actor Adresse des Aktors (etwa 'A1')
* @param int $value Intensität (0 bis 100)
* @param int $statusID ID der Status-Variable (etwa 12345)
* @param int $intensityID ID der Intensitäts-Variable (etwa 12345)
* @return void
*/
public static function InterTechno_SetIntensity($actor, $value, $statusID, $intensityID)
{
$address = self::InterTechno_TranslateAddress($actor);
$scale = array(0x00, 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8);
$level = ceil($value / 6.25);
self::_sendCommand(chr(0x05).chr($address).chr($scale[$level]).chr(0x04).chr(0x01).chr(0x00).chr(0x00).chr(0x00));
SetValueBoolean($statusID, ($value == 0) ? false : true);
SetValueInteger($intensityID, floor($level * 6.25));
}
/*
* Uniroll-Rollladen steuern
*
* @param string $actor Adresse des Aktors (etwa 1)
* @param int $mode Schaltmodus (vordefinierte Konstante angeben)
* @param int $statusID Optional: ID der Status-Variable (etwa 12345)
* @return void
*/
public static function Uniroll_SwitchMode($actor, $mode, $statusID = null)
{
$address = dechex(intval($actor) - 1);
self::_sendCommand(chr(0x15).chr($address).chr(0x74).chr($mode).chr(0x00).chr(0x00).chr(0x00).chr(0x00));
if(!empty($statusID)) {
$msg = ($mode == self::UNIROLL_UP) ? 'Geöffnet' : 'Geschlossen';
$msg = ($mode == self::UNIROLL_STOP) ? 'Angehalten' : $msg;
SetValue($statusID, $msg);
}
}
/**
* FS20-Adressen (1111 - 4444) in internes Hex-Format übersetzen
*
* @param string $actor Adresse des Aktors (etwa '1111')
* @return string Adresse im internen Hex-Format
*/
public static function FS20_TranslateAddress($actor)
{
$trans = array(11 => '0', 12 => '1', 13 => '2', 14 => '3', 21 => '4', 22 => '5', 23 => '6', 24 => '7',
31 => '8', 32 => '9', 33 => 'a', 34 => 'b', 41 => 'c', 42 => 'd', 43 => 'e', 44 => 'f');
return '0x'.$trans[substr($actor, 0, 2)].$trans[substr($actor, 2, 2)];
}
/**
* Konfiguration: FS20-Hauscode setzen
*
* @param string $code FS20-Hauscodes (etwa '11111111')
* @return void
*/
public static function setFS20Housecode($code)
{
$part1 = self::FS20_TranslateAddress(substr($code, 0, 4));
$part2 = self::FS20_TranslateAddress(substr($code, 4, 4));
self::$FS20_Housecode = chr($part1).chr($part2);
}
/*
* FS20-Aktor schalten
*
* @param string $actor Adresse des Aktors (etwa '1111')
* @param int $mode Schaltmodus (vordefinierte Konstante angeben)
* @param int $statusID Optional: ID der Status-Variable (etwa 12345)
* @return void
*/
public static function FS20_SwitchMode($actor, $mode, $statusID = null)
{
$address = self::FS20_TranslateAddress($actor);
self::_sendCommand(chr(0x01).self::$FS20_Housecode.chr($address).chr($mode).chr(0x00).chr(0x03).chr(0x00));
if(!empty($statusID)) {
$msg = ($mode == self::FS20_ON) ? true : false;
$msg = ($mode == self::FS20_TOGGLE) ? !GetValueBoolean($statusID) : $msg;
SetValueBoolean($statusID, $msg);
}
}
}
// Konfiguration hier vornehmen
LightManager::setInstanceId( 55202 /*[LightManager Pro (HID)]*/ );
LightManager::setFS20Housecode('12341234');
?>
Hallo,
habe mich weiter beschäftigt und dank einem Beitrag von Boui folgende Link abgearbeitet:
http://www.ip-symcon.de/forum/f52/newbie-fuer-newbies-register-variablen-10754/#post89045
Das Beispiel erfolgreich in Symcon getestet.
Wollte dies auf den LM Pro umsetzen ( HID Instanz ).:o
Bei dem Debug Fenster von der HID ist eine Transmitted Nachricht sichtbar,
wenn von Script Aktor der Befehl gesendet wird.
Habe eine RegisterVariable erstellt die auf die HID Instanz verweist und
das Enpfangsscript von den vorhergehenden Link verwendet.
EmpfangScript
<?
$RegVarID = $IPS_INSTANCE;
$newdata = $IPS_VALUE;
// fetch data in buffer
$data = RegVar_GetBuffer ( $RegVarID );
// add received data
$data .= $newdata;
// wrte back data to variable for use in other scripts
RegVar_SetBuffer($RegVarID, $data);
IPS_LogMessage( "EmpfangsTest" , $newdata );
?>
Dann das Debug Fenster von der RegVar geöffnet – LEER
Bin ich da komplett falsch???
Ich möchte mitschreiben ( lesen ) was das LM Programm zu dem Aktor sendet!
Kann ja direkt von dort aus den Aktor schalten.
Möchte herausfinden warum von Symcon aus zum LM der Befehl nicht richtig umgesetzt wird.
Vielleicht hat sich was von der LM Seite geändert ( Updates ).
Habe auch noch folgende Links gelesen:
http://www.ip-symcon.de/forum/f53/elektronische-haushalts-zaehler-ehz-auslesen-11505/
http://www.ip-symcon.de/forum/f52/serial-port-datensaetze-verarbeiten-13173/#post111926
Ich hoffe, es kann mir auf die Sprünge geholfen werden!
Hallo,
hast Du es probeweise mit der DosBox versucht (siehe erste Seite)?
Hallo,
macgyver hat meinen Fehler entdeckt, warum die Kommunikation bei mir Fehlerhaft war.
<?
include('LightManager.ips.php');
$mode = GetValueBoolean(13970 /*[LightManager Pro\AktorSchalten\Status]*/) ? LightManager::INTERTECHNO_OFF : LightManager::INTERTECHNO_ON;
LightManager::InterTechno_SwitchMode('A7', $mode, 13970 /*[LightManager Pro\AktorSchalten\Status]*/, false); // True = lernbare-; FALSE = nicht lernbare-Aktoren
?>
Habe nicht lernbare Aktoren, „FALSE“ ist Richtig!
LM läuft jetzt.
Eines wollte ich noch, ob ein mitlesen bei einer HID Instanz ( LM USB ) mit Symcon möglich ist?
Bin da auch bis jetzt gescheitert.:rolleyes:
Hallo Zusammen,
da meine PHP-Kentnisse derzeit leider nur für Copy&Paste reichen, stehe ich irgendwie auf dem Schlauch, was die Anbindung meines Light_Managers an das Shutter-Control Modul betrifft.
Beim Einmessvorgang erhalte ich als Fehlermeldung immer den Quellcode des Skripts selbst als Ausgabe.
Ohne Schutter Control also direkt über die Light Manager Klasse funktioniert die Rolladensteuerung einwandfrei.
Ich hoffe das jemand anhand der beigefügten Bilder bzw. des folgenden Schutter-Control Skripts einen Fehler enteckt.
Ich wäre euch sehr dankbar.
//Variables provided by ShutterControl Module
//IPS_LogMessage("InstanceID", $_IPS['INSTANCE']); /* InstanceID */
//IPS_LogMessage("Direction", $_IPS['DIRECTION']); /* {0..2} Stop, Up, Down */
//IPS_LogMessage("Duration", $_IPS['DURATION']); /* ms */
include('LightManager.ips.php');
ini_set('max_execution_time', 60);
if($_IPS['SENDER'] != "ShutterControl")
die("This script can only be started by the ShutterControl Module");
define("SC_DIRECTION_STOP", 0);
define("SC_DIRECTION_UP", 1);
define("SC_DIRECTION_DOWN", 2);
$instance = IPS_GetInstance($_IPS['INSTANCE']);
switch($instance['ModuleInfo']['ModuleID'])
{
case "{E6D7692A-7F4C-441D-827B-64062CFE1C02}": //Light-Manager Pro
$running = CreateVariableByName($SC_INSTANCE2, "Moving", 0);
$value = GetValue(IPS_GetStatusVariableID($SC_INSTANCE2, "StatusVariable"));
$shutterID = GetValue(IPS_GetVariableIDByName("Kanal", $SC_INSTANCE2));
switch($SC_DIRECTION)
{
case SC_DIRECTION_STOP:
if(GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
break;
case SC_DIRECTION_UP:
if(!GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_UP);
SetValue($running, true);
}
if($SC_DURATION > 0)
{
IPS_Sleep($SC_DURATION);
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
else
SetValue($running, false);
break;
case SC_DIRECTION_DOWN:
if(!GetValue($running))
{
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_DOWN);
SetValue($running, true);
}
if($SC_DURATION > 0)
{
IPS_Sleep($SC_DURATION);
LightManager::Uniroll_SwitchMode($shutterID, LightManager::UNIROLL_STOP);
SetValue($running, false);
}
else
SetValue($running, false);
break;
}
break;
default:
die("No Handler for Module ".$instance['ModuleInfo']['ModuleName']." found");
}
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
IPS_SetInfo($vid, "This Variable was created by Script #".$_IPS['SELF']);
}
return $vid;
}
in Zeile 5, fehlt ein ;
Hi,
habe das Test-Skript geändert in:
include(‚LightManager.ips.php‘);
//$status = 52463 /[Rolladen Steuerung\Schutter Control\StatusVariable]/;;
$status = 55542 /[Rolladen Steuerung\Schutter Control]/;
SC_Move($status, 0);
//LightManager::Uniroll_SwitchMode(‚1‘, LightManager::UNIROLL_DOWN, $status); //UP DOWN OR STOP
Jetzt bekomme ich zwar keine Fehlermeldung mehr, aber es passiert auch nix.
Ich denke mal das Problem liegt irgendwie an meinem Schutter-Control Skript, welches den Code von tpmaerk für die Light_Manager KLasse beinhaltet.
Hat vielleicht jemand noch eine Idee?
Gruß
Sebastian