Neues Modul: ESPEasy [war: ESPEasy ohne MQTT]

Begonnen von dev0, 18 Juli 2016, 11:53:28

Vorheriges Thema - Nächstes Thema

dev0

Schon mal ein Ansatz. Wobei ich es sinnvoller fände, toggle nicht als command sondern als parameter des GPIO Befehls zu implementieren:
'set <esp> gpio 15 toggle'.
Hintergrund dieser Ansicht ist, dass auch andere Plugins toggle als Parameter verwenden können. Aus diesem Grund habe ich zB. auch beim RGBWW Lights Plugin Befehle wie rgb, on, off toggle, ... hinter dem eigentlichen Lights Befehl implementiert. So kommen sich die Plugins nicht in die Quere und Chance, das der Patch ins ESPEasy übernomen wird ist größer. Just my 2 cents...

Waldmensch

Naja, Par1-3 sind Integer. Das wär dann ne größere Baustelle geworden, oder man hätte als Par2 dann eine 2 nehmen müssen (0= off, 1= on, 2= toggle)

also set <esp> gpio 15 2

struct EventStruct
{
  byte Source;
  byte TaskIndex;
  byte BaseVarIndex;
  int idx;
  byte sensorType;
  int Par1;
  int Par2;
  int Par3;
  byte OriginTaskIndex;
  String String1;
  String String2;
  byte *Data;
};

dev0

Keine große Baustelle.

statt:

int i = event->Par2;   


so:

