Autor Thema: 98_myStrom.pm - myStrom WLAN Energy Control Switch  (Gelesen 7180 mal)

Offline arallon

  • New Member
  • *
  • Beiträge: 18
98_myStrom.pm - myStrom WLAN Energy Control Switch
« am: 11 August 2015, 23:46:25 »
Hallo zusammen

ich habe mir vor kurzem erst mein FHEM Server aufgesetzt und mal ganz langsam angefangen ein paar Devices einzubinden. Gestern habe ich mir dann ein WLAN Energy Control Switch von myStrom gekauft. Neben einer Möglichkeit diesen über die Swisscom Internet-Box (besitze ich nicht) gibt es auch die Möglichkeit diesen über eine App von myStrom zu steuern. Zusätzlich gibt es aber ein REST-Interface mit den Funktionen:

- Einschalten
- Ausschalten
- Report abrufen

Der Report kommt im Json Format zurück und sieht beispielsweise so aus:
{
  "power":  9.310672,
  "relay":  true
}


Zuerst wollte ich die Steckdose via HTTPMOD Modul ansprechen und konfigurieren. Obwohl mir Perl und FHEM neu sind habe ich mich aber dazu entschlossen den Versuch zu wagen ein "Modul" zu schreiben.

Ein Device wird folgendermassen definiert. Wobei das Setzen eines Intervals optional ist. Default sind 15 Sekunden.
 
define <name> myStrom <ip-address> [interval]
 
Beispiel:
define mySwitch1 myStrom 192.168.0.12 10
 

Je nach Interval wird der JSON-Report angefordert und in readings geschrieben. Hier gibt es analog der zurück gelieferten Daten die readings: power und relay. relay wird mit on für true und off für false belegt.

Als Set-Funktionen gibt es die Möglichkeit die Steckdose ein- und auszuschalten, sowie ein Update des Reports zu initiieren:

set mySwitch1 on
set mySwitch1 off
set mySwitch1 update
 

Hier ist mal ein erster Wurf falls jemand aus der Schweiz auch solche Steckdosen im Einsatz hat oder über eine Anschaffung nachdenkt. Was definitiv noch fehlt sind Log-Einträge bzw. ein eigenes Log File um sich z.B ein SVG zu erstellen für den Stromverbrauch. Und die Umstellung auf HTTPNonBlocking.


Für Anregungen und Erweiterungen bin ich natürlich offen.

Grüsse

mike

package main;
use strict;
use warnings;
use JSON qw( decode_json );
use HttpUtils;
 
sub myStrom_Initialize($) {
       
    my ($hash) = @_;
   
    $hash->{DefFn}      = 'myStrom_Define';
    $hash->{SetFn}    = "myStrom_Set";
    $hash->{UndefFn}    = "myStrom_Undef";
    $hash->{AttrList}= $readingFnAttributes;
}

sub myStrom_Define($$) {
    my ($hash, $def) = @_;
    my @param = split("[ \t][ \t]*", $def);
   
    if(int(@param) < 3) {
        return "too few parameters: define <name> myStrom <ip-address> [interval]";
    }
    my $interval = '15';
    if(int(@param)>=4) {$interval = $param[3]; }
    $hash->{NAME}  = $param[0];
    $hash->{ip} = $param[2];
    $hash->{INTERVAL} = $interval;
   
    myStrom_getData($hash,1);
    InternalTimer(gettimeofday()+$hash->{INTERVAL}, "myStrom_GetUpdateTimer", $hash, 0);   
    return undef;
}

sub myStrom_getData($$){

  my ($hash, $blocking) = @_;
  my $myurl = "http://" .$hash->{ip} . "/report";
  my $name = $hash->{name};
   # Blocking nur nehmen, für die Lokal aufgerufene Funktion also direkt aus dem GUI für den Timer die nicht wartende verwenden bzw nur beim Define . Auswerten der Daten in eigene Funktion übernehmen
   # trigger für Init und nicht Init bei der FUnktion mitgeben für neuen Timer
  if ($blocking) {
    my ($err,$response) = HttpUtils_BlockingGet(
{
  url        => $myurl,
  timeout    => 5,
}
);
   
    if( defined($err) && $err ) {
      Log3 $name, 3, "Error while getting data from myStrom adapter: ".$err;     
      return;
    }

    if (defined($response) && $response ne '') {   
      my $decode = decode_json($response);     
      readingsSingleUpdate($hash, "power", $decode->{'power'}, 1);         
      my $relay = $decode->{'relay'};     
      if ( $relay eq '1' ) {       
        readingsSingleUpdate($hash, "relay", 'On', 1);
        $hash->{STATE} = 'On';
      } else {
        readingsSingleUpdate($hash, "relay", 'Off', 1);
        $hash->{STATE} = 'Off';
      }
    } 
  }
}

sub myStrom_GetUpdateTimer($)

  my ($hash) = @_;
  my $name = $hash->{NAME};
  myStrom_getData($hash,1); 
  InternalTimer(gettimeofday()+$hash->{INTERVAL}, "myStrom_GetUpdateTimer", $hash, 1);
  return 1;
}

