24_Iluminize.pm: Support für Iluminize LED stripes

Begonnen von Volker Kettenbach, 12 Oktober 2018, 16:03:59

Vorheriges Thema - Nächstes Thema

Volker Kettenbach

Hallo allerseits,

ich habe ein neues Modul entwickelt, welches Iluminize LED Stripes (https://www.iluminize.com/de/) unterstützt.
Bisher geht nur on/off. Aber evtl. schaffen wir es ja gemeinsam, das Protokoll noch weiter zu entschlüsseln.

Das Modul gibt es hier: https://github.com/kettenbach-it/FHEM-Iluminize
und ab morgen im FHEM-SVN.

Gruß
Volker

CoolTux

Hallo Volker,

Zwei Wünsche hatte ich. Kannst Du bitte nicht direkt in $hash->[STATE] schreiben. Statt dessen bitte das Reading state setzen.
Und eventuell wäre es Dir möglich  mit packages zu arbeiten.
Wir versuchen aktuell das Wiki für die Modulentwicklung entsprechend zu aktualisieren. Wenn Du Fragen hast einfach fragen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Volker Kettenbach

#2
Meinst Du mit "nicht direkt in $hash schreiben" stattdessen

readingsSingleUpdate($hash, "state", "off", 1);

Und was heisst "mit packages" arbeiten? Ich bitte um ein Beispiel.

CoolTux

Zitat von: Volker Kettenbach am 12 Oktober 2018, 19:08:05
Meinst Du mit "nicht direkt in $hash schreiben" stattdessen

readingsSingleUpdate($hash, "state", "off", 1);

Hallo Volker,

Ja genau das meine ich. Ein Grund ist das der User über das Attribut stateFormat die Möglichkeit hat $hash->{STATE} zu "manipulieren"



packages ist unter Perl das selbe wie in C++ und Java Klassen sind. Es ist ein Namensraum.
Hier kannst Du Ansätze zur Diskussion darüber finden.

Würde in Deinem Fall (Dein Modul) so ausschauen

package main;

use strict;
use warnings;


sub Iluminize_Initialize($)
{
    my ($hash) = @_;

    $hash->{DefFn}      = "Iluminize::Define";
    $hash->{ReadFn}     = "Iluminize::Get";
    $hash->{SetFn}      = "Iluminize::Set";
    $hash->{UndefFn}    = "Iluminize::Undefine";
    $hash->{DeleteFn}   = "Iluminize::Delete";
    $hash->{AttrFn}     = "Iluminize::Attr";
    $hash->{AttrList}   = "$readingFnAttributes";
}


package Iluminize;

use strict;
use warnings;
use POSIX;

use GPUtils qw(:all);  # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt


use IO::Socket::INET;
use IO::Socket::Timeout;

use SetExtensions;


my $on =   chr(hex("55")) .
    chr(hex("99")) .
    chr(hex("5e")) .
    chr(hex("bb")) .
    chr(hex("01")) .
    chr(hex("02")) .
    chr(hex("02")) .
    chr(hex("12")) .
    chr(hex("ab")) .
    chr(hex("c2")) .
    chr(hex("aa")) .
    chr(hex("aa"));

my $off=   chr(hex("55")) .
    chr(hex("99")) .
    chr(hex("5e")) .
    chr(hex("bb")) .
    chr(hex("01")) .
    chr(hex("02")) .
    chr(hex("02")) .
    chr(hex("12")) .
    chr(hex("a9")) .
    chr(hex("c0")) .
    chr(hex("aa")) .
    chr(hex("aa"));


## Import der FHEM Funktionen
BEGIN {
    GP_Import(qw(
        readingsSingleUpdate
        readingsBulkUpdate
        readingsBulkUpdateIfChanged
        readingsBeginUpdate
        readingsEndUpdate
        Log3
    ))
};



sub Define($$)
{
    my ($hash, $def) = @_;
    my $name= $hash->{NAME};

    my @a = split( "[ \t][ \t]*", $def );
    return "Wrong syntax: use define <name> Iluminize <hostname/ip> " if (int(@a) != 3);

    $hash->{HOST}=$a[2];

    Log3 $hash, 0, "Iluminize: $name defined.";

    return undef;
}

# No get so far
sub Get($$) {}


sub Set($$)
{
    my ($hash, $name, $cmd, @args) = @_;
    my $cmdList = "on off";

    my $remote_host = $hash->{HOST};
    my $remote_port = 8899;

    Log3 $hash, 3, "Iluminize: $name Set <". $cmd ."> called" if ($cmd !~ /\?/);

    return "\"set $name\" needs at least one argument" unless(defined($cmd));

    my $command;
    if ($cmd eq "on") {
        $command = $on;
        readingsSingleUpdate($hash, "state", "on", 1);
    } elsif($cmd eq "off") {
        $command = $off;
        readingsSingleUpdate($hash, "state", "off", 1);
    } else {
        return SetExtensions($hash, $cmdList, $name, $cmd, @args);
    }

    my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
        PeerPort => $remote_port,
        Proto    => 'tcp',
        Type     => SOCK_STREAM,
        Timeout  => 2 )
        or return "Couldn't connect to $remote_host:$remote_port: $@\n";

    $socket->write($command);

    return undef;
}


