Hilfe bei der Umstellung von Zahlen auf Textstrings

Begonnen von Marko1976, 24 September 2025, 11:29:55

Vorheriges Thema - Nächstes Thema

Marko1976

Zitat von: TomLee am 25 September 2025, 13:27:07Du kannst die Einträge statisch in @r angeben:
Dann kann ich aber nicht mehr einfach etwas hinzufügen oder wegnehmen und muss dann jedesmal das userReading anpacken, oder? Da ich einen ähnlichen Fall bei dem Fahrzeiten-Modul habe, wäre ich an einer direkten Lösung innerhalb von readingList schon mehr interessiert - falls es eine gibt.
Ginge alternativ folgende Lösung:
Die Readings beinhalten nicht on/off, sondern off und den Müllartnamen (z.B. Restmuell) und ich frage innerhalb des userReadings nicht mehr ab ob das Reading on ist, sondern ob es nicht off ist und befülle im join mit dem Readingsinhalt. Hoffe, das war jetzt verständlich der Gedankengang.
Ist das $_ ein Platzhalter wie $name? Falls ja, wofür genau steht er?

Zitat von: TomLee am 25 September 2025, 13:27:07Oder auslesen, aus dem Device welches Du bisher vorenthältst
Ich enthalte nichts vor, es wird nur oft viel zu kompliziert gedacht. Ich habe einfach ein Switch-Widget genommen und dem die Status off,on gegeben und direkt per setreading dem Reading zugewiesen. Es benötigt weder ein zusätzliches Device noch sonst irgendwie komplizierter Code. Hier der ftui3-Eintrag:
<ftui-switch [value]="settings_abfallfilter:Restmuell" (value)="setreading settings_abfallfilter Restmuell" color="green" states="off,on"></ftui-switch>
Zitat von: TomLee am 25 September 2025, 13:27:07Schonmal drüber nachgedacht von dem seit Jahren nicht mehr gepflegten Abfall-Modul wegzukommen und die Kalendereinträge selbst im Calendar-Modul anzulegen?
Ich trage jedes Jahr alle Mülltermine in unseren gemeinsamen Google-Kalender ein und lese die dortigen Einträg einmal mit dem Abfall-Modul für die Anzeige des nächsten Termins und mit dem Calview-Modul zur detailierteren Ansicht der kommenden Termine in chronologischer Reihenfolge in ftui3 aus. Da wir aber z.b. keinen Biomüll (wird zentral von der Hausverwaltung übernommen) haben brauche ich dafür keine Erinnerungen.

Ich bin aber kein Fan davon etwas fix in fhem festzulegen, sondern versuche alles über ftui3 steuerbar zu lassen. Und da ich ja nicht weiß ob ich eventuell mal doch den Biomüll brauche muss es eben so modular schaltbar sein.

Da ich das mit dem Google-Kalender definitiv eh machen muss ist das der einfachste Weg. Abgesehen davon, dass ich gar nicht wusste, dass das Abfall-Modul nicht mehr gepflegt wird. Funktioniert jedenfalls ohne Probleme. Das einzige was es nicht liefert ist eben die chronologische Ansicht. Woran sieht man ob ein Modul gepflegt wird oder nicht? oder muss man das alles im Kopf wissen?


Die Dokus werde ich mir abspeichern und mal in einer ruhigen Minute anschauen. Schätze mal, dafür braucht es etwas Zeit.

Zitat von: TomLee am 25 September 2025, 13:27:07Um im Perl-Code nicht auf die FHEM-Ebene (Funktion fhem() ) wechseln zu müssen, hab ich die Funktion CommandAttr verwendet.
Diese und andere Funktionen gibts nur in FHEM, definiert sind die in der fhem.pl und nur teilweise dokumentiert.
Mir war überhaupt nicht bewusst, dass es solche Befehle in Fhem gibt. Muss ich mal schauen ob es ein passendes Pondons für den set-Befehl gibt. So wie ich gelesen habe soll man in userReadings ja besser nicht auf die Fhem-Ebene wechseln wie ich es notgedrungen mit den beiden Update-Befehlen gemacht habe.

TomLee

<ftui-switch [value]="settings_abfallfilter:Restmuell" (value)="setreading settings_abfallfilter Restmuell" color="green" states="off,on"></ftui-switch>
Wie nennst Du die Readings der Abfallarten die ein Leerzeichen beinhalten? Bspw. bei "Gelber Sack"

