99_myUtils_calendar - Perl Code

Begonnen von hydrotec, 10 Oktober 2020, 09:41:23

Vorheriges Thema - Nächstes Thema

Beta-User

Zitat von: hydrotec am 12 Oktober 2020, 22:52:29
Perl bringt ja im "package main" schon einige Funktionen mit.
[...] (z.B.: use POSIX qw(strftime) ;) .
Das ist m.E. schief, ich versuch's mal mit meinen Worten, bin aber auch Laie, kann sein, dass das einer der Experten anders formulieren würde:
fhem.pl bestimmt zunächst mal, was im "main"-Namensraum geladen wird. Da dort schon "use POSIX;" steht, ist es bei allem weiterem Code schlicht überflüssig, der in diesen Namespace geladen wird. Sollte - aus welchen Gründen auch immer - entschieden werden, das in fhem.pl einzuschränken, würde das wirkungslos, sobald irgendein anderes Modul oder ein myUtils-Code ebenfalls diese "globale" Anweisung enthalten...

Ergo tut man an der Stelle nicht nur was überflüssiges, sondern was tendenziell auch für andere Programmteile gefährliches (da uU. unbeabsichtigt).

Wenn man diese Gefahr mehr oder weniger komplett ausschalten will, muß man mit packages arbeiten, was etwas komplizierter ist, aber auch nicht soo schwer, wenn man mal weiß, wie es geht.

Zitat
Die fhem-Aufrufe in sub(s) zu legen hatte ich mir auch schon überlegt.
Eventuell mache ich das auch noch, einfach nur zur Übung.
Da sind ein paar Missverständnisse drin:
- Es gibt in fhem.pl bereits "Direktaufrufe", die fhem("...")-Syntax ist nur ein allgemeiner Wrapper für diese Direktaufrufe, die meistens mit Command.* oder Analyze.* anfangen.
- Solange man in "main" rumfuhrwerkt, sollte man eher sparsam sein mit der Zahl der Subs, einfach weil sonst das Risiko besteht, dass es zu Überschneidungen kommt und dann plötzlich was ganz anderes passiert als erwartet, nur weil man ein weiteres Modul in Betrieb nimmt...
- und zu guter letzt erschließt sich mir nicht, was das Auslagern in eigene Subs für einen Sinn hätte.

ZitatZu "57_Calendar2holiday.pm"
So wie ich das verstehe, ist dein Ansatz,[...](z.B.: Rolladen hoch um 06:00 Uhr wenn kein Eintrag im .holiday vorhanden sein sollte, ansonsten erst um 09:00 Uhr) Und dafür ist es m.E. gut geeignet.
Bei mir war der Ausgangspunkt etwas anders.
Ich wollte eine "Schaltung" die mir schon einen Tag vorher berechnet
Genau: ein holiday-Device kennt auch "tomorrow" ;)

Da wirklich viele Wege nach Rom führen, und ich sowieso einen generischeren Ansatz für die calendar2holiday-Geschichte haben wollte, habe ich noch etwas rumgefiddelt und meinen Code überarbeitet:

sub myCalendar2Holiday {
  my $calname     = shift // return;
  my $regexp     = shift // return;
  my $targetname = shift // $calname;
  my $field      = shift // "summary";
  my $limit      = shift // 10;
  my $yearEndRe  = shift;
 
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) =  localtime(gettimeofday());
  my $getstring = $calname . ' events format:custom="4 $T1 $T2 $S" timeFormat:"%m-%d" limit:count=' . $limit." filter:field($field)=~\"$regexp\"";
  my @holidaysraw = split( /\n/, CommandGet( undef, "$getstring" ));
 
  my @holidays;
  for my $holiday (@holidaysraw) {
    if ( !$yearEndRe || $holiday !~ m/$yearEndRe/) {
      push (@holidays, $holiday);
    } else { my @tokens = split (" ",$holiday);
      my $lines = "4 $tokens[1] 12-31 $tokens[3]";
      push (@holidays,$lines) if $month > 9;
      $lines = "4 01-01 $tokens[2] $tokens[3]";
      unshift (@holidays,$lines);
    }
  }
  unshift (@holidays, "# get $getstring");
  my $today = strftime "%d.%m.%y, %H:%M", localtime(time);;\
  unshift (@holidays, "# Created by myCalendar2Holiday on $today");
  FileWrite("./FHEM/${targetname}.holiday",@holidays);
}

