WLAN Zwischenstecker GWF-S171

Begonnen von falcke, 02 Januar 2017, 16:11:02

Vorheriges Thema - Nächstes Thema

falcke

Hallo,
ich habe einige GWF-S171 Zwischenstecker und würde mich zwecks Integration in FHEM über ein entsprechendes Modul freuen.
Die Zwischenstecker sind interessant, weil:


Der Zwischenstecker wird unter diesen Labels vertrieben: WeConn, Ogemray, See-Time, Ferguson, iSmartAlarm als SP3G

Auf der Suche nach Integrationsmöglichkeiten bin ich auf diese Seite gestossen: https://sites.google.com/site/tgmaxx/energy-enviro-monitoring/smart-life-wifi-plug
Leider habe ich keine Programmier-Kenntnisse, könnte mir aber vorstellen, dass die Seite ein guter Startpunkt wäre.

Grüße,
Marcel

derchrome

Gibt's hier schon was neues? Bei Amazon ist die Dose grade für 25€ zu haben, da schreit ja förmlich nach einer Integration in FHEM

Afmanni

Ich habe so eine "Wlan-Steckdose" schon länger, mit der Original App funktioniert diese nur bedingt zuverlässig, eine Integration in FHEM wäre natürlich super

Amenophis86

Zitat von: Afmanni am 28 Januar 2017, 14:49:56
mit der Original App funktioniert diese nur bedingt zuverlässig

Was genau muss ich mir darunter vorstellen?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

falcke

Meine Vermutung:
Zu den Zwischensteckern gibt es eine App(WeConn) für Android und IOS. Die Kommunikation mit den Steckern erfolgt per UDP.
D.h. wenn ein WLAN-Device, wie ein Smartphone gerade nicht in dem Moment aktiv mit dem WLAN verbunden ist und man schnell ein Zwischenstecker bedienen möchte, bevor die Infos vollständig vorliegen, dann werden die Zwischenstecker als offline angezeigt bzw. reagieren nicht auf Eingabe.
Bei Tests mit netcat als Listener bzw. als Sender konnte ich das bei meinem per LAN verbundenen Raspberry jedoch nicht feststellen.

In der Zwischenzeit habe ich auf Anfrage von Ogemray Android-, IOS-Libaries und eine Art Data-Flow bekommen.
Die Libaries lassen sich relativ einfach dekompilieren, wobei es dann bei mir leider wieder aufhört.
Das Data-Flow Chart habe ich angehangen.

Wenn die Libaries hilfreich wären, würde ich die auch noch hier anhängen.

Grüße,
Marcel



Amenophis86

Zitat von: falcke am 30 Januar 2017, 10:59:54
Bei Tests mit netcat als Listener bzw. als Sender konnte ich das bei meinem per LAN verbundenen Raspberry jedoch nicht feststellen.

Heißt das, dass du mittels des PI die Stecker schon schalten kannst? Wenn ja, wie machst du es aktuell?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

falcke

Das ist eigentlich sehr gut in dem Link https://sites.google.com/site/tgmaxx/energy-enviro-monitoring/smart-life-wifi-plug beschrieben, den ich eingangs gepostet hatte.
Wenn Du auf der Seite nach "GWF-S171" suchst, landest Du direkt an der richtigen Stelle.
Auf der Seite ist die Rede von dem Tool Packet Sender. Das hatte ich nur mit netcat ersetzt.

Amenophis86

Ah jetzt. Ok. Das heißt das quasi wirklich schon alles da ist um für die Dinger ein Modul zu bauen. Mir fehlen leider die Kenntnisse und die Zeit dazu, sry. Aber vielleicht willst du dich selbst dran versuchen, oder einen der Entwickler hier fragen. Musste aber vermutlich direkt ansprechen.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

falcke

Woher weiß ich denn, wer hier Entwickler ist? Ich hätte gedacht, dass die Wunschliste hier dafür da ist.  :o

Amenophis86

https://svn.fhem.de/#contributors hier findest du alle.

Ja, das für ist die Wunschliste da, das ist richtig. Frage ist jedoch, ob sich jemand auch findet, der den Wunsch umsetzte. Daher ist selbst aktiv werden oft nicht verkehrt, wenn sich hier keiner meldet :) Wie gesagt, alternativ kannst du es selbst versuchen zu erstellen. So ziemlich jeder Developer hilft dir bei Problemen, wenn du nett fragst und dich vorher selbst informiert hast.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Volker Kettenbach

Hallo zusammen,

falcke hat mich auf diesen Thread aufmerksam gemacht.
Ich bin der Entwickler und Maintainer von 24_TPLink_HS110.
Dieses Modul unterstützt die TPLink HS100 und HS110 Steckdosen (100 vs. 110: letzte hat eine Leistungsmessung).

Nach einem kurzen Blick auf: https://sites.google.com/site/tgmaxx/energy-enviro-monitoring/smart-life-wifi-plug
stelle ich fest, dass es bei der GWF-S171 wohl um ein vergleichbare Produkt aus dem NoName/Private-Label Segment handelt.
Außerdem ist das Protokoll wohl halbwegs reverse-engeneered und nicht verschlüsselt (bei TPLink ist es verschlüsselt, die Verschlüsselung wurde aber (zum Glück) von einem dritten gebrochen).
Wenn jemand die Libraries decompiled (in welcher Sprache sind diese?) und sie *nicht* obfuscated (Achtung!) sind, dann ist es noch einfacher.
Bestimmte Sprachen (Java, .NET) kann ich auch decompilen.

Ich denke also, dass es grundsätzlich machbar ist, ein FHEM Modul zu schreiben.
Leider habe ich derzeit wenig Zeit zum Programmieren.
Wenn wir im Team arbeiten und ich support bekomme, wäre es evtl. aber machbar.
Kannst Du die Libs und die Doku mir mal schicken? Bitte Link auf Dropbox o.ä. per PN.
BITTE NICHT hier einstellen, weil das ist Copyright-Material und höchstwahrscheinlich nicht für die Verbreitung gedacht.

Ich gebe aber noch mal folgendes zu bedenken:
- die GWF-S171 finde ich derzeit weder bei Amazon noch in irgendeinem anderen Deutschen Shop. Ich bräuchte aber schon eine zum Testen.
- Wenn das Ding 25 Euro kostet, wäre es schon deutlich günstiger als TPLink, aber wenn das Ding 30 oder mehr kostet, würde ich jedem empfehlen, statt dessen das "Markenprodukt" zu nehmen, denn dier HS100/110 funktionieren sehr gut, funktionieren in FHEM und die mitgelieferte App ist sogar auch ganz gut. Da lohnen sich die China-Clone nicht.

Dann noch eine Frage:
ich habe den o.g. Link nur kurz überflogen: sehe ich es richtig, dass die Steuerung per UDP direkt erfolgt, die Leistungsdaten aber per JSON aus der Cloud kommen?
Das wäre noch ein deutlich Vorteil für TPLink: da geht alles (auch) ohne Cloud.

Gruß
Volker

falcke

Hallo,
wenn ich die Tabelle "Plug response to Get Data:" auf der Seite https://sites.google.com/site/tgmaxx/energy-enviro-monitoring/smart-life-wifi-plug richtig verstehe, werden sämtliche Daten (auch) lokal verschickt. Die Leistungsdaten werden wohl per Pulsfrequenzmodulation 
ZitatThe output data is encoded using Pulse-Frequency Modulation
übertragen.
Die Steckdose ist aktuell z.B. bei Amazon für 25€ unter dem Titel "Weconn S171 Smart Steckdose / intelligente WLAN Steckdose mit Stromverbrauchszähler und Zeitschaltuhr, kostenlos iOS und Android App, Weiß" zu haben.

Grüße,
Marcel

Volker Kettenbach

Habe mir mal so ein Teil bestellt.