ZitatIst das $_ ein Platzhalter wie $name? Falls ja, wofür genau steht er?
Versteh ich nicht wie Du das fragen kannst, nachdem Du ja an zwei Stellen den Code auf Deine Bedürfnisse angepasst hast und doch verstehen solltest was Du da gemacht hast?
Du kannst Dir die Umlaufvariable der Schleife ($_) im Logfile ausgeben, mit
Debug $_;

betateilchen

ZitatIst das $_ ein Platzhalter wie $name? Falls ja, wofür genau steht er?

https://perldoc.perl.org/perlvar

Dort im Bereich ,,General variables" zu finden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: TomLee am 25 September 2025, 17:38:59Versteh ich nicht wie Du das fragen kannst

Du versuchst allen Ernstes noch, solche Fragen zu verstehen? Respekt...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Marko1976

Zitat von: TomLee am 25 September 2025, 17:38:59Wie nennst Du die Readings der Abfallarten die ein Leerzeichen beinhalten? Bspw. bei "Gelber Sack"
Auch da tritt natürlcih das Problem auf, da aber bisher nie ein Readingname irgendein besonderes Aussehen oder eine besondere Schreibweise haben musste habe ich die Leerstelle einfach mit einem Unterstrich ersetzt. Bisher kam so eine Situation, dass Readingname auch anderweitig auftauchten oder benutzt wurden und daher gleich sein mussten noch nicht auf.

Zitat von: TomLee am 25 September 2025, 17:38:59Versteh ich nicht wie Du das fragen kannst, nachdem Du ja an zwei Stellen den Code auf Deine Bedürfnisse angepasst hast und doch verstehen solltest was Du da gemacht hast?
Wieso das? Ich hatte ja geschrieben, dass ich einfach so lange rumprobiert habe bis es passte. Zum Beispiel die Ergänzung des Kalendernamens. Ich weiß, dass der Text irgendwo hinzugefügt werden muss. Damit es für jeden Eintrag passiert ist es logisch, dass die Stelle innerhalb der Schleife liegt. Und dennoch hat mich die Suche danach gut eine halbe Stunde und ca. 8 Versuche gekostet, bis ich durch Glück die richtige Einfügestelle gefunden habe. Dazu muss man aber nicht den Sinn und Zweck einer Funktion/Variablen kennen. Und genau das ist mein Problem.
Beispielsweise wird immer auf die CommandRef verwiesen. Dort finde ich aber das $_ wieder nicht. Für Perl habe ich wie gesagt bisher gar keine Dokumentation gefunden die ich verstanden hätte und mich weitergebracht hat. Bestenfalls nur Beispiele von denen ich dann den Sinn abgeleitet habe.

Zitathttps://perldoc.perl.org/perlvar
Genau so etwas. Woher soll man das Wissen wenn man es nicht gesagt bekommt oder durch Zufall darüber stolpert. Wobei auch das für mich größtenteils nur unverständlichen Kauderwelch ist, da ich mit dieser Art von Englisch wenig bis gar nichts anfangen kann. Keine Ahnung, vielleicht bin ich zu Alt für diese Art von Texte, vielleicht hängt es auch mit meinen Augenproblemen zusammen, aber ich komme damit nicht klar. Daher weiß ich auch oft nicht wie und wonach ich im Netz suchen soll. Mit den Suchbegriffen die mir einfallen komme ich jedenfalls oft genug nicht weiter. Wenn ich dann manchmal Suchbegriffe genannt bekomme, sind die in meinen Augen so weit hergeholt und Abstrakt, dass ich zugeben muss, das ich da nie im Leben drauf kommen würde.

betateilchen

Zitat von: Marko1976 am 25 September 2025, 18:09:16Genau so etwas. Woher soll man das Wissen wenn man es nicht gesagt bekommt oder durch Zufall darüber stolpert.

Das kann man selbstverständlich nicht wissen, und es hat überhaupt nichts mit "durch Zufall darüber stolpern" zu tun. Sowas sind einfachste Grundlagen, wenn man anfängt, eine Programmiersprache wie perl systematisch zu lernen. Das ist nicht anders als bei einer "menschlichen" Sprache: Es gibt Vokabeln (= Befehle und Funktionen), Grammatik (= Syntax) und guten Ausdruck (= strukturierte Programmierung).

Variablennamen sind normalerweise in einem der ersten beiden Kapitel eines zugehörigen Lehrbuches oder Online-Kurses enthalten und erklärt.

Es wird halt mit dem Lernen extrem schwierig, wenn man "mittendrin" anfängt, irgendwas programmieren zu wollen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Marko1976

