FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ettettette am 10 Oktober 2016, 12:27:27

Titel: Wie programmieren für Anfänger
Beitrag von: ettettette am 10 Oktober 2016, 12:27:27
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 10 Oktober 2016, 12:32:31
https://forum.fhem.de/index.php?topic=20693.0

http://www.fhemwiki.de/wiki/Energiesparende_Schimmelbek%C3%A4mpfung_/_Luftentfeuchtung_in_kritischen_R%C3%A4umen

Eventuell hilft es Dir etwas beim rausfinden einer passenden Lösung für Dich.
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 10 Oktober 2016, 12:39:31
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 10 Oktober 2016, 12:55:25
Da Du, so klingt es, Dich mit Perl Programmierung nicht aus kennst, würde ich an Deiner Stelle die vorhandenen "einfachen" Wege nehmen.
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 11 Oktober 2016, 13:28:13
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 11 Oktober 2016, 14:07:01
Du könntest Plots anlegen mit Max und Min werten für das von Dir gewählte Zeitfenster.
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 17 Oktober 2016, 21:15:37
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 17 Oktober 2016, 21:40:36
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 17 Oktober 2016, 23:54:01
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 17 Oktober 2016, 23:58:26
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 18 Oktober 2016, 03:10:55
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.
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 18 Oktober 2016, 15:48:26
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
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 18 Oktober 2016, 16:07:45
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;
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 18 Oktober 2016, 18:02:04
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 (http://www.fhemwiki.de/wiki/99_myUtils_anlegen)) aber die Parameterübergabe hat bei mir noch nicht ohne Fehlermeldungen geklappt.
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: CoolTux am 18 Oktober 2016, 18:06:03
Wenn Fragen dann gerne per PM oder neuen Thread aufmachen.

Grüße
Titel: Antw:Wie programmieren für Anfänger
Beitrag von: ettettette am 18 Oktober 2016, 19:12:41
Hier noch das funktionierende Ergebnis meines Programmiertages:
Mein persönliches "Hello World"als OneLiner in einem Notify (Zählt von Starttimer runter bis 0 und fängt von vorne an-wichtig ist der Space vor dem Punkt):


timer.*   {if (Value("timer") eq "0") {fhem("sleep 0.1 ;set timer " . (Value("starttimer"))) } else {  my $addit = Value("timer") - 1 ; fhem("sleep 0.1 ; set timer $addit ") ;}}

Danke für die Hilfe und
Schönen Abned noch
Ette