mumpitzstuff

Hat eins der Geräte eine Art Zugriffsschutz, der das Schalten durch andere zumindest ansatzweise verhindert?

falcke

man kann sich als Administrator einrichten und dann das Schalten sperren bzw. Einschränkungen für die Bedienung definieren.


Gesendet von iPad mit Tapatalk

phantom

Ich habe nun auch eine GWF-S171 unter dem Markennamen Stabo. Sie wird mit den WeConn-App gesteuert, läßt sich aber auch mit den Strings aus dem o.g. Link im lokalen LAN schalten.

@Volker K.:  Hattest du schon mal Zeit deine bestellte S171 mit deinem Modul zu testen?
Evtl. Sind nur minimale Änderungen notwendig...

Gruß
Phantom

Volker Kettenbach

Ich habe das Teil rumliegen, aber noch nicht benutzt. Mangels Zeit.
Du kannst es ja selbst mal testen, ob es geht.


TheTrumpeter

#18
Hat sich diesbezüglich jemand weiter mit den Steckdosen beschäftigt?

Vor ein paar Tagen gab es gratis (Gutscheinfehler) folgendes Produkt bei Amazon, das genau wie das hier diskutierte Weconn S171 aussieht: https://www.amazon.de/gp/product/B079L6T7DJ

Ich habe mir das Ding bestellt, es läuft soweit auch über das Handy.
Mit den beiden Modulen TPLinkHS110 und UbiquitiMP läuft es nicht. Ersteres tut gar nichts, letzteres sagt zumindest, dass sich die Verbindung nicht aufbauen lässt, "port 23: Verbindungsaufbau abgelehnt".

Eine Änderung auf Port 9957 wie hier: https://stackoverflow.com/questions/31827645/how-to-control-wifi-plug-gwf-s171using-raspberry-pi# beschrieben liefert dieselbe Fehlermeldung "port 9957: Verbindungsaufbau abgelehnt".

Wie weitermachen?
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

TheTrumpeter

Ich habe zwischenzeitig bisschen was herausgefunden...

Kommunikation findet über Port 10000 der Steckdose statt, Protokoll ist wohl TCP (zumindest sagt das Wireshark).
Ich konnte auch rausfinden an welcher Stelle der Antwort der Steckdose die momentane Leistung (in der App als "Echtzeitleistung") übertragen wird:

Dies geschieht jeweils in den Antwort-Botschaften mit 154 Byte Länge, die alle 6 Sekunden von der App angefragt werden. Die letzten 100 Byte sind die Datenbytes, davon ist in Bytes 85 und 86 die momentane Leistung auf 1/1000W gespeichert, Byte-Reihenfolge ist Little-Endian. (Vermutlich gehört auch das 84. Byte dazu, um die Maximalleistung von 3600.000W codieren zu können; Leistungen die mehr als 2 Byte benötigen habe ich bisher aber nicht abgefragt.)

Wie komme ich nun weiter?
(Grundsätzlich bin ich nur am zyklischen Auslesen der Momentanleistung interessiert, Schaltvorgänge oder Timer benötige ich nicht.)
FHEM auf RPi3, THZ (LWZ404SOL), RPII2C & I2C_MCP342x (ADCPiZero), PowerMap, CustomReadings, RPI_GPIO, Twilight, nanoCUL (WMBus für Diehl Wasserzähler & Regenerationszähler für BWT AqaSmart), ESPEasy, TPLinkHS110

cnkru

#20
Hallo allerseits,

habe mir eine Weconn S171 Smart Steckdose angeschafft.
https://www.amazon.de/Weconn-Steckdose-intelligente-Stromverbrauchszähler-Zeitschaltuhr/dp/B01MA49VVO/ref=sr_1_1?s=lighting&ie=UTF8&qid=1538843302&sr=8-1&keywords=Weconn+S171+Smart+Steckdose

