[Modul] G-Homa WLAN-Steckdosen

SDK Version Version
License Check Style Run Tests
Spenden

GHoma

Ermöglicht das Auffinden, Konfigurieren und Steuern von WLAN-Steckdosen vom Hersteller G-Homa.

Inhaltsverzeichnis

1. Funktionsumfang

G-Homa Plug:

  • Steuern des Schaltzustands.
  • Empfangen und Darstellen des Schaltzustands, sowie der Energiemessung.

G-Homa Discovery:

  • Auflisten alle im Netzwerk verfügbaren Geräte.
  • Erstellen von neuen ‚G-Homa Plug‘-Instanzen in IPS.
  • Abfragen der Konfiguration der Geräte.
  • Konfigurieren der Geräte für den Betrieb mit IPS.
  • Konfigurieren von Parametern für Netzwerk und Zeitserver der Geräte.

2. Voraussetzungen

  • IPS 6.3 oder höher
  • G-Homa WLAN-Steckdosen

3. Software-Installation

Über den ‚Module-Store‘ in IPS das Modul ‚G-Homa‘ hinzufügen.
Bei kommerzieller Nutzung (z.B. als Errichter oder Integrator) wenden Sie sich bitte an den Autor.
Module-Store

4. Einrichten der Instanzen in IP-Symcon

Details sind in der Dokumentation der jeweiligen Module beschrieben.
Es wird dingend empfohlen die Einrichtung mit dem G-Homa Discovery zu starten.

Die Geräte müssen eine spezielle Konfiguration erhalten, welche über den ‚Discovery‘
an die Geräte übertragen werden muss.

Damit IPS die Geräte findet, müssen diese im WLAN erreichbar sein.
Außerdem müssen Symcon und die Geräte im gleichen IP-Segment sein, da die Discovery-Instanz über einen UDP Broadcast läuft.

Um die Geräte mit dem eigenen WLAN zu koppeln, kann die Hersteller APP genutzt werden.

Alternativ ist es auch über folgenden Weg auch IPS möglich:

  • IPS muss auf einem Gerät installiert sein, welches über eine WLAN-Schnittstelle verfügt.
  • Die Geräte müssen auf Werkseinstellung gesetzt sein (schnelles Blinken der LED).
  • Das neue Gerät mit einem ca. 3 Sekunden Tastendruck in den AP-Modus versetzen.
  • Der Host von der IPS installation muss mit dem AP ‚G-Homa‘ verbunden werden (DHCP muss aktiv sein!).
  • Anschließend ist die Instanz ‚G-Homa Discovery‘ zu öffnen. Wird kein Gerät angezeigt, so ist der Button ‚aktualisieren‘ zu betätigen.
  • Das neu gefundene Gerät ist in der Liste des ‚G-Homa Discovery‘ auszuwählen.
  • Anschließend muss über den Button Ausgewähltes Gerät konfigurieren die WLAN Konfiguration eingetragen werden und abschließen mit dem Button ‚Schreibe WLAN‘ an das Gerät übertragen werden.
  • Weitere Konfiguration siehe im G-Homa Discovery:

5. Anhang

1. GUID der Module

Modul Typ Prefix GUID
GHoma Plug Device GHOMA {5F0CF4B0-7395-4ABF-B10F-AA0109A0F016}
GHoma Discovery Discovery GHOMA {535EF8FE-EE78-4385-8B61-D118FAE5AE5A}

2. Hinweise

Die Konfiguration der Geräte kann jederzeit über ein verbundenes WLAN/LAN oder den integrierten Access-Point
ausgelesen und verändert werden.
Der Zugriff ist nicht abgesichert und somit können auch gespeicherte WLAN-Zugangsdaten
ausgelesen werden.
Die Geräte sollten somit nicht im öffentlich zugänglichen Bereich betrieben werden,
da über einen langen Tastendruck der AP-Modus (unverschlüsselt!) aktiviert wird und
alle Daten ausgelesen werden können.

