Wie programmieren für Anfänger

Begonnen von ettettette, 10 Oktober 2016, 12:27:27

Vorheriges Thema - Nächstes Thema

ettettette

Hallo liebe Leute,
ich habe es geschafft mein FHEM auf einem Raspberry ans Laufen zu bringen.

Ich möchte eine Heizungs und Lüftungssteuerung  für einige Kellerräume realisieren.

Die Temperatursensoren werden inklusive Taupunkt von einem Jeelink ausgelesen, geloggt und grafisch dargestellt.
Die Funksteckdosen (Intertechno) für Heizung, Lüftung und Lufttrockner, werden über einen CUL geschaltet.

Jetzt muss ich die Logik dafür entwickeln:
Wenn Taupunkt draußen größer Wandtemparatur drinnen, dann Lüften - wenn drinnen zu kalt erst lüften, dann trocknen, dann Heizen...
Dabei beachten, ob jemand da ist - der soll die Wunschtemperatur verändern können oder die Lüfter ausmachen, wenns nervt...

Ich habe mich noch nicht richtig eingelesen, wie das im Detail geht - die Algorithmen habe ich aber schon ungefähr im Kopf.

Wenn ich es richtig verstanden habe, gibt es verschieden Möglichkeiten, so etwas aufzubauen:
Z.B. mit notify direkt in FHEM.
Es gibt aber doch auch die Möglichkeit, das mit Prozeduren in Skripten zu realisieren.

Könnte mir mal einer (ugs.) erklären, welche Möglichkeiten es gibt, vielleicht mit Vor- und Nachteilen, oder gibt es eine Seite oder einen Thread, wo das schon steht.
Vielleicht bin ich auch nur zu dumm zum Suchen.

P.S.: Wie kann ich Listen nutzen; ich muss z.B. Nachschauen, wie lange der Lüfter heute schon lief und wann der nächste Besucher kommt.
P.P.S.: Ganz nett wäre es, wenn ich die Routinen vorher am Mac testen kann, dann könnte ich das im Zug programmieren.

Mit der Bitte um Hilfe

Ette

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

ettettette

#2
Danke CoolTux,
den eine Artikel kannte ich noch nicht.

Was würdest du empfehlen: Alles in FHEM zu realisieren( lange Kette von DOIF, DOELSEIF), oder doch selber ein paar Funktionen zu bauen?

Dahin zielte meine Frage.

Gruß
Ette

CoolTux

Da Du, so klingt es, Dich mit Perl Programmierung nicht aus kennst, würde ich an Deiner Stelle die vorhandenen "einfachen" Wege nehmen.
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

ettettette

Vielen Dank für die Rückmeldung.
Was ich bisher noch gar nicht bei den FHEM-Befehlen gefunden habe:
Wie kann ich die LogFiles auswerten, beispielsweise: "Wie lange lief der Lüfter in den letzten 36 Stunden" und "wieviel Grad hatte der niedrigste Tapunkt in den letzten 24 Stunden".

Muss ich die Logs in eine Datenbank schreiben, um das machen zu können?

Liebe Grüße
Ette

CoolTux

Du könntest Plots anlegen mit Max und Min werten für das von Dir gewählte Zeitfenster.
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

ettettette

#6
Ich versuche gemäß obigem Rat meine Routinen in FHEM zu realisieren.
Leider scheitere ich schon bei einfachsten Aktionen!
Ich möchte beispielsweise zwei Dummys in einem Notify addieren oder eine Konstante (+1) addieren.
Wenn ich die Suche bmühe bekomme ich nur Beispile in Perl angezeigt.
Ist es denn so, dass ich für einfachste arithmetische Operationen schon Perl schreiben muss?

Macht es dann nicht Sinn die Logik komplett in Perl zu schreiben und in 99_myUtils.pm anzulegen?
P.S.: Wieso funktioniert der Befehl print nicht?

Gruß
Ette