Wollte diese Steckdose nun per Perl-Script einbinden. Leider bisher ohne Erfolg. Sehe wohl den Wald vor lauter Bäumen nicht.
Hier mein 99_myWeconn.pm


#
## Beispiel-Aufruf {WeConn("Test","7cdd90e6913e","192.168.178.45","off");;}
#

sub
WeConn($$$$)
{
my ($device,$mac_adr,$ip_adr,$action) = @_;
        if (!$ip_adr) {
                 Log 2, "Error-WeConn Sub. Missing IP Address: $device";
        }
        if (!$mac_adr) {
             Log 2, "Error-WeConn Sub. Missing MAC Address: $device";
        }

my  $SendData="";
my $SET_AS_ADMIN = '0101100148000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000feff0000xxxxxxxxxxxx000000000100';
my $ON_CODE =  '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $OFF_CODE = '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $GET_INFO = '0101030138000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000';
my $find = 'xxxxxxxxxxxx';

$SET_AS_ADMIN  =~ s/$find/$mac_adr/g;
$ON_CODE  =~ s/$find/$mac_adr/g;
$OFF_CODE  =~ s/$find/$mac_adr/g;
$GET_INFO  =~ s/$find/$mac_adr/g;

    if($action eq "on") {
        $SendData = $ON_CODE;
    }
   
    if($action eq "off") {
        $SendData = $OFF_CODE;
    }
my $ip_udp = $ip_adr.':9957';
my ($socket,$data);
#  call IO::Socket::INET->new() to create the UDP Socket
$socket = new IO::Socket::INET(PeerAddr=>$ip_udp,Proto=>'udp') or die "ERROR $device in Socket Creation : $!\n";
$socket->send($SendData);
$socket->close();
Log 2, "$device : $socket - $SET_AS_ADMIN - $SendData";   
   
}
## end sub


Vielleicht hat jemand die zündende Idee.

Gruß
Carsten

Nachtrag:
Eine Nacht drüber schlafen hilft immer ...
Danke auch an ..

https://github.com/loki29pl/homebridge-weconn

Hier die Lösung:

## Aufruf {WeConn("Test","7cdd90e6913e","192.168.178.45","off");;}

sub
WeConn($$$$)
{
use IO::Socket;
use strict;
my ($device,$mac_adr,$ip_adr,$action) = @_;
        if (!$ip_adr) {
                 Log 2, "Error-WeConn Sub. Missing IP Address: $device";
        }
        if (!$mac_adr) {
             Log 2, "Error-WeConn Sub. Missing MAC Address: $device";
        }

my  $SendData="";
my $SET_AS_ADMIN = '0101100148000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000feff0000xxxxxxxxxxxx000000000100';
my $ON_CODE =  '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $OFF_CODE = '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $GET_INFO = '0101030138000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000';
my $find = 'xxxxxxxxxxxx';

$SET_AS_ADMIN  =~ s/$find/$mac_adr/g;
$ON_CODE  =~ s/$find/$mac_adr/g;
$OFF_CODE  =~ s/$find/$mac_adr/g;
$GET_INFO  =~ s/$find/$mac_adr/g;


    if($action eq "on") {
        $SendData = StreamPrepare($ON_CODE);
    }
   
    if($action eq "off") {
        $SendData = StreamPrepare($OFF_CODE);
    }
my $ip_udp = $ip_adr.':9957';
my ($socket,$data);
#  call IO::Socket::INET->new() to create the UDP Socket
$socket = new IO::Socket::INET(PeerAddr=>$ip_udp,Proto=>'udp') or die "ERROR $device in Socket Creation : $!\n";

$socket->send($SendData);
$socket->close();
Log 2, "$device : $socket - $SendData";   
   
}
## end sub
#####################
sub StreamPrepare($)
{
my ($data) = @_;
my $stream = "";
my$num="";
    $l = length($data);
for ($i=0; $i<$l; $i+=2) {
$num = hex('0x'.substr($data,0,2));
#$stream=$stream.$num.",";
$stream=$stream.chr($num);
$data = substr($data,2,$l-$i);
}
return $stream;
}
# end Sub StreamPrepare
######################
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