Hier mal Screenshots wie das ganze bei mir jetzt als Ergebnis aussieht.

Du darfst diesen Dateianhang nicht ansehen.
Rechts kann man in den Settings am Tablet für die Müllarten einzeln Ein-/Ausschalten welche dann auf dem Startbildschirm (Screenshot unten) angezeigt werden. Beim Drücken auf das Icon des Startbildschirms öffnet sich das zu sehende Details-Popup.
Du darfst diesen Dateianhang nicht ansehen.

Marko1976

#22
Zitat von: betateilchen am 25 September 2025, 18:26:02Sowas sind einfachste Grundlagen, wenn man anfängt, eine Programmiersprache wie perl systematisch zu lernen.
Wahrscheinlich ist genau da der Hase im Pfeffer begraben.
Ich will kein Perl lernen. Ich habe mit Basic angefangen, dann mit den verschiedenen C-Varianten weiter gemacht. HTML und anschließend php gelernt und beschäftige mich nun mit Fhem. Fhem> - nicht Perl. Mir ist klar, dass das in einigen Fällen offenbar nicht trennbar ist, dennoch will und kann ich mit fast 50 Jahren nicht anfangen noch eine Programmiersprache wie Perl komplett zu erlernen. Mir reicht das was ich ab und an mal brauchen kann oder aus Beispielen rausklauben kann. Daher muss ich zugeben, dass manche meiner Fragen sicherlich blöd rüberkommen.

Wie weiter oben hoffentlich klar geworden ist versuche ich mich einer Aufgabe zu stellen und auch neues zu lernen, ich erwarte keine fertigen Lösungen und begrüße die Herausforderung. Aber mit meinen Augenproblemen und dem Alter habe ich genug andere Probleme als mich so tief in die Materie einzuarbeiten wie das von anderen hier erwartet wird. Und ich glaube, dass ich mit dieser Einstellung wahrschienlich auch nicht der einzige bin. Also bitte verzeiht es mir wenn für mich solche Dinge eben keine Selbstverständlichkeiten sind wie für euch. Andersrum erwarte ich ja auch nicht, dass sich jeder der ein Handbuch liest mit den Grundsätzen von technischer Kommunikation/Redaktion bis ins Detail auskennt.

betateilchen

Zitat von: Marko1976 am 25 September 2025, 18:39:30Ich will kein Perl lernen. Ich habe mit Basic angefangen, dann mit den verschiedenen C-Varianten weiter gemacht. HTML und anschließend php gelernt und beschäftige mich nun mit Fhem. Fhem> - nicht Perl.

FHEM ist ein in perl geschriebenes Programm. Und alles, was Du als perl-Code in ein userAttr in eine 99_myUtils.pm oder in ein FHEM-Modul schreibst, dient letztendlich dazu, dieses Programm (FHEM) um neue - in perl programmierte - eigene Funktionalitäten zu erweitern.

Niemand erwartet von FHEM Anwendern, perl vollständig zu beherrschen. Aber immer dann, wenn an einer der oben genannten Stellen eine geschweifte Klammer {} benötigt wird, kann es nicht schaden, zumindest ein paar Grundlagen der verwendeten Programmiersprache zu kennen.

Wenn man schon einige Programmiersprachen gelernt hat, wie Du ja von Dir selbst schreibst, ist es doch gar nicht so schwierig und schon gar nicht sonderlich umfangreich, sich die paar perl-spezifischen Dinge wie z.B. vordefinierte Variablen anzueignen.

Und mit 50 Jahren ist noch niemand zu alt, das zu schaffen. Wie ich weiß, gibt es hier im Forum eine ganze Reihe Mitglieder, die bedeutend älter sind als Du und die das auch bewältigt haben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Schau Dir bitte bei Gelegenheit die verlinkten Dokus zu Perl an. Ich find beide toll und verständlich.


Hier eine Möglichkeit Dein Problem anzugehen und ich die Fetzen die nacheinander kamen verstehe:

Filterlist:.*
{
my @r = split(/,/, AttrVal($name,'filter',''));
my @a1;
for (@r){
my $val = $_;
$val =~ s/ /_/g;
push (@a1,"cal_Abfallkalender:".$_) if ReadingsVal('settings_abfallfilter',$val,'') eq 'on';}
my $attr1 = join(q(,), @a1);
CommandAttr(undef,"-silent $name filterSummary $attr1");
return 'done';
}