Dieses Modul trennt die Verbindung von den Geräten zur (chinesischen) Cloud.
IPS fungiert für die Geräte als Master und eine verlorene Verbindung zu IPS wird
mit einer blinkenden LED an den Geräten signalisiert.

3. Changlog

Version 6.0:

  • Konfigurator in Discovery Instanz geändert.
  • Discovery benötigt keinen IO mehr.
  • Konfigurieren der Geräte über das Konfigurationsformular der Discovery-Instanz komplett überarbeitet.
  • Verwaltung des verbundenen Gerätes in der Geräte-Instanz überarbeitet.

Version 5.0:

  • Intern Überarbeitet.

Version 2.0:

  • Geräte werden über den Server Socket angebunden anstatt wie bisher über einen Client Socket (Nur für IPS 5.0)

Version 1.1:

  • Fixes für IPS 5.0

Version 1.0:

  • Erstes offizielles Release

6. Spenden

Die Library ist für die nicht kommerzielle Nutzung kostenlos, Schenkungen als Unterstützung für den Autor werden hier akzeptiert:

Wunschliste

7. Lizenz

CC BY-NC-SA 4.0

frohes Neues Michael,

kurz probiert, und geht.
Allerdings finde ich die G-Homa etwas zickig, aber mal mit spielen.:slight_smile:

Schön das es läuft.
Für die 9,99€ wenn die Geräte im Angebot sind, kann man nicht viel falsch machen. Aber auch nicht so viel erwarten.

Leider ist die Umsetzung noch nicht 110% :wink:
Aber bis Paresy den ServerSocket von IPS nicht anpasst, muss es reichen :slight_smile:
Gibt die Teile ja auch mit Energiemesser, allerdings habe ich weder so ein Gerät noch Code gesehen wo die Daten ermittelt werden.

Michael

Und was ich gerade noch sehe,
ich habe die mit Leistungsmessung für jetzt 14.99 EUR.

Cool :slight_smile:
Kann man da etwas im Debug der Instanz sehen?
Außer dem Heartbeat?
Eventuell kann man da etwas rückrechnen wenn man einen definierten Verbrauch misst.
Michael

Leistungsmessung mit Register Var und Skript geht.
Mal zusammen gebastelt, um zu sehen was kommt.


<?
   if ($_IPS['SENDER'] == "RegisterVariable")
    {
       $data = $_IPS['VALUE'];
//       var_dump (ResultToHexDisplay($data));
		 $data =ResultToHexDisplay($data);
       $laenge = strlen($data);
//       var_dump ( ($laenge) );
/*
07.01.2018 11:56:27 | Register Variable | string(59) "5AA5001690010AE03523D32B8EFFFE018139000001012000017F465BB5
"
string(3) "58
"
*/
       if ($laenge == 58){
         $arr = str_split($data, 2);
         var_dump ($arr[22]);
		 var_dump ($arr[21]);
         SetValue(38565 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\g-homa string]*/  , $data);
			if ($arr[22] == "20")
			{
				$data = "0x".$arr[23].$arr[24].$arr[25].$arr[26];
				var_dump ($data);
				if ($arr[21] == "03")
				{
					$tmp = ( (intval($data,0))/256) / 100;
			      SetValue(31217 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\Volt]*/  , $tmp);
				}
				if ($arr[21] == "01")
				{
					$tmp = ((intval($data,0))/256) /100;
			      SetValue(19053 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\Watt]*/  , $tmp);
				}
				if ($arr[21] == "04")
				{
					$tmp = ((intval($data,0))/256 /100) ;
			      SetValue(31577 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\Ampere]*/  , $tmp);
				}
				if ($arr[21] == "05")
				{
					$tmp = ((intval($data,0))/256 /100) ;
			      SetValue(52505 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\Hertz]*/  , $tmp);
				}
				if ($arr[21] == "07")
				{
					$tmp = ((intval($data,0))/256 /100) ;
			      SetValue(58145 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\07]*/  , $tmp);
				}
				if ($arr[21] == "08")
				{
					$tmp = ((intval($data,0))/256 /100) ;
			      SetValue(57126 /*[Sonoff-Module\TS\G-Homa Plug\Register Variable g-homa\08]*/  , $tmp);
				}												
			}
       }
    }