Markus Hermann

#21
Hallo Carsten,

wenn ich den Code in 99_myUtills.pm eingebe, dann erhalte ich die u. g. Fehlermeldung.

Bei "sudo npm install -g homebridge-weconn" von https://github.com/loki29pl/homebridge-weconn gab es kein Fehler. Oder brauchte das gar nicht installiert werden?

ERROR:
Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at ./FHEM/99_myUtils.pm line 164.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at ./FHEM/99_myUtils.pm line 165.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at ./FHEM/99_myUtils.pm line 165.
Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at ./FHEM/99_myUtils.pm line 165.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at ./FHEM/99_myUtils.pm line 165.
Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at ./FHEM/99_myUtils.pm line 169.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at ./FHEM/99_myUtils.pm line 169.


Kannst Du helfen? Oder hat jemand andere eine Idee?

EDIT: Nachtrag: Habe die Variablen unter sub StreamPrepare($) deklariert:

my $i = 0;
my $l = 0;


Jetzt erhalte ich keine Fehlermeldungen mehr, aber wenn ich:

{WeConn("Schalter 1","68D63A98DA97","192.168.9.118","on");;} in Fhem eingebe passiert gar nichts.


Danke & Gruß
Markus


CUL/CUL-RFR/HM-LAN an Cubietruck

FS20/FHT/TFK/UTS/KS300/HM-SEC-SC/HMS100/HM-OU-CFM-PL/HM-RC-SEC3/

FLOORPLAN auf Android-Tablet und VDR

cnkru

#22
Hallo Markus,

sorry lange nicht mehr online gewesen....
Bitte Kleinbuchstaben in der MAC-Adresse verwenden, zumindest funktioniert es bei mir so.
Weitere mögliche Fehlerursache - Leerzeichen im Device-Namen - Ich verwende Unterstrich statt Leerzeichen.

Habe am Coding weiter gearbeitet - InfoStatus ob an/aus, wenn manuell bedent wurde.


Abgespeichert unter 99_myWeconn.pm

package main;

use strict;
use warnings;
use POSIX;
use Time::Local;

sub
myWeconn_Initialize($$)
{
  my ($hash) = @_;
}


## Aufruf {WeConn("d_WeConn1","7cdd90e6913e","192.168.178.45","info");;}