In das userattr filter schreibst alle möglichen Abfallarten Komma getrennt, mit Leerzeichen:
Restabfall,Gelber Sack,Altpapier,...,...
Was ich bei der Variante (userReadings im CALVIEW-Device) selbst nicht ganz verstehe zu lösen, ist das Verhalten wenn man einen trigger angibt. Dann wird das userReadings nie getriggert. Keine trigger-Angabe ist aber auch keine Lösung. Hat wohl damit zu tun das bei einem update immer alle Readings gelöscht werden...

Das userReadings in dem settings_abfallfilter-Device (das ist glaub ich verstanden zu haben ja ein dummy-Device) nutzen wär vlt. besser, wenn es mit trigger-Angabe im CALVIEW-Device nicht umsetzbar sein sollte.


Marko1976

Zitat von: TomLee am 25 September 2025, 19:13:29Was ich bei der Variante (userReadings im CALVIEW-Device) selbst nicht ganz verstehe zu lösen, ist das Verhalten wenn man einen trigger angibt. Dann wird das userReadings nie getriggert. Keine trigger-Angabe ist aber auch keine Lösung. Hat wohl damit zu tun das bei einem update immer alle Readings gelöscht werden...
Also irgendwie reden wir aneinander vorbei. Es gibt kein UserReading im Calview-Device. Es gibt nur das Dummy-Device und dort ein UserReading dessen Ergebnis einfach in ein Attribut des Calview-Device und in ein Attribut des Abfall-Device geschrieben wird statt es irgendwo im Dummy-Device zwischenzuspeichern.

Was du mit dem trigger meinst ist mir unklar. Das UserReading im Dummy-Device wird bei jeder Änderung eines Readings neu berechnet und somit getriggert. Wozu noch einen extra Trigger?

Die Frage ist nur ob ich so überhaupt noch das userAttr Filter brauche, da es ja nicht befüllt wird, anders als in deinem Beispiel. Ich schreibe das Ergebnis ja direkt in die beiden Anzeige-Devices, also Abfall und Calview.

Das angezeigte userReading ist nicht das von mir aktuell verwendete. Bitte hier keine Verwechslungen durch alte Sachen reinbringen. Und bis auf das Problem mit dem Leerzeichen bei "Gelber Sack" funktioniert ja alles, darum hatte ich ja weiter oben die Screenshots gepostet.


@betateilchen
Ob man Fhem als Programm bezeichnen sollte ist in meinen Augen fraglich. Ich sehe es eher als Sammelsorium verschiedener Einzelprogramme. Aber das ist Ansichtssache. Ich meine nur das selbst OpenSource-Programme bessere und gleichere Programmstrukturen aufweisen als Fhem wo man sehr, sehr oft merkt, das verschiedene Leute mit verschiedenen Filosophien etwas geschrieben haben.
ZitatNiemand erwartet von FHEM Anwendern, perl vollständig zu beherrschen. Aber immer dann, wenn an einer der oben genannten Stellen eine geschweifte Klammer {} benötigt wird, kann es nicht schaden, zumindest ein paar Grundlagen der verwendeten Programmiersprache zu kennen.
Das ist sicherlich richtig und doch nicht richtig. Es kann nicht schaden stimmt nämlich nicht, sondern es wird erwartet. Als Vergleich nehme ich einfach mal MS Office, das ist in VB programmiert und man kann es mit VBA selbst erweitern, aber es ist nicht zwingend notwendig VBA zu beherrschen. Bei Fhem kommt man um Perl nicht herum, es ist kein Tool der Programmierer sondern der Anwender wird leider gezwungenermaßen zum Programmierer.
Zitat von: betateilchen am 25 September 2025, 18:49:43Wenn man schon einige Programmiersprachen gelernt hat, wie Du ja von Dir selbst schreibst, ist es doch gar nicht so schwierig und schon gar nicht sonderlich umfangreich, sich die paar perl-spezifischen Dinge wie z.B. vordefinierte Variablen anzueignen.
Das mag sicherlich sein, ansonsten hätte ich das userReading wohl auch kaum durchschaut. Das es sich um eine Schleife und ein Array etc. handelt habe ich ja wahrgenommen, nur die einzelnen Bestandteile innerhalb der Schleife waren mir eben unbekannt.
Doch sei mir nicht böse wenn ich sage, dass ich nicht wirklich Interesse daran habe mir eben diese Variablen anzueignen. Parallel zu Fhem beschäftige ich mich mit dem 3D-Modellbahnstudio weil es eine meiner Leidenschaften ist. Dort wird zur Erweiterung der Steuerung Lua verwendet und das gleiche erwartet. Was kommt dann als nächstes? Noch eine Programmiersprache um mein Videoschnittprogramm zu erweitern oder oder oder. Wie geschrieben habe ich seit einiger Zeit bereits andere gravierendere Probleme die mir wesentlich wichtiger erscheinen als sich die x-te Version von vordefinierten Variablen zu merken. Abgesehen davon, dass es eben auch keine echte Dokumentation gibt wo man diese Nachlesen könnte. Zumindest eine in einer vernünftig lesbaren Form, denn sowohl die Perl- als auch die Fhem-Dokumente sind oft so grottig geschrieben, dass ein Legasteniker wahrscheinlich weniger Probleme hat damit klar zu kommen (was sicher kein Angriff oder eine Diskriminierung sein soll). Das Alter spielt dabei sicherlich keine Rolle, dennoch erschwert es irgendwann das Lernen, weshalb man immer spezifischer auswählt was man lernt.
Sorry für den Roman, ich versuche nur zu erklären warum ich bin wie ich bin. Und wenn es zu viel verlangt ist die Bedeutung einfach mal zu schreiben, dann ist das so und ich akzeptiere das