function ResultToHexDisplay($Result)
    {
    $ResultConv = "";
    for ($x = 0; $x < (strlen($Result)); $x++)
        {
        if (ord($Result[ $x ]) < 16) $ResultConv .= "0";
        $ResultConv .= strtoupper(dechex(ord($Result[ $x ])));
        } 
    return $ResultConv;
    } 
?>

STATE var wird bei Empfang von :
5A A5 00 16 90 01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 03 20 00 59 16 55 5B B5

auf false gesetzt, Dose bleibt aber an.
Passiert immer, wenn die „Volt“ übetragen werden,

Danke für die ganzen Daten und Infos.
Sobald ich Zeit habe, baue ich das ein.
Das der STATE falsch gesetzt wird kann durchaus sein, muss ich prüfen ob ich da nicht ein Bit zuviel berücksichtige.
Michael

gerne Michael…

und noch einer.
Das könnte die Gesammtleistung in W/h sein :
5A A5 00 16 90 01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 02 00 00 01 55 8F 5B B5

Habe es mal grob per 60W „Glühobst“ probiert.
Aber die Werte kommen nur sporadisch von selber.
Da habe ich etwas nachgeholfen, und sende 1x pro Minute „GHOMA_Timeout“, kurz danach trudeln dann die Werte ein.

Die letzen 4 Bytes vor 5B B5 sind die Messwerte, meiner Meinung.

ps und lass dir Zeit mit dem einbauen, bin noch nicht 100% sicher, ob das alles richtig ist.

08 ist der Leistungsfaktor.
07 ist die Scheinleistung oben aus dem Skript

getestet mit LED’s, Glühobst.

Bitte mal „gegentesten“, wer die Dinger hat.

$data = "0x".$arr[23].$arr[24].$arr[25].$arr[26]; 

ist falsch, muss so sein:

$data = "0x".$arr[23].$arr[24].$arr[25]; 

Und dann die Berechnung anders machen :

$tmp =  (intval($data,0)) / 100;

$arr[26] scheint die Prüfsumme zu sein.
Sol läuft es jetzt bei mir, und ich werde mal Werte aufzeichnen.

ja der letzte Wert vor dem ‚Tail‘ ist die Checksumme.

Ich versuche das gerade einzubauen, muss aber noch prüfen was mein Gerät sendet.

Die Variablen sollten dann erzeugt werden, sobald ein Messwert eintrifft.

Da ich vorher die unterschiedlichen Typen von Werten nicht unterschieden habe; ist es logisch dass er den Status bei dir falsch anzeigt. Hier wurden dann Messwerte im Vergleich benutzt.

Sehe ich dann richtig, dass 02 das Status des Relais ist ?

Michael

Sehe ich dann richtig, dass 02 das Status des Relais ist ?
Michael

An welcher Stelle bist du da ?

Hier noch mal das neuste Registerskript, dann sollte „02“ klar sein.