sub
WeConn($$$$)
{
use IO::Socket;
use strict;
my ($device,$mac_adr,$ip_adr,$action) = @_;
        if (!$ip_adr) {
                 Log 2, "Error-WeConn Sub. Missing IP Address: $device"; return;
        }
        if (!$mac_adr) {
             Log 2, "Error-WeConn Sub. Missing MAC Address: $device"; return;
        }

my  $SendData="";
my $RecvInfo ="";
my $SET_AS_ADMIN = '0101100148000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000feff0000xxxxxxxxxxxx000000000100';
my $ON_CODE =  '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $OFF_CODE = '0101010180000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
my $GET_INFO = '0101030138000000010000005c6c5c6c0000000000000000000000000000000000000000000000000000000000000000xxxxxxxxxxxx0000';
my $find = 'xxxxxxxxxxxx';

$SET_AS_ADMIN  =~ s/$find/$mac_adr/g;
$ON_CODE  =~ s/$find/$mac_adr/g;
$OFF_CODE  =~ s/$find/$mac_adr/g;
$GET_INFO  =~ s/$find/$mac_adr/g;


    if ($action eq "on") {
        $SendData = prepareStream($ON_CODE);
    }
   
    elsif ($action eq "off") {
        $SendData = prepareStream($OFF_CODE);
    }
    elsif ($action eq "info") {
        $SendData = prepareStream($GET_INFO);
    }
    else {
        return;
    }
   
my $ip_udp = $ip_adr.':9957';
my ($socket,$data);
my $data = "";
my $status = "switch";
#  call IO::Socket::INET->new() to create the UDP Socket
$socket = new IO::Socket::INET(PeerAddr=>$ip_udp,Proto=>'udp') or die "ERROR $device in Socket Creation : $!\n";   
$socket->send($SendData);
#Log 2, "WeConn Sub. Socket-Data: $device:: Senddata";
if ($action eq "info") {
      # blockade verhindern bei read info durch setzen timeout (can_read)
      my $select = new IO::Select(); # create handle set for reading
      $select->add($socket);        # add the main socket to the set

      my @ready = $select->can_read(1);
       if (@ready) {
      $socket->recv($data,128);
      #Log 2, "decodeStream-WeConn Sub. Socket-Data: $device:: Start";
      $RecvInfo = decodeStream($data);
      #Log 2, "decodeStream-WeConn Sub. Socket-Data: $device:: Ende";
         } #end if ready
         
      if($data ne "") {
         $status =  ord(substr($data,56,1));
         fhem("setreading $device active_state online");
         #Log 2, "decodeStream-WeConn Sub. Socket-Data: $device:: $RecvInfo";
         }
      else {
         $status = "offline";
         fhem("setreading $device active_state $status");
         #Log 2, "decodeStream-WeConn Sub. Socket-Data: $device:: no Data";
         } #end if data
    } #end if action

$socket->close();

my $dev_state = ReadingsVal($device, "state", "0");
if ($action eq "info") {
      # Status-Anzeige in fhem synchronisieren
      if ($status eq "1" && $dev_state eq "off" ) { fhem("setreading $device state on");}
      if ($status eq "0" && $dev_state eq "on") { fhem("setreading $device state off");}
      }

Log 2, "WeConn Sub $device: $socket :: Action: $action :: Status: $status/$dev_state :: $RecvInfo";   
   
}
## end sub
#####################
sub prepareStream($)
{
my ($data) = @_;
my $stream = "";
my $num="";
my $i =0;
my $l=0;
    $l = length($data);
for ($i=0; $i<$l; $i+=2) {
$num = hex('0x'.substr($data,0,2));
#$stream=$stream.$num.",";
$stream=$stream.chr($num);
$data = substr($data,2,$l-$i);
}
return $stream;
}
# end Sub prepareStream
######################
sub decodeStream($)
{
my ($data) = @_;

my $stream = "";
my $num="";
my $i =0;
my $l=0;
$l = length($data);
for ($i=0; $i<$l; $i++) {
$num = ord(substr($data,0,1));
$stream=$stream.$num.",";

$data = substr($data,1,$l-$i);
}
return $stream;
}
# end Sub StreamEncode
######################
#################
# Ende
#################
1;




Hoffe es hilft Dir weiter.
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

swatkris

Hallo Carsten,

ich habe mir vor ein paar Tagen auch die Steckdosen geholt. Gabs bei Voelk... zu einem guten Kurs im Doppelpack.
Leider habe ich gerade div. Schwierigkeiten die Geräte in FHEM zu definieren.
Wenn ich den Befehl {WeConn("Schalter 1","xxxxxxxx","192.168.150.120","on");;} in der FHEM Befehlszeile eingebe funktioniert das, auch mit dem "off" Befehl.
Aber mit der Definition und ansprechen da haperts gerade.
Wäre nett, wenn Du mir etwas auf die Sprünge helfen könntest.
Vielen Dank
Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

cnkru

Hallo Kristian,

hier meine Definition in der fhem.cfg

#
# Schalter 1 definieren
#
define d_WeConn1 dummy
attr d_WeConn1 room WeConn
attr d_WeConn1 setList on off
define notify_WeConn1 notify d_WeConn1:.* {my $ev=$EVENT;;WeConn("d_WeConn1","7xxxxxxxxe","192.168.178.45",$ev);;}
attr notify_WeConn1 room WeConn
#
# check alle 5 Minuten, ob WeConn ggf. per Hand bedient wurde -> Status updaten
#
define Check_WeConn1 at +*00:15:00  {WeConn("d_WeConn1","7xxxxxxxxe","192.168.178.45","info");;;;}
attr Check_WeConn1 room WeConn
#