sub myStrom_Set($@) {
  my ($hash, @a) = @_;
  my $cmd= $a[1];
  my $cList = "On:noArg Off:noArg Update:noArg";
  # usage check
  if((@a == 2) && ($a[1] eq "Update")) {
    RemoveInternalTimer($hash);
    myStrom_GetUpdateTimer($hash);
    return undef;
    } elsif ($a[1] eq "On") {
    RemoveInternalTimer($hash);
    GetFileFromURLQuiet("http://".$hash->{ip}."/relay?state=1", 3, undef, undef, undef);
    myStrom_getData($hash,1);
    myStrom_GetUpdateTimer($hash);
    return undef;
  } elsif ($a[1] eq "Off"){
    RemoveInternalTimer($hash);
    GetFileFromURLQuiet("http://".$hash->{ip}."/relay?state=0", 3, undef, undef, undef);
    myStrom_getData($hash,1);
    myStrom_GetUpdateTimer($hash);
     return undef;
  } else {
    return "Unknown argument $cmd, choose one of $cList";
  }
}

sub myStrom_Undef($$) {

  my ($hash, $arg) = @_;

  RemoveInternalTimer($hash);
  return undef;
}
1;
[/code]

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #1 am: 12 August 2015, 20:16:24 »
Hallo Mike
Cool, ich habe mir auch eine bestellt bei Swisscom und erwarte sie morgen. Ich werde berichten...
Gruess Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #2 am: 13 August 2015, 10:23:08 »
Hoi Dani

Dann bin ich gespannt. Wenn ich das richtig gesehen habe, gibt es auch noch eine API für das Portal von myStrom, wenn man seine Steckdose dorthin verbunden hat (min, max werte etc. abrufbar).
Ich habe meine Steckdose jedoch nicht mit dem Portal verbunden und auch sichergestellt, dass diese keine Verbindung zum Internet hat.

Falls du deine verknüpft mit dem Portal würde mich mal interessieren, welche Daten dort abgelegt warden und ob ersichtlich ist, ob diese regelmässig abgerufen werden oder ob die Steckdose diese Daten vorhält aber nicht über das REST-Interface zur Verfügung stellt.

Merci und Gruss

mike

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #3 am: 13 August 2015, 20:48:41 »
Hoi Mike
Mein Adapter ist heute angekommen. Ich habe ihn über das Webiface angemeldet, da ich wie du auch keine Internet-Box besitze (ich habe die FritzBox7390 in Betrieb). Die Integration ist sehr einfach gegangen als nächstes habe ich dein Modul geladen, jedoch kommt immer die Meldung:
Cannot load module myStrom
Die Berechtigungen des Moduls habe ich überprüft, die sind gleich wie bei den anderen (fhem/dialout).
Hast du eine Idee, ansonsten werde ich versuchen, ihn über HTTPMOD einzubinden.

Viele Grüsse Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #4 am: 13 August 2015, 20:50:18 »
Hast du JSON installiert bei dir? Das wäre mal so der erste Anhaltspunkt. Gibt es sonst noch etwas im Log ?

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #5 am: 13 August 2015, 20:59:57 »
Hast du JSON installiert bei dir?
Genau, das war es!!! Danke jetzt hat das define geklappt  :D

Funktioniert einwandfrei - Danke vielmals für deine Hilfe und das tolle Modul, werde mir noch weitere zulegen.

Viele Grüsse Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #6 am: 13 August 2015, 21:13:12 »
Hast du dich bei myStrom angemeldet?

Ich hatte heute Kontakt mit íhnen für ein Firmware Upgrade. Zukünftig kann man das auch selber, wenn man einmal die neue hat. Registrieren musste ich mich dafür nicht, nur die Steckdose kurz ins Internet lassen und die Mac Adresse mitteilen.

Habe auch nachgefragt, wie das mit dem Portal so funktioniert. Die Steckdose meldet ca alle 30 Sekunden die Daten an die Cloud. Wenn hohe Stromschwankungen sind im Verbrauch, dann auch öfter.
Das bedeutet für mich, dass die Daten dort eigentlich auch mehr Durchschnittsberechnungen sind, als wirklich effektive Verbrauchsdaten. Wenn ich alle 10 Sekunden abrufe, bin ich da nicht schlechter in der Datenerhebung ohne Cloud.

Auf die toDo Liste für nächste Woche kommt auf jeden Fall mal readings einfügen für Maximum Wert, TagesMax, und evtl Durchschnitt und Gesamtverbrauch. Nur mal überlegen wie man hier die Daten so ablegen und wieder verwerten kann ohne dauernd das Log auswerten zu müssen.

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #7 am: 13 August 2015, 21:24:35 »
Nein, ich habe mich bei myStrom über meinen Facebook angemeldet.
Kannst du mir sagen, wie du den Firmware Update gemacht hast?

Auf die neuen Features freue ich mich, dann muss ich keine Perl berechnungen schreiben :)
Gruess Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #8 am: 13 August 2015, 21:28:47 »
Ich habe den Support kontaktiert. Wenn du dich allerdings angemeldet hast, könnte es evtl. auch über das Webinterface gehen?
Ansonsten Support anschreiben, Mac Adresse der Steckdose mitteilen und die Dose muss Zugang zum Internet haben. Dann machen die das und schicken dir eine Mail wenn erledigt.
Support hat sehr schnell geantwortet und mir um 19:20 noch die Dose aktualisiert. Also echt nett.

Wie hättest du vor gehabt die Berechnungen zu machen? Bin gerade etwas am überlegen wie man das am schlausten und "Ressourcenschonend" umsetzen könnte. Bin absoluter FHEM Neuling :)

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #9 am: 13 August 2015, 21:41:12 »
Hoi Mike
Ich hätte bei meinem EW nachgeschaut, wann Niedertarif und Hochtarifzeiten sind und die ensprechenden Kosten pro kwh.
Dann du den Zeiten pro Tag einen at definiert, der mir den aktuellen Stand in der Steckdose holt, den Wert vom alten subtrahiert und das ganze wieder in ein Reading eines Dummy geschrieben.
Am Ende des Tages (23:59:59) alle werte (hochtarif, niedertarif) multipliziert mit den Tarifen und Summe / Vebrauch in ein Log geschrieben...

In der Theorie sollte das irgendwie funktionieren, aber es wäre sicherlich ein Aufwand (für mich) von ein paar Stunden..

Viele Grüsse Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #10 am: 13 August 2015, 21:50:32 »
Entweder ich stehe auf dem Schlauch gerade oder das funktioniert so nicht ganz, oder wie oft willst du das aufrufen? Die Steckdose liefert dir ja den aktuellen Verbrauch nicht den Gesamtverbrauch.


Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #11 am: 13 August 2015, 21:59:20 »
Stimmt! Ich habe mir das noch zuwenig angeschaut, deshalb voll hineingefallen. Du hast recht, das ist nicht so einfach wenn nur der aktuelle Verbrauch angezeit wird....
Ich werde mir das mal noch überlegen...
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #12 am: 13 August 2015, 22:21:06 »
Hätte noch einen kleinen Verbesserungsvorschlag:
Könntest du bei den Set Befehlen on und off klein schreiben, anstelle von On und Off?

Danke!
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

Offline arallon

  • New Member
  • *
  • Beiträge: 18
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #13 am: 13 August 2015, 23:48:12 »
Das ist natürlich kein Problem. Habe es mal konsequenterweise überall klein geschrieben.

Zusätzlich liest diese Version nun noch ein paar Infos mehr raus z.B softwareversion, ssid, Network mode, macaddress. Diese Infos werden alle 5 Minuten geholt und nur bei Änderung aktualisiert. Hier denke ich aber noch darüber nach, dass nur ein bei einem Abbruch der Verbindung wieder geprüft wird und zusätzlich 1 mal pro Tag oder so. Ein set update löst immer aus.

Es wird neu nun auch ein 5 Minuten Timer statt dem normalen Interval gesetzt, falls die Dose nicht erreichbar ist. So wird nicht dauern ein Error ins Log geschrieben. Ich denke der Log Eintrag ist wohl auch hinfällig, da ich einen Connection Status hinzugefügt habe.

Einfach mal testen. Feedback ist natürlich super. Danke dir.


Edit: Direkt noch einmal nachgebessert. Ich nehme an du wolltest das gerne, damit man direkt das Birnchen sieht und on / off schalten kann im Interface. Der Status wurde aber nicht direkt gesetzt, da ich den erst nach erneutem Aufruf der API gesetzt habe. Das habe ich nun geändert und setzte bei Klick auf "on" einfach mal STATE = on. Sollte die Dose nicht erreichbar sein, korrigiert sich der Status ein paar Sekunden später direkt wieder auf off.
« Letzte Änderung: 14 August 2015, 01:48:01 von arallon »
Hilfreich Hilfreich x 1 Liste anzeigen

Offline eppi

  • Full Member
  • ***
  • Beiträge: 302
Antw:98_myStrom.pm - myStrom WLAN Energy Control Switch
« Antwort #14 am: 14 August 2015, 20:13:13 »
Hoi Mike
Danke für die neue Version. Ich habe sie getestet funktioniert einwandfrei!
Auch die Infos (SW Version, SSID, ect) in den Internals sichtbar.

Mit dem mystrom Support bin ich immer noch daran, diesen in mein mystrom-konto zu verschieben, da der facebook Login über den PC nicht funktioniert!
Ich bin gespannt auf deine weiteren Features  ;)
Viele Grüsse Dani
HM, FS20, CUL, CUNO V1, CUNO V2, HMLAN, FHT, S555, SIS-PM, IT, OWFS,  DebianWheezy@ODROID-U3

 

decade-submarginal