<?
    if ($_IPS['SENDER'] == "RegisterVariable")
    {
       	$data = $_IPS['VALUE'];
		$data =ResultToHexDisplay($data);
       	$laenge = strlen($data);
		$arr = str_split($data, 2);
		$mac = $arr[10].$arr[11].$arr[12];

       if ($laenge == 56){
         $data = "0x".$arr[24];
		 $tmp = ( (intval($data,0))) ;
         $id = CreateVariableByName($_IPS['INSTANCE'], "Status", 1);
         SetValue($id, $tmp);
       }
	   
       if ($laenge == 58){
			if ($arr[22] == "00")
			{
				$data = "0x".$arr[23].$arr[24].$arr[25];
				if ($arr[21] == "02")
				{
					$tmp = ( (intval($data,0))/1000) ;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Verbrauch", 2);
					SetValue($id, $tmp);
				}
			}
			if ($arr[22] == "20")
			{
				$data = "0x".$arr[23].$arr[24].$arr[25];
				if ($arr[21] == "03")
				{
					$tmp = ( (intval($data,0))) / 100;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Spannung", 2);
					SetValue($id, $tmp);
				}
				if ($arr[21] == "01")
				{
					$tmp = ((intval($data,0))) /100;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Leistung", 2);
					SetValue($id, $tmp);
				}
				if ($arr[21] == "04")
				{
					$tmp = ((intval($data,0)) /100) ;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Strom", 2);
					SetValue($id, $tmp);
				}
				if ($arr[21] == "05")
				{
					$tmp = ((intval($data,0)) /100) ;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Frequenz", 2);
					SetValue($id, $tmp);
				}
				if ($arr[21] == "07")
				{
					$tmp = ((intval($data,0)) /100) ;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Scheinleistung", 2);
					SetValue($id, $tmp);
				}
				if ($arr[21] == "08")
				{
					$tmp = ((intval($data,0)) /100) ;
					$id = CreateVariableByName($_IPS['INSTANCE'], "Powerfaktor", 2);
					SetValue($id, $tmp);
				}												
			}
       }
    }

function ResultToHexDisplay($Result)
    {
    $ResultConv = "";
    //$datalong   = (strlen($Result));
    for ($x = 0; $x < (strlen($Result)); $x++)
        {
        if (ord($Result[ $x ]) < 16) $ResultConv .= "0";
        $ResultConv .= strtoupper(dechex(ord($Result[ $x ])));
        } //$x = 0; $x < $datalong; $x++
    return $ResultConv;
    } //function ResultToHexDisplay( $Result )

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);
   }
   return $vid;
}

?>

Taster und Zustand kommt das im LOG :

An Taster Dose
Aus 5A A5 00 15 90 01 0A E0 35 23 D3 2B 8E FF FE 01 81 11 00 00 01 00 00 00 00 0F 5B B5
ein 5A A5 00 15 90 01 0A E0 35 23 D3 2B 8E FF FE 01 81 11 00 00 01 00 00 00 FF 10 5B B5

Aus IPS :
Aus
send 5A A5 00 17 10 01 01 0A E0 35 23 D3 2B 8E FF FE 00 00 10 11 00 00 01 00 00 00 00 00 5B B5
rec 5A A5 00 15 90 01 0A E0 35 23 D3 2B 8E FF FE 01 11 11 00 00 01 00 00 00 00 7F 5B B5
ein
send 5A A5 00 17 10 01 01 0A E0 35 23 D3 2B 8E FF FE 00 00 10 11 00 00 01 00 00 00 FF 01 5B B5
rec 5A A5 00 15 90 01 0A E0 35 23 D3 2B 8E FF FE 01 11 11 00 00 01 00 00 00 FF 80 5B B5

GRR, komme da immer zu schnell wieder raus.:confused:
Aber so läuft es im Moment, und die Werte sehen gut aus, im Vergelich zu Homematic, zwave und Sonoff.
Ich häbe die Stecker immer mal zum testen hintereinander an der gleichen LAST.

Und keinen Stress machen Michael, aber „so schlecht“ sind die GHoma nicht, Sonoff ist da nicht ganz so gut.
Homematic Stecker und GHoma nehmen sich nichts, scheint gleich zu sein, Sonoff „pendelt“ etwas mehr.

Vergiss es, war falsch.

Hier mal die bereinigen Werte, wenn man den Anfang ( Startbytes, Längenfeld und Commando) und das Ende (Checksumme und EndBytes) weglässt. Entspricht dem, was im Debug bei Receive->Payload steht.