Aufruf dann mit
{ myCalendar2Holiday('Familienkalender','.*[fF]erie.*','ferien','summary',10,'[Ww]eihnacht') }oder die "Kurzversion":
{ myCalendar2Holiday('Familienkalender','.*(Bioabfall|Restmüll).*','muell') }

Aber wenn du zum einen eine funktionierende Logik mit den (immer noch ungetriggerten...) userReadings hast und zum anderen sowieso CalView2 planst und dich in Perl-Programmierung eindenken willst, ist so ein Kalenderprojekt durchaus gut geeignet :) . War für mich auch der Einstieg in FileWrite, z.B..
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

hydrotec

POSIX
Prinzipiell hab ich das so verstanden,
doch mit meinem Laienverständnis kann ich es nicht mit eigenen Worten formulieren.
Mein Fazit, ich habe mich bewusst für ein offenes System (Bezug Hausautomation) entschieden,
damit ich unter Umständen auch etwas nach meinen Bedürfnissen anpassen kann.
Dazu sollte ich die Programmiersprache von Grund auf verstehen,
nicht nur "copy&paste" anwenden, sich freuen das es funktioniert, ohne zu wissen warum es funktioniert,
und später dann wundern warum es plötzlich nicht mehr geht (oder anderweitige Probleme entstehen).
Also, Ärmel hochkrempeln, und ran an den Speck.
(Da es für mich ein Hobby ist, bin ich zeitlich nicht unter Druck etwas umzusetzen)


Zugegeben, das mit den sub(s) hatte ich wirklich komplett missverstanden.
Jetzt meine ich zu verstehen was du gemeint hast.
Ein Beispiel dazu sehe ich ja in deinem Code.
(Finger weg, ich werde das jetzt nicht kopieren, s.o.) ;)


Da du dir so viel Mühe gibst mit der calendar2holiday-Geschichte,
werde ich mir die holiday-Funktion in FHEM genauer anschauen.
Anschließend deinen Code übernehmen, um zu sehen ob das für meine Zwecke geeignet ist.
(Kann etwas dauern)


Zitat von: Beta-User am 13 Oktober 2020, 08:27:41
... funktionierende Logik mit den (immer noch ungetriggerten...) userReadings ...
Jetzt bin ich etwas verwirrt.
Um nicht wieder Missverständnissen zu unterliegen, hake ich mal nach.
Hab mir die commandref.html extra noch einmal (inkl. Verweise) angesehen.
So wie ich das verstehe ist ein trigger dafür zuständig das ein Event generiert wird.
In meinem Fall ist der trigger für die userReadings das reading state.
Sobald sich der Status des readings ändert (z.B. set Cal_ reload/update), wird userReadings getriggert,
und die userReadings erzeugen jeweils ein Event auf das man, in welcher Form auch immer (notify, doif, ...)
zugreifen/reagieren kann.
Zumindest kann man das so im Event monitor beobachten.
Damit nicht ständig alle userReadings ein Event feuern, habe ich die Attribute
event-on-update/change-reading gesetzt.
Korrigiere mich bitte wenn es sich anders verhält.


Zitat von: Beta-User am 13 Oktober 2020, 08:27:41
... sowieso CalView2 planst...
:)
Nein, das ist nicht wirklich mein Plan.
(so nebenbei, gibt es eigentlich ein copyright auf Modulnamen?) ;)
CalView hat seine Berechtigung, nutze ich selber, doch nur für FTUI.
Die drei Funktionen waren eigentlich mein Ziel.
Alles weitere, in Bezug auf calendar und userReadings, ist zu vernachlässigendes Beiwerk.
Manchmal ist man einfach nur so im flow, das man eben mehr macht als gedacht.
So in der Art, ach komm, da könnte ich doch auch noch dies oder jenes mit rein nehmen.
Geht mir auch im Geschäft so,
beim überfliegen des NC-Codes mal eben noch schnell ein paar Parameter mit eingebaut und verrechnet,
bis dann der Vorgesetzte meint, du hast doch nen Knall, das versteht doch kein Maschinenbediener mehr.
Aber egal, mir macht es Spaß, und solange es funktioniert, why not.

