neue Features: ereignisgesteuertes Perl - DOIF-Perl

Begonnen von Damian, 25 Februar 2018, 21:29:16

Vorheriges Thema - Nächstes Thema

Damian

#75
Korrigierte Version eingecheckt.

Doku angepasst: Ich spreche jetzt nicht von Perlblöcken, sondern von Ereignisblöcken, weil es der Funktion des Blocks näher kommt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#76
Da im Perl-Modus der Status vom User gesetzt werden muss, habe ich eine vereinfachte Funktion definiert, die das erledigt:

set_State(<content>);

entspricht:

set_Reading("state",<content>,1);

bzw.

readingsSingleUpdate($hash,"state",<content>,1);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Falls Einer in die Tiefen von Perl einsteigen möchte, hier ein Beispiel wie man Pointer vom Array an verzögerte Funktionen übergeben kann.

defmod di_test2 DOIF subs {\
sub test {\
  my @b = @{$_[0]};;\
  set_Reading("state","$b[0] $b[1] $b[2]",1)\
}\
}\
{\
  if ([FS:"on"]) {\
    my  @a=("1","2","3");;\
    #test(\@a);;\
    set_Exec("timer",1,'test',\@a);;\
  }\
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Wer es auf die Spitze treiben will und das Parsen von fhem-Befehlen umgehen möchte:

fhem"setreading... lässt sich durch Perlfunktionen: set_Reading(... oder old school readingsSingleUpdate(... ersetzen.

auch fhem"set ..." muss nicht sein, stattdessen kann man die Perlfunktion  CommandSet(undef,"...") nutzen.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#79
Ankündigung

Es wird bald ein größeres Update für den Perl-Modus geben.

Der Adressraum im Perl-Modus wird gekapselt. Das bedeutet, dass selbst definierte Funktionen im subs-Block bereits irgendwo anders (außerhalb von DOIF) definierte Funktionen nicht überschreiben können.

Das hat allerdings eine Inkompatibilität zur Folge. Funktionen aus dem main-Adressraum (FHEM) müssen besonders gekennzeichnet werden.

Funktionen aus main sind über ::<function> erreichbar. Z. B ::ReadingsVal(....)

Ich werde, die üblichen Funktionen wie fhem, Log, ReadingsVal usw. im DOIF-Adressraum neu definieren, so dass man da nicht umdenken muss.

Allerdings wird es neue Perlfunktionen im DOIF-Adressraum geben, die einfacher zu handhaben sind:

set_State(<content>)
get_State()
set_Reading(<reading>,<content>,<trigger>)   trigger ist optional
get_Reading(<reading>)
set_Reading_Begin()
set_Reading_Update(<reading>,<content>)
set_Reading_End(<trigger>)
fhem_set(<content>)


Funktionen aus myutil müssen dann logischerweise auch entsprechend angegeben werden ::<function> oder auch im package DOIF definiert werden.


Beispiel mit neuen Funktionen ohne FHEM-Befehle:

DOIF subs {
  sub lamp {
     my ($state)=@_;
     fhem_set("lamp $state");
     set_State($state);
  }
}
{if ([06:00]) {lamp("on")}} 
{if ([08:00]) {lamp("off")}}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#80
Neue Version mit neuen Funktionen wurde eingecheckt.

Doku wurde überarbeitet: Anfängerfreundliche Einführung mit Beispielen:

https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PatrickR

Ist die Änderung mit dem Package-/Namespace noch aktuell? Frage, weil das zugehörige Posting editiert wurde.

Patrick


Von unterwegs gesendet.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Damian

Zitat von: PatrickR am 26 September 2018, 10:32:00
Ist die Änderung mit dem Package-/Namespace noch aktuell? Frage, weil das zugehörige Posting editiert wurde.

Patrick


Von unterwegs gesendet.

ja, bitte bei externen Perlfunktionen :: voranstellen, wenn sie angemeckert werden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PatrickR

Uff, das gibt Scherben wenn man es im Changelog übersieht.

Danke für die Klarstellung.

Patrick


Von unterwegs gesendet.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Damian

#84
Zitat von: PatrickR am 26 September 2018, 10:35:04
Uff, das gibt Scherben wenn man es im Changelog übersieht.

Danke für die Klarstellung.

Patrick


Von unterwegs gesendet.

Bei ausgelagerten im DOIF-Perlmodus genutzten Funktionen z. B. in myutils kann man package DOIF; voranstellen

Folgende FHEM-Funktionen wurden im DOIF-Namensraum nachgebildet, hier muss man nichts machen:

fhem, Log, Log3, InternVal, InternalNum, OldReadingsVal, OldReadingsNum, OldReadingsTimestamp, ReadingsVal, ReadingsNum, ReadingsTeimestamp, ReadingsAge, Value, OldValue, OldTimestamp, AttrVal, AttrNum

Das steht aber alles in der aktuellen Commandref: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Es sind z. Zt. ca. 50 User die den neuen Modus nutzen - das kriegen wir hin.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PatrickR

Damit kein falscher Eindruck entsteht. Ich finde den Patch explizit gut. Nur der Migrationspfad macht mir für den Fall Sorgen, dass jemand davon überrascht wird.

Bei neuen DOIFs sollte der Codecheck sofort greifen aber - korrigiere mich wenn ich falsch liege - bei bestehenden DOIFs würde die Ausführung einfach abbrechen und sich ggf. in den Error-Readings bzw. dem Log verewigen.

Ich selbst hätte die Änderung verpasst wenn ich nich Dein Posting gelesen hätte, bevor es editiert wurde und hätte dann ein defektes Alerting bei Wasser bzw. Feuer gehabt.

Patrick


Von unterwegs gesendet.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Damian

#86
Zitat von: PatrickR am 26 September 2018, 17:03:23
Damit kein falscher Eindruck entsteht. Ich finde den Patch explizit gut. Nur der Migrationspfad macht mir für den Fall Sorgen, dass jemand davon überrascht wird.

Bei neuen DOIFs sollte der Codecheck sofort greifen aber - korrigiere mich wenn ich falsch liege - bei bestehenden DOIFs würde die Ausführung einfach abbrechen und sich ggf. in den Error-Readings bzw. dem Log verewigen.

Ich selbst hätte die Änderung verpasst wenn ich nich Dein Posting gelesen hätte, bevor es editiert wurde und hätte dann ein defektes Alerting bei Wasser bzw. Feuer gehabt.

Patrick


Von unterwegs gesendet.

Wenn du nach dem Hochfahren kein config save machst, passiert nichts schlimmes, außer dass dein DOIF nicht funktioniert, ggf. dein DOIF-Device nicht definiert werden kann.

Nach einem save, brauchst du aus deiner letzten Sicherung der config die Definition deines nicht mehr funktionierenden DOIFs, die du anpassen und dein DOIF-Device neu definieren musst.

Edit: Bei einem Update wird die config im restoreDir-Verzeichnis gesichert
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

DOIF:fhem beachtet den 2.Parameter zum Stummschalten nicht.

fhem ("get ...",1) die 1 verhindert, dass der Rückgabewert von get geloggt wird.

Damian

Zitat von: Ellert am 26 September 2018, 18:25:16
DOIF:fhem beachtet den 2.Parameter zum Stummschalten nicht.

fhem ("get ...",1) die 1 verhindert, dass der Rückgabewert von get geloggt wird.

Danke für die Info.

Kannst du bitte, die im Anhang bei dir schon mal antesten?


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Benutzt jemand schon die Funktion set_Time?

Ich wollte die Namensgebung vereinheitlichen.

Es gibt set_Exec zum verzögerten Ausführen von Perlcode.

Ich wollte set_Event wie folgt erweitern

set_Event (<Event>) wie bisher Event sofort absetzen

set_Event(<NameEvent>,<Sekunden>) Event verzögert absetzen, entspricht dem jetzigen set_Time (<NameEvent> ist gleichzeitig der Name des Timers)

set_Event(<Name>,<Sekunden>,<Event>) entspreche set_Exec von den Parametern her

set_Time könnte entfallen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF