Hauptmenü

Perl für Anfänger

Begonnen von 87insane, 04 Mai 2019, 12:17:07

Vorheriges Thema - Nächstes Thema

87insane

Hi zusammen,

da ich nun immer und immer wieder an meine Grenzen stoße aber eben nicht einfach aufgeben will, frage ich mich ob es hier ggf. mehrere Personen gibt die Perl erlernen wollen?
Hinzu wird es sicher auch Personen geben die vllt. denen die es lernen wollen ein wenig helfen oder zeigen können...

Ohne es unnötig auf zu bauschen:
1. Gibt es weitere Personen wie mich, die echt mal weiter kommen wollen und verstehen wollen was in FHEM und mit PERL alles geht?
2. Gibt es Personen die ggf. Lehrer sein können und auch wollen für die Personen aus Punkt 1?

Ich danke allen die sich hier beteiligen und ggf. bekommen wir ja eine Lerngruppe oder sowas hin :)

Gruß,
Kai

Byte09

Zitat von: 87insane am 04 Mai 2019, 12:17:07
Hi zusammen,

da ich nun immer und immer wieder an meine Grenzen stoße aber eben nicht einfach aufgeben will, frage ich mich ob es hier ggf. mehrere Personen gibt die Perl erlernen wollen?
Hinzu wird es sicher auch Personen geben die vllt. denen die es lernen wollen ein wenig helfen oder zeigen können...

Ohne es unnötig auf zu bauschen:
1. Gibt es weitere Personen wie mich, die echt mal weiter kommen wollen und verstehen wollen was in FHEM und mit PERL alles geht?
2. Gibt es Personen die ggf. Lehrer sein können und auch wollen für die Personen aus Punkt 1?

Ich danke allen die sich hier beteiligen und ggf. bekommen wir ja eine Lerngruppe oder sowas hin :)

Gruß,
Kai

ich würde mich zwar nicht als experte betrachten, komme aber mit perl ganz gut klar und helfe gerne, wo ich kann.

gruss Byte09

CoolTux

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

Tommy82

Ich finds eine gute Idee, da ich auch nicht wirklich fit bin in Perl lese ich auch gerne mit


Gesendet von iPhone mit Tapatalk
Fhem Cubitruck  Armbian Buster with Linux 5.3.9-sunxi
HM-CC_RT-DN, HM-Sec-RHS,HM-Sec-SD, HM-Sec-SCo,IT1500,1xIT GRR-3500 Fritz!Dect200,Powerline546E,Enigma2 Modul mit 3 Vu+,Wol Modul für WinServer2016 und WinServer 2019,FB6590
Allnetl Wandtablett mit FTUI

Mundus

Hi,
Den Ansatz finde ich super, kann aber auch nur als Mitleser auftreten ;)

Zu Beginn meiner FHEM-Zeit habe ich mir ein Perl-Buch (Einführung in Perl aus dem O'Reilly Verlag) gekauft. Das hat mir geholfen einige Dinge zu verstehen und "erfolgreich" umzusetzen.

Gruß

Mundus

Beta-User

Netter Ansatz, ist sicher gut, sich da zusammenzutun.

Wenn es eine Telco geben sollte, nehme ich gerne Teil, aber als "Lehrer" eigne ich mich in dem Rahmen eher nicht, ich mach' einfach selber noch zu viele Fehler und habe nicht den nötigen Überblick.

Aber mal eine generelle Anmerkung zu dem Thema:
Die Schnittstelle zwischen FHEM und "normalem Perl" bzw. die Doku dazu sollte man sich ggf. mal ansehen. Soweit ich das im Kopf habe, firmiert das unter den Stichworten "myUtils anlegen" im Wiki und den Perl specials der commandref. Das setzt einiges an vorhandenen (Perl-) Programmierkenntnissen voraus und schreckt evtl. viele der "Neuen" ab.
Die nächste Stufe ist dann gleich die DevelopmentModuleAPI usw.. Mindestens dem Namen klingt das so abgehoben, das vermutlich kaum jemand mal für "normalen myUtils-Code" oder "Einzeiler" reinschaut. Da steht aber einiges drin, was ich auch für normale Funktionen nutze (fhem "..." gibt's bei mir z.B. in der Regel bei neueren Sachen nicht mehr).

Ansonsten kann ich https://www.tutorialspoint.com/perl/index.htm empfehlen.

Was dann noch fehlt regex - da gibt es aber auch einige gute Seiten im Web dazu, z.B. http://regex101.com/, Benni hatte neulich noch auf was besseres verlinkt.

Aber grundsätzlich sollte man ein gewisses formal-logisches Denken bereits beherrschen und möglichst schon eine Vorstellung von Schleifen (-typen), Datentypen/Arrays usw. haben und seinen Programmablauf in Worten beschreiben können - daran fehlt es leider oft schon.

Vielleicht sollte man mal sowas zusammenstellen wie eine schnelle Referenzliste mit guten Links zu den Themen, v.a. auch an der Schnittstelle zwischen FHEM und "Perl im allgemeinen"? Letztlich hat jeder seine eigene Geschwindigkeit beim Lernen, die Voraussetzungen sind völlig unterschiedlich und nicht zuletzt hat vermutlich auch jeder grade ein anderes Problem, das er lösen möchte...
Da würde sowas ggf. helfen (Ausbaustufe: eine Art Basiskurs, ähnlich wie "erste Schritte" oder dem "Device Overview anpassen" im Wiki)?
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

87insane

In erster Instanz dachte ich auch an gemeinsames lernen gegenseitiges helfen. Wenn daraus ein "Wiki" entsteht ist das natürlich noch besser.
Regex gehört genauso dazu. Ohne die Hilfe hier im Forum bei meinen ersten Regex, hätte ich das auch nicht geschafft. Da bin ich aber garnicht mehr so schlecht :)

Mal sehen wie sich dieser Thread füllt und was man am Ende machen kann... Ich freue mich über so viel Resonanz !

Maista

#7
Moin

Hier gibt es Lesestoff zu diverse Themen und Sprachen.
https://docstore.mik.ua/orelly/bookshelfs.html

Auch interessant mit vielen Beispielen ist Perl Maven.
Hier kann man sich ein Newsletter zu Perl abonnieren.
https://perlmaven.com/

Beide in Englisch, aber Beispiele helfen ja auch.

Und in deutsch gibt es das auch noch :)
http://perl-seiten.privat.t-online.de/