Gruß
Carsten
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

swatkris

Hallo Carsten,

vielen Dank. Ich werde das mal probieren und mich wieder melden.

Gruß

Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

swatkris

#26
Hallo Carsten,
ich habe folgendes gemacht. Aus dem vorherigen Post habe ich den Code für die 99_myWeconn verwendet.
Leider wirft mir FHEM folgenden Fehler im Log :

2018.10.30 15:48:58 3: Check_SchukoWiFi01: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.

Ansonsten habe ich an dem Code nichts verändert. lediglich die Definition habe ich an meine Bedürfnisse angepasst :

#
# Schalter 1 definieren
#
define SchukoWiFi01 dummy
attr SchukoWiFi01 room Küche
attr SchukoWiFi01 setList on off
define notify_SchukoWiFi01 notify SchukoWiFi01:.* {my $ev=$EVENT;;WeConn("SchukoWiFi01","7xxxxxxxxxx1","XXX.XXX.XXX.220",$ev);;}
attr notify_SchukoWiFi01 room Küche
define Check_SchukoWiFi01 at +*00:15:00  {WeConn("SchukoWiFi01","7xxxxxxxxxx1","XXX.XXX.XXX.220","info");;;;}
attr Check_SchukoWiFi01 room Küche
#


Wärst Du so nett und würdest mir helfen ?

Vielen Dank :-)

Kristian

EDIT:
Nach einem Reboot funktioniert das Schalten über FHEM, jedoch die Statusabfrage scheint nicht zu funktionieren.
Vielleicht kannst Du Dich der Sache jedoch noch annehmen.

Danke Dir
Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

cnkru

Hallo Kristion,

Zum Testen brauche ich folgende Infos

Was steht den in deinem LOGFile?
Führe dein at-Befehl in der Komandozeile aus.

set Check_SchukoWiFi01 execNow

schalte jetzt das S171 manuell 1mal (also wenn AN, dann auf AUS oder umgekehrt)

Führe wieder den Befehl  set ... nochmal aus

und schaue auf die letzten Einträge im LOGFile

da müsste so etwas stehen ...

2018.10.30 hh:mm:ss 2: WeConn Sub SchukoWiFi01: IO::Socket::INET=GLOB(0x5f8c8c0) :: Action: info :: Status: 1/on :: 1,2,3,0,188,3,0,0,1,0,0,0,92,108,92,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,221,144,230,145,62,0,0,1,0,0,.....

Schicke mir die beiden LOG-Einträge

Gruß
Carsten
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

swatkris

Hallo Carsten,

erstmal Danke, dass Du Dir die Zeit nimmst.

Du findest das "Master" Logfile als Anhang an diesen Eintrag.

Deine Schritte habe ich genau so ausgeführt. Beim Set Befehl kam auch kein Fehler. Allerdings finde ich im Logfile keinen EIntrag, der dem entspricht, was Du beschrieben hattest.
Hier sind die Zeilen nach den Befehlen :
2018.10.31 07:09:54 3: Check_SchukoWiFi01: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.

2018.10.31 07:13:38 1: ERROR evaluating {WeConn("SchukoWiFi01","7CDD90EE80B1","192.168.151.220","info");;}: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.

2018.10.31 07:13:38 3: Check_SchukoWiFi01: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.

2018.10.31 07:14:35 1: ERROR evaluating {WeConn("SchukoWiFi01","7CDD90EE80B1","192.168.151.220","info");;}: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.

2018.10.31 07:14:35 3: Check_SchukoWiFi01: Can't locate object method "new" via package "IO::Select" at ./FHEM/99_myWeconn.pm line 68.


Mehr steht halt im Logfile nicht drinne.

Gruß

Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

cnkru

Hallo Kristian,