Ups, mal wieder etwas OT.

OK, mein Hauptanliegen war ja Programmierung und Struktur in Perl.
Dank deiner großartigen Hilfe zur Selbsthilfe bin ich hier doch einen großen Schritt vorwärts gekommen.

Sicherlich wird die ein oder andere Frage noch auftauchen,
vor allem wenn ich das bis hierhin Besprochene aufarbeite.


Ansonsten noch einen angenehmen Tag,
und Dankeschön noch einmal für deine sehr hilfreiche Unterstützung.

Freundliche Grüße, Karsten


Beta-User

Zitat von: hydrotec am 13 Oktober 2020, 13:00:54
Um nicht wieder Missverständnissen zu unterliegen, hake ich mal nach.
Die trigger-Angabe in userReadings hat eine komplett andere Funktion, als bei dir ankam:

- Das ganze mit userReadings wird - vereinfacht gesagt - in der Eventverarbeitung des Geräts abgearbeitet, an dem das definiert wird. Ergo gibt es bereits mind. einen Event, die Liste der geänderten Readings wird nur ggf. länger (das "bulk").
- Hat man ein Gerät (wie vermutlich Calendar), das sowieso alle Readings "per bulk" aktualisiert, ist die daraus resultierende zusätzliche Systemlast gering.
- Ist das Gerät aber so gestrickt, dass Readings (teilweise) nicht per bulk-update aktualisiert werden (z.B. wird jeder readingList-Eintrag in MQTT2_DEVICE separat behandelt oder jeder MySensors-Wert), wird auch das userReading bei jedem update ausgewertet, ganz egal, ob sich der "Bezugspunkt" geändert hat oder nicht.

Kurz: "trigger" ist in diesem Zusammenhang als Einschränkung zu lesen und spart Ressourcen.

Nochmal zu "Hygiene": Da aber die wenigsten User eine Idee haben, ob ein Device-TYPE jetzt bulk-updates macht (=> kann man sich trigger sparen) oder per single jedesmal auch indirekt den userReading-Teil aufruft, halte ich es für sinnvoll, das "immer" zu fordern und auch hinzuschreiben. Ist aber meine persönliche Meinung, und gegenteiligen Code (auch von fleißigen Helfern hier) wirst du zuhauf finden.

Zitat von: hydrotec am 13 Oktober 2020, 13:00:54
Da du dir so viel Mühe gibst mit der calendar2holiday-Geschichte,
...das wollte ich schon lange mal überarbeiten ::) ...
holiday hat halt den Vorteil, dass man es sehr gut in die "allgemeine Logik" integriert bekommt. Via global-holiday2we bekommt man es z.B. sehr simpel in alles, was IsWe() spricht ("Einzeiler", AutoShuttersControl, WeekdayTimer, (vermutlich) DOIF, ...)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

hydrotec

Guten Morgen miteinander

@Beta-User
57_Calendar2holiday.pm habe ich mir angesehen, und schon angelegt.
Getestet, ob es etwas für mich ist, habe ich noch nicht.
Werde mir das die Tage auch noch ansehen.
Dann poste ich aber in dem passenden Thread.

@all
Zwischenzeitlich habe ich mich etwas mehr in Perl eingelesen, und meinen Code noch einmal überarbeitet.
Ist ja peinlich, doch ich hatte bei der ganzen Programmiererei und anschließender Testerei,
komplett vergessen das mein verbose auf 1 eingestellt war.  :-[
Mit verbose=5 wurde mir klar, mein Code ist alles andere als OK.  :'(
Jetzt klappt das mit dem Nachbarn. (Log, Event monitor)  ;)
Zumindest wird im Log-file kein Fehler oder Warnung ausgegeben,
und im Event monitor erscheinen nur die von mir erwünschten Events.
Selbst bei Perl::Critic übersteht der Code Severity level (3) harsh ohne Meldung.

Was ich noch nicht hinbekommen habe,
das bei der Abfrage ob Ereignis mit Suchwort die Groß- und Kleinschreibung ignoriert wird.
Ist nicht dramatisch, muss man halt etwas aufpassen das Kalendereintrag und Suchwort gleich geschrieben sind.