str s = parseString(string, 3);
if (s == 0) { ...


Die Variable string wird der Funktion Plugin_001() bereits übergeben.

Waldmensch

So tief habe ich in den Code nicht reingeschaut. Die Arduino IDE ist mir einfach zu grottig um intensiv damit zu arbeiten. Ich brauch das "toggle" auch nicht unbedingt. Wenn es jemand weiterentwickeln will - kein Problem, die Kernfunktionalität lässt sich ja copy/paste verwenden. Ich weiß auch nicht, ob das checken des Pinmode nötig ist. Ich habs vorsichtshalber gemacht, um nicht in einen Fehler bei "jungfräulichem" Pin zu rennen. Keine Ahnung, ob die pinmodesbeim Boot gesetzt werden. Ich bin davon ausgegangen das nicht, weil konsequent im Switch Plugin der Mode jedes mal auf OUTPUT gesetzt wird.

peterboeckmann

Ich glaube nicht, dass man in der Firmware rumbasteln muss.
Reicht es nicht aus, FHEM-seitig je nach aktuellem Status entweder "set <esp> gpio 12 1" oder "set <esp> gpio 12 2" aufzurufen?

Wie gesagt, es geht mir auch nicht um das "toggle" an sich.
Ich will halt nur gerne den Umschalte im AndFHEM-Widget nutzen.

Waldmensch

dann mach einen dummy mit nur einem State und fackel das toggle über ein DOIF ab indem du den aktuellen Zustand des ESP einbeziehst. Das hat aber dann als solches nichts mehr mit dem Modul zu tun.

roelleke

#651
Hallo,
ein Toggle lässt sich auch mit einem benutzerspezifischen Event auf dem ESP erzeugen.
auf dem Relais GPIO muss natürlich ein Switch zur Statusanzeige definiert werden.

Mit der folgenden Rule lässt sich dann der toggle Befehl definieren:

on toggle do
if [Relais#Output]=1
   gpio,13,0
else
   gpio,13,1
endif
endon


Mit dem Befehl:
set ESPEasy_Test raw event toggle
kann man dann schon mal schalten.

Mit evntMap und webCMD kann man dann einen Toggle-Button erzeugen:


attr ESPEasy_Test eventMap /gpio 13 on:on/gpio 13 off:off/gpio 13 gpio:off/gpio 13 output:off/raw event toggle:toggle/
attr ESPEasy_Test webCmd on:off:toggle


Bei mir funktioniert das ganz gut.

dev0


kroonen

Hi,

Testing the esp module with sonoff.

I mad a switch input, on gpio12 and created this in fhem
define Dressoirlamp ESPEasy 192.168.180.71 80 Woonkameresp Dressoirlamp
attr Dressoirlamp IODev Woonkameresp
attr Dressoirlamp devStateIcon on:FS20.on off:FS20.off
attr Dressoirlamp eventMap /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
attr Dressoirlamp group Lampen
attr Dressoirlamp Interval 300
attr Dressoirlamp icon light_cabinet
attr Dressoirlamp readingSwitchText 1
attr Dressoirlamp room Woonkamer
attr Dressoirlamp webCmd on:off
attr Dressoirlamp setState 3
attr Dressoirlamp stateFormat Switch

If works alomst 100%. But if I restart fhem then I get first opened, and than i get value gpio


l Dressoirlamp
Internals:
   DEF        192.168.180.71 80 Woonkameresp Dressoirlamp
   HOST       192.168.180.71
   IDENT      Dressoirlamp
   INTERVAL   300
   IODev      Woonkameresp
   NAME       Dressoirlamp
   NOTIFYDEV  global
   NR         457
   NTFY_ORDER 50-Dressoirlamp
   PORT       80
   STATE      gpio
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    0.8
   Readings:
     2017-01-02 19:23:48   GPIO12          gpio
     2017-01-02 19:23:48   GPIO12_mode     output
     2017-01-02 20:36:15   Switch          gpio
     2017-01-02 20:38:50   presence        present
     2017-01-02 20:43:14   state           present
   Helper:
     fpc        1483386194
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   303
         TRIGGERTIME 02.01.2017 20:48:17
     Received:
Attributes:
   IODev      Woonkameresp
   Interval   300
   devStateIcon on:FS20.on off:FS20.off
   eventMap   /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
   group      Lampen
   icon       light_cabinet
   readingSwitchText 1
   room       Woonkamer
   setState   3
   stateFormat Switch
   webCmd     on:off


If I do an on or off than I get the right value.


[fhem> l Dressoirlamp
Internals:
   DEF        192.168.180.71 80 Woonkameresp Dressoirlamp
   ESP_BUILD  147
   ESP_SLEEP  0
   ESP_UNIT   1
   HOST       192.168.180.71
   IDENT      Dressoirlamp
   INTERVAL   300
   IODev      Woonkameresp
   LASTInputDev Woonkameresp
   MSGCNT     1
   NAME       Dressoirlamp
   NOTIFYDEV  global
   NR         457
   NTFY_ORDER 50-Dressoirlamp
   PORT       80
   STATE      off
   SUBTYPE    device
   TYPE       ESPEasy
   VERSION    0.8
   Woonkameresp_MSGCNT 1
   Woonkameresp_TIME 2017-01-02 20:46:14
   Readings:
     2017-01-02 19:23:48   GPIO12          gpio
     2017-01-02 19:23:48   GPIO12_mode     output
     2017-01-02 20:46:14   Switch          off
     2017-01-02 20:38:50   presence        present
     2017-01-02 20:46:14   state           Swi: off
   Helper:
     fpc        1483386194
     Intat:
       1:
         FN         ESPEasy_statusRequest
         INTERVAL   303
         TRIGGERTIME 02.01.2017 20:48:17
     Received:
       Switch     1483386374
Attributes:
   IODev      Woonkameresp
   Interval   300
   devStateIcon on:FS20.on off:FS20.off
   eventMap   /gpio 12 on:on/gpio 12 off:off/gpio 12 gpio:off/gpio 12 output:off/
   group      Lampen
   icon       light_cabinet
   readingSwitchText 1
   room       Woonkamer
   setState   3
   stateFormat Switch
   webCmd     on:off


Is it possible, that het retrieves the right value when I (re)start fhem?

regards RIchard

peterboeckmann

Zitat von: roelleke am 02 Januar 2017, 20:17:04
Hallo,
ein Toggle lässt sich auch mit einem benutzerspezifischen Event auf dem ESP erzeugen.
auf dem Relais GPIO muss natürlich ein Switch zur Statusanzeige definiert werden.
...

Das Toggle funktioniert auch bei mir auf Anhieb.
Aber scheinbar braucht es doch noch etwas anderes für die Steuerung über AndFHEM. Kennt sich da jemand aus?

dev0

#655
Zitat von: kroonen am 02 Januar 2017, 20:48:37
I mad a switch input, on gpio12 and created this in fhem

Update to the current module version 0.8 first.

Do you have manually created the device Dressoirlamp or was it done by autocreate?
If it was not done by autocreate then your ESP setup is not correct or you have disabled autocreate globally.

Zitat von: kroonen am 02 Januar 2017, 20:48:37
Is it possible, that het retrieves the right value when I (re)start fhem?

Yes.

dev0

Zitat von: peterboeckmann am 02 Januar 2017, 22:03:55
Aber scheinbar braucht es doch noch etwas anderes für die Steuerung über AndFHEM.

Wende Dich am Besten direkt an den AndFHEM Autor and klär was das Widget benötigt.

peterboeckmann

Hallo zusammen,

da das ESPEasy-Modul offenbar doch mächtiger ist, als ich es benötige, bin ich wieder auf meine alte Lösung umgestiegen: ein dummy repräsentiert den Sonoff und ein paar notify (+ ein paar Perl-Methoden) zum steuern.

Falls es jemanden interessiert, hab ich hier mal den Code zusammengestellt:

fhem.cfg:

define LampenNordterrasse dummy
attr LampenNordterrasse setList statusRequest toggle on off
attr LampenNordterrasse webCmd statusRequest:toggle:on:off
define notify_LampenNordterrasse_off notify LampenNordterrasse:off {setEspPINState("192.168.178.121",12,0)}
define notify_LampenNordterrasse_on notify LampenNordterrasse:on {setEspPINState("192.168.178.121",12,1)}
define notify_LampenNordterrasse_statusRequest notify LampenNordterrasse:statusRequest {getEspPINState("LampenNordterrasse","192.168.178.121",12)}
define notify_LampenNordterrasse_toggle notify LampenNordterrasse:toggle {toggleEspPinState("LampenNordterrasse","192.168.178.121",12)}


99_myUtils.pm

sub setEspPINState
{
Log 4, "esp Starte setEspPINState";
my $espdev = $_[0];
my $gpio = $_[1];
my $event = $_[2];
my $ret = "";

Log 4, "setEspPINState Aufruf: http://$espdev/control?cmd=GPIO,$gpio,$event";

$ret .=  system("wget -q -O /dev/null 'http://$espdev/control?cmd=GPIO,$gpio,$event'");
$ret =~ s,[r
]*,,g;
Log 3, "esp $espdev returned: $ret";
}

sub getEspPINState
{
Log 4, "esp Starte getEspPINState";

my $devicename = $_[0];
my $espdev = $_[1];
my $gpio = $_[2];
my $ret = "";

Log 4, "esp Aufruf: http://$espdev/control?cmd=Status,GPIO,$gpio";

$ret = get("http://$espdev/control?cmd=Status,GPIO,$gpio");

if (index($ret, "\"state\": 0") != -1)
{
  Log 3, "getEspPINState: off";
  fhem("set $devicename off");
}
else
{
  Log 3, "getEspPINState: on";
  fhem("set $devicename on");
}
}


sub toggleEspPinState
{
Log 4, "esp Starte toggleEspPin";

my $devicename = $_[0];
my $espdev = $_[1];
my $gpio = $_[2];
my $ret = "";

Log 4, "esp Aufruf: http://$espdev/control?cmd=Status,GPIO,$gpio";

$ret = get("http://$espdev/control?cmd=Status,GPIO,$gpio");

if (index($ret, "\"state\": 0") != -1)
{
  Log 3, "toggleEspPin: off->on";
  system("wget -q -O /dev/null 'http://$espdev/control?cmd=GPIO,$gpio,1'");
}
else
{
  Log 3, "toggleEspPin: on->off";
  system("wget -q -O /dev/null 'http://$espdev/control?cmd=GPIO,$gpio,0'");
}

getEspPINState("$devicename","$espdev",$gpio)
}


Ich gebe zu, an einigen Stellen könnte man sauberer arbeiten (z.B. mit JSON), aber das funktioniert für meine Zwecke gut. (auch über AndFHEM)

devil77

Hallo, seit kurzem nutze ich ESPEasy mit einem Wechselstromzähler und Counter für S0-Bus.
Probleme habe ich aber bei der Übermittlung der Zeit zwischen 2 Impulsen.
Liegt daran das Counter einen Impuls doppelt zählt - also Impuls an und Impuls aus erzeugt einen Zähler +1.
Damit übermittelt er mir als Zeit immer die Impulslänge und nicht die Zeit bis zum nächsten Zählimpuls.
Der Wechseltromzähler hat 1000 Impulse je kWh und eine Impulslänge von 90ms.
Habt ihr einen Tip woran das liegen könnte bzw. wie ich die "richtige" Zeit übermittelt bekomme?

Waldmensch

Kannst du nicht im ESP in Formula gleich /2 teilen? Ansonsten solltest Du die Frage im ESPEASY Forum stellen.


Gesendet von iPhone mit Tapatalk