sub Undefine($$)
{
    my ($hash, $arg) = @_;
    my $name= $hash->{NAME};
    Log3 $hash, 4, "Iluminize: $name undefined.";
    return;
}



sub Delete($$) {
    my ($hash, $arg) = @_;
    my $name= $hash->{NAME};
    Log3 $hash, 0, "Ilumnize: $name deleted.";
    return undef;
}



sub Attr($$$$) {
    my ($cmd, $name, $aName, $aVal) = @_;
    my $hash = $defs{$name};

    return undef;
}

1;


Bei der Liste der zu "importierenden Funktionen aus main musst Du dann natürlich immer ergänzen. Ich habe jetzt nur mal die kleinen Klassiker genommen.
Wenn Du vergisst eine Funktion ein zu binden stürzt Dein FHEM sofort ab wenn die Funktion aufgerufen wird.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Volker Kettenbach


CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

LuckyTV

Hallo

ich habe versucht einen iluminize LED-Controller Funk/WiFi Modell 500.011 zu steuern. Leider ohne Erfolg.
Mit welchem LED Controller hast du dein Modul getestet?

Gruß
LuckyTV

Volker Kettenbach

Moin,

in der Tat steht bei mir auch 500.011 drauf.
Kommst Du auf das Webfrontend von dem Ding drauf?
Einfach http://<ip-adresse> im Browser aufrufen.
User+Passwort ist glaube ich admin/admin.
Welche Firmware hast Du?
Ich habe 1.0.08

Volker

LuckyTV

Hallo

Ich komme auf das Webfrontend mit admin admin drauf. Version ist auch bei mir V1.0.08.
Die App Steuerung funktioniert. Im DHCP bekommt es immer die selbe IP zugewiesen.
Die Kommunikation funktionirt auch. Zumindes gibt es eine Fehlermeldung wenn ich den LED-Controller vom Strom nehme.
"Couldn't connect to 192.168.40.31:8899: IO::Socket::INET: connect: timeout"

Echt blöder Fehler

Internals:
   CFGFN     
   DEF        192.168.40.31
   HOST       192.168.40.31
   NAME       BZE_RGB_Licht
   NR         355
   STATE      off
   TYPE       Iluminize
   .attraggr:
   .attrminint:
   READINGS:
     2018-10-24 18:08:03   state           off
Attributes:


Gruß,
LuckyTV

Volker Kettenbach

Bitte check mal im Webfrontend, ob Du unter "Other setting" TCP-Server oder was anderes eingestellt hast.
Bei mir steht das auf TCP-Server und entsprechend ist das Modul programmiert.


LuckyTV

Ist schon auf TCP-Server eingestellt. Was steht bei dir bei Server Adresse?
Ich habe das Device noch mal in Fhem gelöscht und wieder angelegt. Keine Änderung
Die WLAN Signalstärke ist auch OK.  -44 dBm , max. mögliche Datenrate 72 / 72 Mbit/s

Hier meine Daten
Network Parameters setting
Protocol: TCP-Server
Port ID: 8899
Server Address: 10.10.10.1
TCP Time Out Setting: 300

Volker Kettenbach

Ich habe exakt die gleichen Settings.
Merkwürdig...
Mach mal ein "telnet <ipadresse> 8899" an der Commandline und guck, ob das einen Fehler bringt.

LuckyTV

Guten Morgen,

da gibt es keine Fehlermeldung.

Trying 192.168.40.31...
Connected to 192.168.40.31.
Escape character is '^]'.

LuckyTV

Hallo Volker,

ich würde dir ja gerne weiterhelfen. Wenn ich wüsste wie.
So wie es aussieht hat sonst keiner hier solch ein LED-Contoller.

Gruß,
Tobias

Volker Kettenbach

#14
Nur für das Protokoll: die Iluminize Geräte sind wohl von Sunricher gebaut.
Dafür gibt es hier ein Modul: https://forum.fhem.de/index.php/topic,34254.50.html
bzw: https://forum.fhem.de/index.php/topic,18958.0.html