Folgend noch der (vermutlich) finale Stand

calendar device (Test-Kalender)
defmod Cal_WoW Calendar ical url https://{USERNAME}:{PASSWORD}@192.168.78.33:31443/remote.php/dav/calendars/{USERNAME}/wow?export 43200
attr Cal_WoW DbLogExclude .*
attr Cal_WoW event-on-change-reading Event_.*,Search_.*
attr Cal_WoW event-on-update-reading state,lastUpdate
attr Cal_WoW hideLaterThan 030d
attr Cal_WoW hideOlderThan 00:15
attr Cal_WoW room Kalender
attr Cal_WoW stateFormat Status: state T: lastUpdate<br/>\
Event in: Event_at Tag(en) Morgen: Event_tomorrow, Heute: Event_today<br/>\
Hallo in: Search_Hallo_at Tag(en) Morgen: Search_Hallo_tomorrow, Heute: Search_Hallo_today<br/>\
Ciao in: Search_Ciao_at Tag(en) Morgen: Search_Ciao_tomorrow, Heute: Search_Ciao_today
attr Cal_WoW synchronousUpdate 0
attr Cal_WoW userReadings Event_name:triggered.* {Cal_na($NAME)}, \
Event_at:triggered.* {Cal_at($NAME)}, \
Event_tomorrow:triggered.* {Cal_tm($NAME)}, \
Event_today:triggered.* {Cal_td($NAME)}, \
Search_Hallo_name:triggered.* {Cal_na($NAME, 'Hallo')}, \
Search_Hallo_at:triggered.* {Cal_at($NAME, 'Hallo')}, \
Search_Hallo_tomorrow:triggered.* {Cal_tm($NAME, 'Hallo')}, \
Search_Hallo_today:triggered.* {Cal_td($NAME, 'Hallo')}, \
Search_Ciao_name:triggered.* {Cal_na($NAME, 'Ciao')}, \
Search_Ciao_at:triggered.* {Cal_at($NAME, 'Ciao')}, \
Search_Ciao_tomorrow:triggered.* {Cal_tm($NAME, 'Ciao')}, \
Search_Ciao_today:triggered.* {Cal_td($NAME, 'Ciao')}
attr Cal_WoW verbose 5


99_myUtils_calendar.pm
#************************************************************************
# 99_myUtils_calendar.pm kst
#************************************************************************
# 2020-10-03 - Datei erstellt
# 2020-10-03 - Abfrage Tage bis zu Event hinzu
# 2020-10-03 - Nicht Ganztagestermine Zeit bis Mitternacht verrechnen
# 2020-10-04 - Event Morgen/Heute hinzu
# 2020-10-05 - Event Name hinzu
# 2020-10-10 - Thread erstellt (99_myUtils_calendar - Perl Code)
#            - https://forum.fhem.de/index.php/topic,114901.0.html
#            - Cal_at umformatiert nach Vorlage CoolTux (Forum)
# 2020-10-11 - Code leserlich formatiert
#            - Event Morgen/Heute angepasst
#            - Event Name angepasst
#            - use POSIX; entfernt nach Hinweis von Beta-User (Forum)
# 2020-10-12 - Bei Optionalem Parameter ($kst_sword) " // undef" entfernt
#            - (wird ueber "if (defined $kst_sword && length($kst_sword) > 0)" abgfragt)
#            - Abfrage ob Pflichtparameter ($kst_cname) angegeben ist
#            - Rueckmeldung ueber Text im Reading verwendet, da in diesem Fall ausreichend
#            - carp (?) ist eher was fuer Modulentwickler (bessere Fehlerauswertung)
# 2020-10-14 - 57_Calendar2holiday.pm fuer Testzwecke eingefuegt
#            - nach Vorlage von Beta-User (Forum)
#            - (https://forum.fhem.de/index.php/topic,85759.msg1092165.html#msg1092165)
#            - Aufruf (fhem("get...")) nach Abfrage mit/ohne Suchwort eingefuegt
#            - (ansonsten werden beide Aufrufe angestossen)
# 2020-10-15 - Anfuehrungszeichen bei Aufruf (fhem("get...")) angepasst
#            - Code nach Notepad++ formatiert
#            - Abfrage ob Pflichtparameter ($kst_cname) angegeben ist
#            - Rueckmeldung angepasst
#            - 57_Calendar2holiday.pm in extra 99_myUtils_calendar2holiday.pm.pm eingefuegt
#            -
#            -
#            -
#
#------------------------------------------------------------------------

