JBMedia Lightmanager Steuerung Kommandozeile

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');
?>

Lightman_2x.jpg

Instanz_1.jpg

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 :confused:
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!

LM_HID_Debug_.jpg

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