JBMedia Lightmanager Steuerung Kommandozeile

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

möglicherweise steht die Moving Variable noch auf TRUE?

was schreibt er im Event-Log?

Grüße
Marco

Hallo Zusammen,

erstmal vielen Dank für Eure Bemühungen.
Es war jetzt irgendwie doch einfacher als gedacht.
Keine Ahnung was der Fehler war, aber Ich habe einfach das alte Schutter Modul gelöscht und anschliesend wieder ein neues
angelegt (ohne irgendwas am Skript zu ändern) und schon funktionierts.
Naja manche Dinge erledigen sich wohl von selbst.

Viel Spaß noch mit IPS :wink:

Gruß
Sebastian

Ich muss das alte Thema noch einmal auskramen.

Ich würde gerne über IPS Schaltbefehle an den LM Pro mit WiFi Modul senden.

Grund dafür ist, dass ich gerne die „Siro“ Akku Motoren für Verdunkelungsrollos kaufen will.

SmartHome Archive - Siro Antrieb

Kann ich mit IPS Befehle an den LM Pro senden?

Das ist ein einfacher HTTP Befehl, wenn Du weist wie der lautet für den LM Pro kannst Du den von IPS aus verschicken.