package main;

use strict;
use warnings;
#use Carp;
#use POSIX;

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

# Enter you functions below _this_ line.

##************************************************************************
## Zeit in Sekunden von Mitternacht bis aktuelle Zeit in Sekunden
##************************************************************************
## Kopie aus 57_Calendar.pm
#sub Calendar_GetSecondsFromMidnight()
#{
# my @time = localtime();
# return (($time[2] * HOURSECONDS) + ($time[1] * MINUTESECONDS) + $time[0]);
#}


#************************************************************************
# Tage bis zum anstehenden Termin
#************************************************************************
sub Cal_at {
                                            # Pflicht-Uebernahmeparameter (calendername), mit Ueberpruefung
    my $kst_cname   = shift // return '!!! Error: minimum call {Cal_at($NAME)} !!!';
    my $kst_sword   = shift;                # Optionaler Uebernahmeparameter (searchword)
    my $kst_format  = '$t1';                # $t1 Startzeit in Sekunden
    my $kst_time    = 0;                    # Parameter setzen, damit keine Warnmeldung erscheint
   
        if (defined $kst_sword
            && length($kst_sword) > 0)      # Abfrage ob Zeit mit oder ohne Suchwort verwendet wird
            {                               # Zeit in Sekunden mit Suchwort
            my $kst_timewordon  = fhem("get $kst_cname events format:custom=\"$kst_format\" filter:field(summary)=~\"$kst_sword\" limit:from=0,count=1");
            $kst_time = $kst_timewordon;
            }
        else
            {                               # Zeit in Sekunden ohne Suchwort
            my $kst_timewordoff = fhem("get $kst_cname events format:custom=\"$kst_format\" limit:from=0,count=1");
            $kst_time = $kst_timewordoff;
            }
   
                                            # Zeit von Mitternacht bis aktueller Zeit in Sekunden
    my $kst_todaymidnight   = Calendar_GetSecondsFromMidnight();
                                            # Berechnung der Tage bis zum anstehenden Termin
    my $kst_day             = int(($kst_time / 86400) - ((time - $kst_todaymidnight) / 86400));
                                            # Uebergabe der Tage bis zum anstehenden Termin (999=kein Termin)
    return ( (defined $kst_day && $kst_day < 0) ? 999 : $kst_day );
}


#************************************************************************
# Termin Morgen
#************************************************************************
sub Cal_tm {
                                            # Pflicht-Uebernahmeparameter (calendername), mit Ueberpruefung
    my $kst_cname   = shift // return '!!! Error: minimum call {Cal_tm($NAME)} !!!';
    my $kst_sword   = shift;                # Optionaler Uebernahmeparameter (searchword)
    my $kst_format  = '$S';                 # $S Ereignis

        if (defined $kst_sword
            && length($kst_sword) > 0)      # Abfrage ob Ereignis mit oder ohne Suchwort verwendet wird
            {                               # Ereignis mit Suchwort
            my $kst_tmwordon    = fhem("get $kst_cname events format:custom=\"$kst_format\" filter:field(summary)=~\"$kst_sword\" limit:when=tomorrow");
                                            # Uebergabe Status Termin mit Suchwort (0=nein/1=ja)
            return ( (defined $kst_tmwordon && $kst_tmwordon =~ m/$kst_sword/x) ? 1 : 0 );
            }
        else
            {                               # Ereignis ohne Suchwort
            my $kst_tmwordoff   = fhem("get $kst_cname events format:custom=\"$kst_format\" limit:when=tomorrow");
                                            # Uebergabe Status Termin ohne Suchwort (0=nein/1=ja)
            return ( (defined $kst_tmwordoff && length($kst_tmwordoff) > 0) ? 1 : 0);
            }
}