Gruß
Gerd

krikan

Lese hier auch mal mit.  :)

An der "Quelle" gibt es ausführliche Doku und Tutorials:
Startpunkt: https://perldoc.perl.org/index.html
Einführung: https://perldoc.perl.org/perlintro.html

Gruß, Christian

Beta-User

Nachdem ich mir das Thema myUtils anlegen mal angesehen habe, nachfolgend der Versuch, ein "Einsteiger"-Beispiel zu erstellen.

Zugrundeliegendes "Problem":
Unsere Gartenpumpe für's Regenwasser ist eigentlich ein Hauswasserwerk, dessen Pumpe über einen (intern verbauten mechanischen) Druckschalter an- und ausgeschaltet wird. Das Ganze hängt hinter einem Aktor, der lokal an einem Schalter ein- und ausgeschaltet werden kann, FHEM bekommt das jeweils mit, nicht aber das, was der Druckschalter intern veranstaltet.
Da Teile der Bewässerungsanlage etwas Wasser verlieren, soll der Aktor nach einer bestimmten Zeit wieder ausgeschaltet werden, damit man nachts nicht durch die Pumpe geweckt wird, nur weil jemand vergessen hat, den leckenden Teil der Anlage wegzuschalten (bevor jemand meint, dass man das Problem auch anders lösen kann und abdichten: Ja, könnte man, aber zum einen brauche ich ein Beispiel, und zum anderen ist das Leck an einer denkbar unzugänglichen Stelle und der Verlust sehr gering).

Hier soll erläutert werden, wie man von einem einfachen notify zu einem zentralen Code kommt, der dann auch für viele andere ähnliche Fragestellungen genutzt werden kann.

Schritt 1: "einfaches notify"

Erstellen wie in "EventMonitor" beschrieben => Zeile markieren, notify auswählen

defmod Pumpe_Zisterne_notify_1 notify Pumpe_Zisterne:.on defmod at_Pumpe_aus at +01:05 set Pumpe_Zisterne off
attr Pumpe_Zisterne_notify_1 room Steuerung->Logik

Ergebnis:
Bei Einschalten der Pumpe wird ein at erstellt, das die Pumpe wieder ausschaltet. Aufgabe an sich gelöst. "Sowas" kann man aber ggf. häufiger auch für andere Aktoren brauchen, wir machen also weiter:

Schritt 2: Generalisieren => myUtils-Code

a) myUtils-Code erstellen:

##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;

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

# Enter you functions below _this_ line.

sub
mySwitchOffAfter($) {
  my $ondevice = shift(@_);
  #gleichbedeutend mit 'fhem "defmod my_switchoff_$ondevice at +01:05 set $ondevice off"'
  CommandDefMod(undef,"my_switchoff_$ondevice at +01:05 set $ondevice off");
}

1;

b) notify ändern (DEF)
Pumpe_Zisterne:.on {mySwitchOffAfter("Pumpe_Zisterne")}
oder, etwas generischer:
Pumpe_Zisterne:.on {mySwitchOffAfter($NAME)}