CoolTux

Hallo Ette

Sofern Du nicht DOIF verwendest musst Du Formeln immer in Perl schreiben. Ist Deine Perlzeile noch ein Einzeiler, so kann man ihn getrost ins Notify schreiben. Ansonsten nimmt man am besten eine 99_myUtils dafür.

Der Perlbefehl print sollte funktionieren.

Wenn Du den State zweier Dummys addieren möchtest.

Value("dummy1") + Value("dummy2");


Frage ist was soll mit dem Ergebnis passieren. Schreiben in einen dritten Dummy?


fhem ("set dummy3 ") . Value("dummy1") + Value("dummy2");



Grüße
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

ettettette

Habe in einen Notify geschrieben:
timer.* sleep 1.0; {fhem("set timer ") . value("timer") + value("timer")}

Logfile:
2016.10.17 23:51:56 3: set timer  : no set value specified
2016.10.17 23:51:56 2: After sleep: Undefined subroutine &main::value called at (eval 1192) li

ettettette

#9
OK,
Value großgeschrieben ergibt:
2016.10.17 23:57:16 3: set timer : no set value specified
[Mon Oct 17 23:57:16 2016] fhem.pl: Argument "no set value specified2" isn't numeric in addition (+) at (eval 1211) line 1.


Danke für den Versuch
versuchs morgen nochmal
Gruß
Ette

CoolTux

#10
Sorry mein Fehler, mit Rechenoperationen hatte ich das noch nie probiert. Aber so geht das auf jeden Fall


Internals:
   CFGFN
   DEF        dummy1.* { my $erg = Value("dummy1") + Value("dummy2"); fhem "set dummy3 $erg"; }
   NAME       notifyAddieren
   NR         13
   NTFY_ORDER 50-notifyAddieren
   REGEXP     dummy1.*
   STATE      2016-10-18 03:04:16
   TYPE       notify
   Readings:
     2016-10-18 03:04:05   state           active
Attributes:
   room       test


Und bitte kein sleep innerhalb der Perlebene. Das blockiert FHEM.


fhem "sleep 1; set dummy3 bla"


Sowas ist korrekt.
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

ettettette

Vielen Dank für die Hilfe,
ich dachte ich hätte es verstanden und geschrieben
timer.* sleep 1 ; {my $addit = Value("timer") + Value("timer") ; fhem(" set solltempkeiner $addit ") ;}
was allerdings zu einem Fehler führt.

Das hier
timer.* {my $addit = Value("timer") + Value("timer") ; fhem("sleep 1 ; set solltempkeiner $addit ") ;}
funktioniert dagegen.

Wo ist oben der Fehler?
Kann mir das mal einer verständlich erklären.

Vielen Dank im Vorraus
Ette

CoolTux

Du hast beim ersten fhem und Perlebene gemischt. Das geht nicht.
Sobald Du bisschen Perlcode benötigst musst Du das Notify komplett in Perlebene schreiben

{ }

Damit gehst du in die Perlebene, und wenn Du nun einen fhem Befehl Absenden willst, gibst Du mit dem Wort fhem an das ein fhem Befehl folgt


{ bla bla Perlcode bka bla fhem "hier kommen fhem Befehle" und nun wieder Perl;
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

ettettette

Das mit dem Mischen der beiden Ebenen habe ich bisher nicht verstanden, ich dachte im unteren Beispiei würde das gemischt werden.
Fazit: wenn Perl im notify, dann fhem nur innerhalb von Perl.
Vielen vielen Dank.
Als nächstes werde ich mir mal die Funktionsaufrufe in Perl ansehen.
Das ist zwar hier beschrieben (http://www.fhemwiki.de/wiki/99_myUtils_anlegen) aber die Parameterübergabe hat bei mir noch nicht ohne Fehlermeldungen geklappt.

CoolTux

Wenn Fragen dann gerne per PM oder neuen Thread aufmachen.

Grüße
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