#************************************************************************
# Termin Heute
#************************************************************************
sub Cal_td {
                                            # Pflicht-Uebernahmeparameter (calendername), mit Ueberpruefung
    my $kst_cname   = shift // return '!!! Error: minimum call {Cal_td($NAME)} !!!';
    my $kst_sword   = shift;                # Optionaler Uebernahmeparameter (searchword)
    my $kst_format  = '$S';                 # $S Ereignis
   
        if (defined $kst_sword
            && length($kst_sword) > 0)      # Abfrage ob Ereignis mit oder ohne Suchwort verwendet wird
            {                               # Ereignis mit Suchwort
            my $kst_tdwordon    = fhem("get $kst_cname events format:custom=\"$kst_format\" filter:field(summary)=~\"$kst_sword\" limit:when=today");
                                            # Uebergabe Status Termin mit Suchwort (0=nein/1=ja)
            return ( (defined $kst_tdwordon && $kst_tdwordon =~ m/$kst_sword/x) ? 1 : 0 );
            }
        else
            {                               # Ereignis ohne Suchwort
            my $kst_tdwordoff   = fhem("get $kst_cname events format:custom=\"$kst_format\" limit:when=today");
                                            # Uebergabe Status Termin ohne Suchwort (0=nein/1=ja)
            return ( (defined $kst_tdwordoff && length($kst_tdwordoff) > 0) ? 1 : 0);
            }
}


#************************************************************************
# Name zum Termin
#************************************************************************
sub Cal_na {
                                            # Pflicht-Uebernahmeparameter (calendername), mit Ueberpruefung
    my $kst_cname   = shift // return '!!! Error: minimum call {Cal_na($NAME)} !!!';
    my $kst_sword   = shift;                # Optionaler Uebernahmeparameter (searchword)
    my $kst_format  = '$S';                 # $S Ereignis
   
        if (defined $kst_sword
            && length($kst_sword) > 0)      # Abfrage ob Name mit oder ohne Suchwort verwendet wird
            {                               # Name mit Suchwort
            my $kst_nawordon    = fhem("get $kst_cname events format:custom=\"$kst_format\" filter:field(summary)=~\"$kst_sword\" limit:from=0,count=1");
                                            # Uebergabe Name mit Suchwort
            return ( (defined $kst_nawordon && length($kst_nawordon) > 0) ? $kst_nawordon : "Kein Treffer" );
            }
        else
            {                               # Name ohne Suchwort
            my $kst_nawordoff   = fhem("get $kst_cname events format:custom=\"$kst_format\" limit:from=0,count=1");
                                            # Uebergabe Name ohne Suchwort
            return ( (defined $kst_nawordoff && length($kst_nawordoff) > 0) ? $kst_nawordoff : "Kein Termin" );
            }
}


#************************************************************************
# Temporaer
#************************************************************************
#
#
#


1;




Sollten doch noch Kritikpunkte (positiv wie negativ) vorhanden sein,
gerne her damit.  :D


Mit freundlichen Grüßen,
Karsten


Beta-User

Zitat von: hydrotec am 16 Oktober 2020, 09:21:00
@Beta-User
57_Calendar2holiday.pm habe ich mir angesehen, und schon angelegt.
Ähm, das ist eigentlich "normaler" myUtils-Code und kein Modul; der Dateiname sollte daher mit 99_ beginnen, damit das automatisch geladen wird. Aber schon richtig: Fragen dazu gehören in den anderen Thread.

Ob Calendar mit dem /i-Schalter bei der regex umgehen würde, weiß ich auch grade nicht, kann durchaus sein, dass da auch in meinem Code noch Verbesserungspotential drin ist.



Zum eigentlichen Thema zurück

Was das Lernen angeht: Super Fortschritte, Hut ab :) !

Der (über-) nächste Schritt wäre dann ggf. die myUtils-Geschichten direkt auch noch in entsprechende eigene Packages einzubetten. Das macht die Sache allerdings dann im ersten Moment etwas komplizierter, allerdings hat es den Vorteil, dass man z.B. innerhalb des Packages auch Unicode aktivieren kann, das "min/max"-Problem fixen (=> Perl-Ecke) und vieles mehr.