Marko1976

Zitat von: betateilchen am 25 September 2025, 17:55:24Dort im Bereich ,,General variables" zu finden.
Habe mir den genannten Bereich jetzt mal durchgelesen. Es werden jede Menge Funktionen aufgezählt die diese Variable nutzen, Join jedoch nicht. Davon abgesehen steht dort nicht wofür das $_ denn nun steht. Es muss ja eine bestimmte Bedeutung haben, so wie $name auf den Device-namen verweist. So gehsehen bringt mich dieser Text kein bischen weiter bei der Frage wofür $_ denn nun steht und wodurch es ersetzt wird wenn die Funktion ausgeführt wird.

betateilchen

#27
Wofür Du die Variable $_ letztlich verwendest, kann niemand wissen. Und sie hat auch originär nichts mit der perl-Funktion join() zu tun, man kann sie natürlich aber auch da einsetzen. Die Variable hat auch überhaupt nichts mit FHEM zu tun - im Gegensatz zu $name

Was allerdings eindeutig zu benennen ist, ist die Bedeutung dieser Variablen: sie enthält den aktuellen Wert, mit dem eine von Dir programmierte Schleife (z.B. mit "for") durchlaufen wird.

Bau mal bitte folgenden Code in Deine 99_myUtils.pm ein:

sub test1 {
  my @a = (1..9);
  for(@a){
    Debug $_;
  }
}

und rufe dann in der FHEM Befehlszeile diese Funktion auf

{test1}
Danach schaust Du bitte in Dein Logfile von FHEM - vielleicht wird es Dir dann klarer.



Zitat von: Marko1976 am 25 September 2025, 21:45:50So gesehen bringt mich dieser Text kein bisschen weiter bei der Frage wofür $_ denn nun steht

Das liegt aber offensichtlich eher an Dir, nicht an der verlinkten Beschreibung...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Marko1976

Zitat von: betateilchen am 25 September 2025, 22:01:04Das liegt aber offensichtlich eher an Dir, nicht an der verlinkten Beschreibung.
Sehe ich weniger denn die se Information
Zitat von: betateilchen am 25 September 2025, 22:01:04Was allerdings eindeutig zu benennen ist, ist die Bedeutung dieser Variablen: sie enthält den aktuellen Wert, mit dem eine von Dir programmierte Schleife (z.B. mit "for") durchlaufen wird.
ist eindeutig und beschreibt alles was man wissen will. Der ganze Quatsch der in dem dokument steht bringt nichts. Das letzte Zitat hingegen sagt alles und ist das was in der Doku fehlt.

Keine Ahnung warum, aber mir wird kein Code angezeigt. Ich sehe nur die Begrenzung zum regulären Text mit dem Hintergrund dazwischen, aber nur so hoch, dass kein Text darin abgebildet wird. Ich kann also nicht erkennen ob und was dazwischen steht.


betateilchen

ich gebe auf... 🏳

ZitatDer ganze Quatsch der in dem dokument steht bringt nichts.

Es ist einfach hoffnungslos, Dir helfen zu wollen. An Deinem Unverständnis ist Deiner Meinung nach IMMER jemand anderes Schuld - niemals Du!

Und höre bitte auf, mich auch noch per PN zu belöffeln. Danke.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!