Bytes               0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Messung            01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 01 20 00 01 7F
Messung            01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 02 00 00 01 55
Messung                                    FF FE 01 81 39 00 00 01 03 20 00 59 16
Messung            01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 07 20 00 04 80
Messung            01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 03 20 00 59 16
???                01 0A E0 35 23 D3 2B 8E FF FE 01 81 39 00 00 01 02 00 00 00 32 
SchaltenEin remote 01 0A E0 32 23 94 72 86 FF FE 01 11 11 00 00 01 00 00 00 FF
SchaltenEin remote 01 0A E0 35 23 D3 2B 8E FF FE 01 11 11 00 00 01 00 00 00 FF
SchaltenAus lokal  01 0A E0 32 23 94 72 86 FF FE 01 81 11 00 00 01 00 00 00 00

Somit sind die Messwerte immer an Stelle 18 bis 20.
Der Typ der Messung an 16. Stelle.
Und Byte 12 gibt an ob es eine Messung ist (0x39) oder Status vom Relay (0x11).
Gibt es bei der Messung auch als Typ an Stelle 16 auch den Wert 0x06 ?
Eventuell die Blindleistung ?

Ansonsten kann ich nur das mit den drei ??? nicht nachvollziehen.
Ist eine Messung (0x39), aber da ist keine 0x20 an Stelle 17 wie bei den anderen.
Der Wert errechnete Wert aus x00 x00 x32 wäre ja 0,5. Nur was soll das sein :confused:

Der ‚Rest‘ ist jetzt online zum testen verfügbar.

Michael

Ok Michael,

mal gerade geschaut :

5A A5 00 16 90 01 0A E0 35 23 D3 64 94 FF FE 01 81 39 00 00 01 02 00 00 0C F4 A6 5B B5

Ist bei mir der „Verbrauch“.
Dein Byte 17 macht mir noch Kummer, ist bei allen Messwerten „20“ nur beim Verbrauch ist es „00“.
Also so wie es es geloggt habe, der Gesamtverbrauch, aber das schaue ich mir noch mal an, ob es hier passt.

Könnte aber ‚sinnvoll‘ sein.

20 Für Absolutwerte
00 für Zählerwerte
oder so :smiley:

Mhh. eventuell auch 00 vor dem Relais und 20 hinter dem Relais ? Dann sollten da aber mehrere kommen.
Wobei ich auch nicht weiß, ob man die Messung aktiv abfragen kann.

Ist der Verbrauch auch / 100 in kwh ?

Michael

Ich habe oben stehen :
$tmp = ( (intval($data,0))/1000) ; :wink:

Und dein Modul läuft hier jetzt auch, aber noch mit den Reg Skript und auch den alten VAR’s um zu sehen was passiert.:smiley:

ps. alles was geloggt wird, sind die alten Werte seit knapp 2 Tagen.

Oh, übersehen. Ich ändere das eben auf / 1000.
Die Profile sind zum Großteil aus IPS und haben somit nur 2 Kommastellen, sonst musst du das Profil per Hand korrigieren.

Die Variablenamen passe ich demnächst noch mal an, solltest also meine noch nicht loggen :wink:

Michael

Topp Modul Michael,
da muss ich noch was gut machen.:smiley:

Jetzt noch ein paar kleine Dinge finden, was noch „blöd“ sind, z.B. Stecker raus ziehen und in ander Steckdose stecken, und nichts geht mehr. Das ist aber nicht nur deine Baustelle.
Das muss jetzt aber etwas warten, bis zum 27ten oder später.
Das schöne an deinem Modul ist einfach, es geht nichts mehr ins I-Net, und alles läuft im lokalem Netzwerk.

ICh sage erst mal nur DANKE, denn durch dein Modul lassen sich kostengünstige Lösungen aufbauen, die einen richtigen Mehrwert haben.