Falls du eine Basis suchst, wie sowas aussehen kann: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/AttrTemplate/99_attrT_ZWave_Utils.pm

@CoolTux: Eventuell sollte man das mit "myUtils2" (als package, ggf. auch in dem Wiki-Artikel dargestellt) auch in der Development-Ecke mal ventilieren, _falls_ mein gedanklicher Ansatz nicht insgesamt in die falsche Richtung geht. Aber dazu sind meine eigenen Kenntnisse nicht vertieft genug, um diese Diskussion wirklich vertieft zu führen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

Zitat von: Beta-User am 16 Oktober 2020, 12:20:11
@CoolTux: Eventuell sollte man das mit "myUtils2" (als package, ggf. auch in dem Wiki-Artikel dargestellt) auch in der Development-Ecke mal ventilieren, _falls_ mein gedanklicher Ansatz nicht insgesamt in die falsche Richtung geht. Aber dazu sind meine eigenen Kenntnisse nicht vertieft genug, um diese Diskussion wirklich vertieft zu führen.

Du meinst generell eine Vorlage als myUtils2 vor zu stellen welche auf package Basis läuft?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

Zitat von: CoolTux am 16 Oktober 2020, 12:38:16
Du meinst generell eine Vorlage als myUtils2 vor zu stellen welche auf package Basis läuft?
Genau.

Und dann eben gleich als "Vorlage" "wichtige" Funktionen importiert (z.B. ReadingsVal+Num, min, max) und utf8 aktiviert. Was auch immer sinnvoll sein mag, um erst mal eine Idee zu haben, was notwendig ist und um künftige (bzw. alte) Probleme gleich zu umschiffen...?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

CoolTux

Zitat von: Beta-User am 16 Oktober 2020, 12:53:36
Genau.

Und dann eben gleich als "Vorlage" "wichtige" Funktionen importiert (z.B. ReadingsVal+Num, min, max) und utf8 aktiviert. Was auch immer sinnvoll sein mag, um erst mal eine Idee zu haben, was notwendig ist und um künftige (bzw. alte) Probleme gleich zu umschiffen...?

Klingt gut. Ich werde es mir mal notieren auf meinem ToDo Stapel. Schauen wir mal.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

hydrotec

Zitat von: Beta-User am 16 Oktober 2020, 12:20:11
Ähm, das ist eigentlich "normaler" myUtils-Code und kein Modul; der Dateiname sollte daher mit 99_ beginnen, damit das automatisch geladen wird. Aber schon richtig: Fragen dazu gehören in den anderen Thread.
Sorry, etwas unglücklich ausgedrückt, hätte den kompletten thread-title übernehmen sollen.

Zitat von: Beta-User am 16 Oktober 2020, 12:20:11
Was das Lernen angeht: Super Fortschritte, Hut ab :) !
Dankeschön, ein Lob kann man gerne auch einmal vertragen  ;D
Andererseits, wie heißt es bei uns,
"Ned gschompfa isch gloabd gnuag"  ;)

Zitat von: Beta-User am 16 Oktober 2020, 12:20:11
Der (über-) nächste Schritt wäre dann ggf. die myUtils-Geschichten direkt auch noch in entsprechende eigene Packages einzubetten.
Das ist, wenn nicht sogar der über-übernächste Schritt.
Dennoch Dankeschön für die Vorlage.  :)

Zitat von: CoolTux am 16 Oktober 2020, 12:58:22
Klingt gut. Ich werde es mir mal notieren auf meinem ToDo Stapel.
Entschuldige bitte, ich wollte dir nicht noch mehr Arbeit aufdrücken.   :-[
Generell sind "Vorlagen" schon eine gute Sache, andererseits, bei einem so komplexen System auch wieder gefährlich.
Man kann noch so viele Optionen berücksichtigen, und eine Dokumentation dazu bereitstellen,
wenn der Anwender nicht weiß was er da macht, kann der Schuß nach hinten losgehen.
Ich kenne da einen, der hat das erst kürzlich am eigenen Leib erfahren müssen.  ::)

Wie dem auch sei, ich wünsche euch allen ein angenehmes Wochenende,
und danke noch einmal für eure Geduld und hervorragende Hilfestellung.

Grüße, Karsten