An unsere Einsteiger in das Thema: Wenn jemand Interesse an meinem Beispielchen hat, kann er gerne mal versuchen, das dahingehend zu erweitern, dass
- auch die Zeitdauer mitgegeben werden kann;
- die Zeitdauer _optional_ ist, wird keine angegeben, soll ein default-Wert gelten;
- kein at erstellt wird, sondern ein InternalTimer (damit kein Raum angelegt wird);
- ein SetExtensions-on anders behandelt wird (soll Vorrang haben, Pumpe bleibt als an, z.B. weil die Bewässerung durch einen Automatismus gesteuert wird, der länger aktiv ist).

Beachtet: jedes der Teilchen ist für sich genommen kein ganz einfaches Thema, es ist völlig legitim, jeweils nur immer einen Teile davon rauszupicken ;) .

Viel Spaß beim Tüfteln, ich denke, die Auflösung kommt ggf. irgenwann mal :P .
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

87insane

Danke für das Beispiel. Habe genau das gleiche Problem was meine Grundwasserpumpe angeht. Genau in dem Teil, den ich gerne Blackbox nenne, habe ich minimale Undichte. Naja gut... Wenn die Einfahrt nochmal neu gepflastert wird, dann mache ich auch den Teil neu.

Soooo zurück zum Thema:
Da ich keine Ahnung habe, habe ich mal angefangen mir Kleinigkeiten rauß zu suchen und zu gucken was es überhaupt heißt. Anbei mal ein Link für das shift in Perl: http://www.hidemail.de/blog/shift-perl.shtml (Hier ist es in der Subroutine in der myUtils) - "...my $ondevice = shift(@_);...".

Zitat- auch die Zeitdauer mitgegeben werden kann;
Von wo aus sollte sie denn mitgegeben werden? Sinn macht es ja das in einem set in einem Gerät zu haben um es bei Bedarf zu setzen - oder?

Zitat- ein SetExtensions-on anders behandelt wird (soll Vorrang haben, Pumpe bleibt als an, z.B. weil die Bewässerung durch einen Automatismus gesteuert wird, der länger aktiv ist).
Interessanter Teil! Für vieles kann das hier genutzt werden. Ich selber würde mir vermutlich ein zwischen Reading machen. Dieses sollte dann den Zustand vor Aktivierung speichern. Was aber wenn während der manuellen Bewässerung ein Automatismus aktiv wird? Dann müsste dieser ja trotzdem weiter laufen oder eben auch nicht. Also müsste man wieder prüfen was genau und wie lange der jeweilige Automatismus arbeiten würde. 

(Alles was ich schrieb ist KEIN perfektes Vorgehen. Das ist einzig gerade als Idee in meinem Kopf entstanden).

Eisix


Beta-User

Zitat von: 87insane am 14 Mai 2019, 11:52:57
Von wo aus sollte sie denn mitgegeben werden? Sinn macht es ja das in einem set in einem Gerät zu haben um es bei Bedarf zu setzen - oder?
Schöne Frage!

Ich hatte eigentlich eher daran gedacht, die Funktion mit einem weitere Parameter für die Zeit aufzurufen. Möglich ist aber natürlich auch, dass die erforderlichen Werte aus dem zu schaltenden Device geholt werden.

Also heißt die konkrete (volle) Aufgabe jetzt: Funktionaufruf mit optionalem Parameter, wobei entweder ein Attribut- oder Readingname (= Anweisung: lies das aus dem Zieldevice ab) angeben werden kann, oder eben eine Zeitdauer, die entweder im HH:MM[:SS]-Format sein darf, oder ein Sekundenwert :P . Benötigt also für die endgültige Fassung dann diverse Fallunterscheidungen ;D .
ZitatInteressanter Teil! Für vieles kann das hier genutzt werden. Ich selber würde mir vermutlich ein zwischen Reading machen. Dieses sollte dann den Zustand vor Aktivierung speichern. Was aber wenn während der manuellen Bewässerung ein Automatismus aktiv wird? Dann müsste dieser ja trotzdem weiter laufen oder eben auch nicht. Also müsste man wieder prüfen was genau und wie lange der jeweilige Automatismus arbeiten würde. 

(Alles was ich schrieb ist KEIN perfektes Vorgehen. Das ist einzig gerade als Idee in meinem Kopf entstanden).
Ich hatte an ein (bereits vorhandenes!) Internal gedacht ;) . Das wäre dann zu prüfen, wenn die Abschaltung greift. Diese Lösung braucht aber für "blink" ein ziemlich aktuelles FHEM 8) . Die von mir angedachte Lösung ist aus SetExtenstions.pm abzulesen oder einem list eines Geräts mit laufendem Timer. (Erweiterung: Für Module, die Abschaltung in Hardware ermöglichen (Homematic): Sonderbehandlung...)
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

andies

spannend


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

MCh76

super initiative. verzweifele auch regelmäßig an bestimmten punkten.