das Select Modul wird nicht geladen ...
Versuche mal die Zeile nachzutragen in der Sub WeConn:
#
sub
WeConn($$$$)
{
use IO::Socket;
use IO::Select;
use strict;


Wurde bei mir global geladen ...

Gruß
Carsten
RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

swatkris

*** SOLVED ***
Hallo Carsten,
vielen, vielen Dank.
Du hast mir echt sehr gut geholfen.
Nun funzt alles wie gewünscht.
Hast Du es eigentlich auch schon geschafft die Verbrauchswerte abzufragen ?
Viele Grüße
Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

cnkru

#31
Guten Morgen Kristian,

super - das es geklappt hat ...

Bzgl. Deiner Frage zu den Verbrauchswerten kann ich Dir nur sagen, dass ich nicht den Schwerpunkt darauf gelegt habe.

Die S171 sendet einen Broadcat auf 192.xxx.xxx.255 am Port 9957 (ist in Wireshark zu sehen).
Man kann einen Server schreiben mit  einer "while (1)" Prozedure, welche ständig diese Message abfragt und auswertet.
Wie die empfangene Message strukturiert ist - muss noch analysiert werden.
Die Analyse in Wireshark  bedarf etwas Zeit und verschiedene Lastwechsel sowie on/off Vorgänge, um die Verbrauchswerte akurat dekodieren zu können.

Übrigens der Server sollte nicht im FHEM laufen (Blockade)!

D.h. er muss auf Unix Ebene als eigener Prozess im Hintergrund laufen und per wget,  ... , etc.,
das FHEM-System informieren und entsprechend vorgesehende Readings setzen.

Bis dato hatte ich noch keine Zeit und Motivation dies auszuprobieren.

Gruß
Carsten



RPi4, Razberry, ZWAVE (Thermostate, Dimmer, Schalter, Multisensor), Milight-LED, Wifi (IPCAM, Fritz!DECT, Sonoff), alexa, Hombridge, Velux-Rollos, Viessman-API, iobroker, SENEC

swatkris

Hallo Carsten,danke für Deine Info.

Ich bin im Linux Umfeld nicht so stark beheimatet.Aber dennoch auch hier ein dickes DANKE !.
Viele Grüße
Kristian
System1 (Standort 1) : Lenovo Thinkpad T60, DEBIAN, FHEM, Node-Red, 1Wire, RS485 / ModBus
System2 (Standort 2) : Raspberry Pi, FHEM, Node-Red, 1Wire, NodeMCU m. ESPEasy per MQTT, Verbindung zwischen den Standorten per VPN über LANCOM Router
System3 (Standort 2, Reserve) : Cubietruck, FHEM, Node-Red

Volker Kettenbach

Zitat von: cnkru am 01 November 2018, 09:49:54
Guten Morgen Kristian,

super - das es geklappt hat ...

Bzgl. Deiner Frage zu den Verbrauchswerten kann ich Dir nur sagen, dass ich nicht den Schwerpunkt darauf gelegt habe.

Die S171 sendet einen Broadcat auf 192.xxx.xxx.255 am Port 9957 (ist in Wireshark zu sehen).
Man kann einen Server schreiben mit  einer "while (1)" Prozedure, welche ständig diese Message abfragt und auswertet.
Wie die empfangene Message strukturiert ist - muss noch analysiert werden.
Die Analyse in Wireshark  bedarf etwas Zeit und verschiedene Lastwechsel sowie on/off Vorgänge, um die Verbrauchswerte akurat dekodieren zu können.

Übrigens der Server sollte nicht im FHEM laufen (Blockade)!

D.h. er muss auf Unix Ebene als eigener Prozess im Hintergrund laufen und per wget,  ... , etc.,
das FHEM-System informieren und entsprechend vorgesehende Readings setzen.

Bis dato hatte ich noch keine Zeit und Motivation dies auszuprobieren.

Gruß
Carsten

Das geht auch mit FHEM. Siehe 77_SMAEM.pm. Das funktioniert genauso.