FHT 8v direkt ansprechen: Unterschied zwischen den Versionen

Aus FHEMWiki
(Anpassung von <source>-Tags nach <syntaxhighlight>)
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Die Heizungs-Stellantriebe [[CUL]] direkt angesprochen werden.  
Die Heizungs-Stellantriebe '''FHT8v''' können mit einem [[CUL]] '''direkt angesprochen''' werden.  
Eine sinnvolle Ergänzung dazu stellen die Temperatur und Feuchtemesser S300TH dar.
Eine sinnvolle Ergänzung dazu stellen die Temperatur und Feuchtemesser [[S300TH]] dar.
Mit dieser Kombination ist es möglich die Stellantriebe temperaturabhängig zu steuern.
Mit dieser Kombination ist es möglich die Stellantriebe temperaturabhängig zu steuern.
= Kurzanleitung =
Die FHT8V mittels Webfrontend in FHEM integrieren.
(''Die Beispiele zeigen einen CUL der als CUL_0 in der fhem.cfg definiert wurde'')


Folgenden Code in die fhem.cfg einzutragen:
== Kurzanleitung ==
Die [[FHT8v]] mittels Webfrontend in FHEM integrieren (''die Beispiele zeigen einen CUL der als CUL_0 in der fhem.cfg definiert wurde''). Folgenden Code in die fhem.cfg eintragen:
<pre>
define stellantrieb.01 FHT8V 1234
attr stellantrieb.01 room Heizungen
</pre>


<nowiki>define stellantrieb.01 FHT8V 1234
Vorbereitung des FHT8V:  
attr stellantrieb.01 room Heizungen</nowiki>
# Batterien in den Stellantrieb einlegen und warten bis "A2" im Display erscheint  
Vorbereitung des FHT8V: Batterien in den Stellantrieb einlegen und warten bis "A2" im Display erscheint und dann Antrieb an Heizkörper anschrauben.
# Antrieb an den Heizkörper anschrauben.
# einmal kurz drücken und der Antrieb fährt zu und wieder auf
# danach zeigt er "A3".
# Am Stellantrieb den Knopf solange drücken bis 3 Pieptöne ertönen
# Im Web-Frontend auf [Heizungen] gehen dann auf [Stellantrieb.01] und auf den Knopf [SET] stellantrieb.01 pair drücken.


Dann einmal kurz drücken und der Antrieb fährt zu und wieder auf danach zeigt er "A3".
Wenn alles geklappt hat ertönt ein Piepton am Antrieb. Weiter geht es im Abschnitt: Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan


1. Am Stellantrieb den Knopf solange drücken bis 3 Pieptöne ertönen
== Der lange Weg mit Erklärung  ==
 
2. Im Web-Frontend auf [Heizungen] gehen dann auf [Stellantrieb.01] und auf den Knopf [SET] stellantrieb.01 pair drücken.
 
Wenn alles geklappt hat ertönt ein Piepton am Antrieb.
 
Weiter geht es im Abschnitt: Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan
 
 
 
<hr />
= Der lange Weg mit Erklärung  =
Die FHT8V mittels FHEM- Kommandozeile integrieren.
Die FHT8V mittels FHEM- Kommandozeile integrieren.


Zeile 31: Zeile 26:


1. Mit den FHEM-Befehlen für das Device "FHT8V"
1. Mit den FHEM-Befehlen für das Device "FHT8V"
Das definieren des Stellantriebs in der fhem.cfg erfolgt wie oben beschrieben. (define <name> FHT <housecode> [IODev] )


Das definieren des Stellantriebs in der fhem.cfg erfolgt wie oben beschrieben. (define &lt;name&gt; FHT &lt;housecode&gt; [IODev] )
Hier eine Übersicht der FHT-spezifischen Befehle:
 
Hier eine Übersicht der FHT-spezifischen Befehle&#160;:


  <nowiki>set &lt;name&gt; pair&#160;; zB. set stellantrieb.01 pair (pairen des Antriebes mit dem Namen stellantrieb.01)</nowiki>
  <nowiki>set &lt;name&gt; pair&#160;; zB. set stellantrieb.01 pair (pairen des Antriebes mit dem Namen stellantrieb.01)</nowiki>
Zeile 40: Zeile 34:
<nowiki>get &lt;name&gt; valve zB. get stellantrieb.01 valve (Hole das letzte Stell-Kommando aus dem SendePuffer)</nowiki>
<nowiki>get &lt;name&gt; valve zB. get stellantrieb.01 valve (Hole das letzte Stell-Kommando aus dem SendePuffer)</nowiki>
Hier der Link zur Command-Ref&#160;: [http://fhem.de/commandref.html#FHT8Vset [1]]
Hier der Link zur Command-Ref&#160;: [http://fhem.de/commandref.html#FHT8Vset [1]]


2. Mit den RAW-Befehlen
2. Mit den RAW-Befehlen
Zeile 49: Zeile 41:
Der Befehl pairt FHEM mit dem Stellantrieb.
Der Befehl pairt FHEM mit dem Stellantrieb.


  <nowiki>set CUL_0 raw T1234012f00</nowiki>
  set CUL_0 raw T1234012f00
 
Aufgesplittet:  
Aufgesplittet:  
 
  set CUL_0 raw --&gt; sendet über CUL_0
  <nowiki>set CUL_0 raw --&gt; sendet über CUL_0
      T1234    --&gt; Stellantriebe Raum1
        T1234    --&gt; Stellantriebe Raum1
           01  --&gt; Der erste Stellantrieb des og. Raumes
           01  --&gt; Der erste Stellantrieb des og. Raumes
           2f  --&gt; Pairen
           2f  --&gt; Pairen
             00 --&gt; gehört zum Pairbefehl</nowiki>
             00 --&gt; gehört zum Pairbefehl
 
Der Befehl setzt die Stellposition.
Der Befehl setzt die Stellposition.
 
:<code>set CUL_0 raw T1234012600</code>
<nowiki>set CUL_0 raw T1234012600</nowiki>
Aufgesplittet:
Aufgesplittet:
 
  set CUL_0 raw --&gt; sendet über CUL_0
  <nowiki>set CUL_0 raw --&gt; sendet über CUL_0
      T1234    --&gt; Stellantriebe Raum1
        T1234    --&gt; Stellantriebe Raum1
           01  --&gt; Der erste Stellantrieb des og. Raumes
           01  --&gt; Der erste Stellantrieb des og. Raumes
           26  --&gt; Stellantrieb bewegen
           26  --&gt; Stellantrieb bewegen
             00 --&gt; Wieviel Prozent der Öffung des Stellantriebes (Beachte in HEXADEZIMAL&#160;!)
             00 --&gt; Wieviel Prozent der Öffung des Stellantriebes (Beachte in HEXADEZIMAL&#160;!)
            00 = 0&#160;% Öffnung (Kalt)
            00 = 0&#160;% Öffnung (Kalt)
            19 = 10&#160;%
            19 = 10&#160;%
            33 = 20&#160;%
            33 = 20&#160;%
            4c = 30&#160;%
            4c = 30&#160;%
            ...
            ...
            ff = 100&#160;% (Heiss)
            ff = 100&#160;% (Heiss)
            Berechnung&#160;: SollProzent * 255 / 100 = Wert
            Berechnung&#160;: SollProzent * 255 / 100 = Wert
            og.Wert von Dezimal in Hexadezial umrechnen ergibt die beiden letzten Zahlen</nowiki>
            og.Wert von Dezimal in Hexadezial umrechnen ergibt die beiden letzten Zahlen
<hr />
&lt;&lt; Mehrere Räume &gt;&gt;


Wird zB. die FHT-ID 1234 gewählt, so kann diese für den ersten Raum genutzt werden. Der zweite Raum bekommt die FHT-ID 1334, der dritte 1434 usw.
'''Mehrere Räume'''
Es wir also das erste Byte um je eins inkrementiert.
 
Wird zB. die FHT-ID 1234 gewählt, so kann diese für den ersten Raum genutzt werden. Der zweite Raum bekommt die FHT-ID 1334, der dritte 1434 usw. Es wir also das erste Byte um je eins erhöht.


Beispiele:
Beispiele:
Zeile 91: Zeile 81:
definiert werden.   
definiert werden.   


Der 1. Stellantrieb des 2. Raumes wird mit&#160;:
Der 1. Stellantrieb des 2. Raumes wird mit:
 
:<code>set CUL_0 raw T1334012f00 [Enter]</code>
<nowiki>set CUL_0 raw T1334012f00 [Enter]</nowiki>
Der 1. Stellantrieb des 3. Raumes wird mit:
Der 1. Stellantrieb des 3. Raumes wird mit&#160;:
:<code>set CUL_0 raw T1434012f00 [Enter]</code>
 
<nowiki>set CUL_0 raw T1434012f00 [Enter]</nowiki>
gepairt.
gepairt.


Zeile 108: Zeile 96:




&lt;&lt; Mehrere Stellantriebe pro Raum &gt;&gt;
'''Mehrere Stellantriebe pro Raum'''


(wurde noch ńicht getestet)
(wurde noch ńicht getestet)
Zeile 117: Zeile 105:
es folgt die Kennung im Raum  
es folgt die Kennung im Raum  


  <nowiki>01 (erster Antrieb im Raum 1234)</nowiki>
  01 (erster Antrieb im Raum 1234)
<nowiki>02 (2. Antrieb im Raum 1234)  
02 (2. Antrieb im Raum 1234)  
   
00 (es werden alle Antriebe im Raum 1234 angesprochen)
                  00 (es werden alle Antriebe im Raum 1234 angesprochen)</nowiki>
26 (zB.Antrieb stellen)
<nowiki>26 (zB.Antrieb stellen)</nowiki>
ff (zB.Antrieb 100% aufmachen)
<nowiki>ff (zB.Antrieb 100% aufmachen)</nowiki>
= Kommando Struktur und bekannte Befehle =
set CUL_0 raw THHHHDDCCVV


T = FHT Protokoll (statisch T)
== Kommando Struktur und bekannte Befehle ==
<code>set CUL_0 raw THHHHDDCCVV </code>


HHHH = Hauscode in Hex  
;T
:FHT Protokoll (statisch T)
;HHHH
:Hauscode in Hex  
;DD
:Gerätenummer in Hex (bis zu 8 pro Raum)
;CC
:Befehl
;VV
:Wert


DD = Gerätenummer in Hex (bis zu 8 pro Raum)


CC = Befehl
Bekannte Befehle:


VV = Wert
2f Pair Verbindung mit FHEM herstellen
26 öffne den Stellantrieb in VV&#160;% (8bits of Hex) Berechnung siehe oben
set CUL_0 raw T11 Puffer für alle FHT8V-Geräte abfragen
set CUL_0 raw T10 Puffer für alle FHT8V-Geräte löschen


== Beispiel Befehle ==
set CUL_0 raw T1234012600  -&gt; Raum 1234, Stellantrieb1, 0&#160;% (kalt)
set CUL_0 raw T1234012685  -&gt; Stellantrieb 52&#160;%
set CUL_0 raw T12340126FF  -&gt; Stellantrieb 100&#160;% (heiss)


Bekannte Befehle
== Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan ==
[[PID]] ist ein [[:Kategorie:Hilfsmodul|Helper-Modul]] von FHEM. Es steht standardmäßig zur Verfügung und steuert die Verbindung zwischen den Temperaturfühlern S300TH und dem Stellantrieb FHT8V.


2f Pair Verbindung mit FHEM herstellen
Voraussetzung für die Nutzung von PID ist ein Temperaturfühler S300TH mit Namen "CUL_WS_1" sowie ein gepairter Stellantrieb FHT8V im Raum "1234".
 
26 öffne den Stellantrieb in VV&#160;% (8bits of Hex) Berechnung siehe oben
 
set CUL_0 raw T11 Puffer für alle FHT8V-Geräte abfragen
 
set CUL_0 raw T10 Puffer für alle FHT8V-Geräte löschen
 
= Beispiel Befehle =
set CUL_0 raw T1234012600  -&gt; Raum 1234, Stellantrieb1, 0&#160;% (kalt)
 
set CUL_0 raw T1234012685  -&gt; Stellantrieb 52&#160;%
 
set CUL_0 raw T12340126FF  -&gt; Stellantrieb 100&#160;% (heiss)
 
 
 
= Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan =
PID ist ein Helper-Modul von FHEM. Es steht standardmaessig zur Verfuegung und steuert die Verbindung zwischen den Temperaturfühlern S300TH und dem Stellantrieb FHT8V.
 
Es folgt ein Beispiel für die Benutzung:
 
Voraussetzung ist ein Temperaturfühler S300TH mit Namen "CUL_WS_1" sowie ein gepairter Stellantrieb FHT8V im Raum "1234".


Ein Floorplan names "fp_grundriss" sollte eingebunden sein.
Ein Floorplan names "fp_grundriss" sollte eingebunden sein.


Folgender Code wäre in die fhem.cfg einzutragen:
Folgender Code ist in die fhem.cfg einzutragen:


  <nowiki>define stellantrieb.01 FHT8V 1234
  define stellantrieb.01 FHT8V 1234
  attr stellantrieb.01 room Heizungen
attr stellantrieb.01 room Heizungen
  ##
##
  define heizung.01 PID CUL_WS_1 stellantrieb.01
define heizung.01 PID CUL_WS_1 stellantrieb.01
  attr heizung.01 alias Heizung_1
attr heizung.01 alias Heizung_1
  attr heizung.01 room Heizungen</nowiki>
attr heizung.01 room Heizungen


Damit wird im Raum "Heizungen" ein FHT8V Names "Stellantrieb.01" und ein PID names "Heizung_1" dargestellt und kann auch dort bedient werden.
Damit wird im Raum "Heizungen" ein FHT8v namens "Stellantrieb.01" und ein PID names "Heizung_1" dargestellt und kann dort auch bedient werden.


Um das Ganze noch etwas komfortabler zu gestalten ergänzen wir folgenden Code in die fhem.cfg
Um das Ganze noch etwas komfortabler zu gestalten, wird noch folgender Code in der fhem.cfg ergänzt:


define Heizkörper_1_desired_temp dummy
# die Position 300,210 ist natürlich zu ändern
attr Heizkörper_1_desired_temp fp_Grundriss 300,210,2,Wunschtemperatur
attr Heizkörper_1_desired_temp room Heizungen
attr Heizkörper_1_desired_temp setList state:17,18,19,20,21,21.5,22
attr Heizkörper_1_desired_temp webCmd state
### Der Notivy steuert das Zusammenspiel Änderung im Floorplan und Weitergabe an FHEM
define Change_heizung.01 notify Heizkörper_1_desired_temp {\
  my $neuer_wert = ReadingsVal("Heizkörper_1_desired_temp","state","0")&#160;;;\
  fhem("set heizung.01 desired $neuer_wert");;\
}


Damit wird im Floorplan ein Dropdown dargestellt, mit welchem die Temperatur des Stellantriebs.01 geregelt werden kann (bitte Geduld. Zwischen Änderung im Floorplan und Umsetzung am Stellantrieb kann eine Weile vergehen).


<nowiki>define Heizkörper_1_desired_temp dummy
== Beispiel für einen zentralen Heizungsschalter ==
  # die Position 300,210 ist natürlich zu ändern
Voraussetzung ist ein Floorplan und die oben beschriebene Einbindung der FHT8+S300TH Kombination.
  attr Heizkörper_1_desired_temp fp_Grundriss 300,210,2,Wunschtemperatur
  attr Heizkörper_1_desired_temp room Heizungen
  attr Heizkörper_1_desired_temp setList state:17,18,19,20,21,21.5,22
  attr Heizkörper_1_desired_temp webCmd state
  ### Der Notivy steuert das Zusammenspiel Änderung im Floorplan und Weitergabe an FHEM
  define Change_heizung.01 notify Heizkörper_1_desired_temp {\
    my $neuer_wert = ReadingsVal("Heizkörper_1_desired_temp","state","0")&#160;;;\
    fhem("set heizung.01 desired $neuer_wert");;\
  }</nowiki>
Und nun wird im Floorplan ein Dropdown dargestellt mit welchen wir die Temperatur des Stellantriebs.01 regel können.
(Bitte Geduld. Zwischen Änderung im Floorplan und Umsetzung am Stellantrieb kann eine Weile vergehen.)


= Beispiel für einen zentralen Heizungsschalter =
Die Schaltbilder auf dem Floorplan haben den Namen "Heizung_minimal.on.png" sowie "Heizung_minimal.off.png".
Voraussetzung ist ein Floorplan und og. Einbindung der FHT8+S300TH Kombinationen.
 
Meine Schaltbilder auf dem Floorplan haben den Namen "Heizung_minimal.on.png" sowie "Heizung_minimal.off.png".


Die Bilder unter "fhem/www/pgm2" speichern.
Die Bilder unter "fhem/www/pgm2" speichern.


Das Umschalten der Bilder geschieht automatisch mit diesem Attribut.
Das Umschalten der Bilder geschieht automatisch mit diesem Attribut.
 
:<code>attr Heizung_minimal fp_image Heizung_minimal.{state}.png</code>
<nowiki>attr Heizung_minimal fp_image Heizung_minimal.{state}.png</nowiki>
Es folgen die Eintragungen im config file "fhem.cfg"
Es folgen die Eintragungen im config file "fhem.cfg"


 
  define Heizung_minimal dummy
 
  <nowiki>define Heizung_minimal dummy
  attr Heizung_minimal fp_Grundriss 450,95,1,Heizung minimal
  attr Heizung_minimal fp_Grundriss 450,95,1,Heizung minimal
  attr Heizung_minimal fp_image Heizung_minimal.{state}.png
  attr Heizung_minimal fp_image Heizung_minimal.{state}.png
  attr Heizung_minimal room Heizungen
  attr Heizung_minimal room Heizungen
  attr Heizung_minimal setList on off</nowiki>
  attr Heizung_minimal setList on off
#
#


Es folgen die entsprechende NOTIY-Einträge.
Es folgen die entsprechende NOTIFY-Einträge.


Einmal werden die beiden unten genannten Heizkörper auf 17 Grad gebracht und zurück wieder auf 20 Grad.
Einmal werden die beiden unten genannten Heizkörper auf 17 Grad gebracht und zurück wieder auf 20 Grad.


  <nowiki>define Heizung_MIN notify Heizung_minimal:on {\
  define Heizung_MIN notify Heizung_minimal:on {\
     # jetzt werden die PIDs angwiesen mit den Stellantrieben 17 Grad zu erreichen
     # jetzt werden die PIDs angwiesen mit den Stellantrieben 17 Grad zu erreichen
     fhem("set heizung.01 desired 17");;\
     fhem("set heizung.01 desired 17");;\
Zeile 228: Zeile 207:
     fhem("set Heizkörper_2_desired_temp 17");;\
     fhem("set Heizkörper_2_desired_temp 17");;\
     Log 3, "Heizung auf 17 Grad";;\
     Log 3, "Heizung auf 17 Grad";;\
}
}
   define Heizung_MAX notify Heizung_minimal:off {\
   define Heizung_MAX notify Heizung_minimal:off {\
     fhem("set heizung.01 desired 20");;\
     fhem("set heizung.01 desired 20");;\
Zeile 234: Zeile 213:
     fhem("set heizung.02 desired 20");;\
     fhem("set heizung.02 desired 20");;\
     fhem("set Heizkörper_2_desired_temp 20");;\
     fhem("set Heizkörper_2_desired_temp 20");;\
     Log 3, "Heizung auf 20 Grad";;\</nowiki>
     Log 3, "Heizung auf 20 Grad";;\
}
}


== Einen Heiz-Zeitplan erstellen (mit Urlaubsfunktion) ==
Dazu läuft ein AT und dieser schaut immer um 00, 15, 30, 45 einer jeden Stunde in der Steuerdatei nach, ob etwas zu verändern ist.


In die '''fhem.cfg''' einfügen:


= Einen Heiz-Zeitplan erstellen (mit Urlaubsfunktion) =
# Frage jede 1/4 Stunde Heizzeiten.cfg ab
... Dazu läuft ein AT und dieser schaut immer um 00, 15 , 30 , 45 einer jeden Stunde in der Steuerdatei nach, ob was zu verändern ist.
define Heizschalter_alle_15_minuten at +*00:15:00 {sucheSchaltzeit()}
attr Heizschalter_alle_15_minuten alignTime 00:00:00


In die '''fhem.cfg'''einfügen&#160;:
<nowiki># Frage jede 1/4 Stunde Heizzeiten.cfg ab
define Heizschalter_alle_15_minuten at +*00:15:00 {sucheSchaltzeit()}
attr Heizschalter_alle_15_minuten alignTime 00:00:00</nowiki>
als nächstes die Datei '''/usr/share/fhem/FHEM/Heizzeiten.cfg '''anlegen und befüllen:
als nächstes die Datei '''/usr/share/fhem/FHEM/Heizzeiten.cfg '''anlegen und befüllen:


  <nowiki>###########################################
  ###########################################
##### Hier werden die Heizzeiten definiert
##### Hier werden die Heizzeiten definiert
# 0-6 Wochentag beginnt mit Sonntag
# 0-6 Wochentag beginnt mit Sonntag
# 00-23 Volle Stunde
# 00-23 Volle Stunde
# 00 oder 15 oder 30 oder 45 Minute
# 00 oder 15 oder 30 oder 45 Minute
# PID-Name
# PID-Name
# Dummy-Name
# Dummy-Name
# gewünschte Temp. in vollen Graden
# gewünschte Temp. in vollen Graden
###########################################
###########################################
# Es folgen die Zeiten (Zeitraum zB. Urlaub) in denen nur Minimum (17 Grad) gefahren wird
# Es folgen die Zeiten (Zeitraum zB. Urlaub) in denen nur Minimum (17 Grad) gefahren wird
# Bitte bei Minute immer 00 15 30 oder 45 eingeben
# Bitte bei Minute immer 00 15 30 oder 45 eingeben
# BEACHTE: 24 Stunden vor Ablauf der Endzeit wird auf normalen Wochenschaltbetrieb zurückgeschaltet
# BEACHTE: 24 Stunden vor Ablauf der Endzeit wird auf normalen Wochenschaltbetrieb zurückgeschaltet
# MINIMUM als Wort
# MINIMUM als Wort
# 01.01.2012 12:30 als Begin des Minimum
# 01.01.2012 12:30 als Begin des Minimum
# 12.01.2012 12:00 als Ende des Minimum
# 12.01.2012 12:00 als Ende des Minimum
MINIMUM 14.11.2012 16:13 15.11.2012 12:00
MINIMUM 14.11.2012 16:13 15.11.2012 12:00
#### Wochenschaltzeiten####################
#### Wochenschaltzeiten####################
  # Sonntag
  # Sonntag
  0 08 00 heizung.02 Heizkörper_1_desired_temp 20  
  0 08 00 heizung.02 Heizkörper_1_desired_temp 20  
Zeile 279: Zeile 257:
  1 06 00 heizung.01 Heizkörper_2_desired_temp 20
  1 06 00 heizung.01 Heizkörper_2_desired_temp 20
  1 21 00 heizung.01 Heizkörper_2_desired_temp 17
  1 21 00 heizung.01 Heizkörper_2_desired_temp 17
  ############################################</nowiki>
  ############################################
und so weiter ...hier können natürlich auch mehr Schaltvorgänge definiert werden.
 
und so weiter. Hier können natürlich auch mehr Schaltvorgänge definiert werden.


Einmal in /fhem/FHEM/ angelegt, taucht diese dann im Webinterface unter  
Einmal in /fhem/FHEM/ angelegt, taucht diese dann im Webinterface unter  


  <nowiki>"Edit Files"
  "Edit Files"
  "Own modules and helper files"</nowiki>
  "Own modules and helper files"
 
auf und kann ab dann auch dort bearbeitet werden.
auf und kann ab dann auch dort bearbeitet werden.


Jetzt noch folgendes in die  '''99_myUtils.pm'''eintragen.
Jetzt noch folgendes in die  '''99_myUtils.pm''' eintragen:
:<code>use Time::Local;</code>
Danach wird die Subroutine eingetragen:


Ganz oben habe ich folgendes eingefügt:
<syntaxhighlight lang="Perl">
sub
sucheSchaltzeit() {
sleep 10;  # Timingproblem loesen; siehe Forenbeitrag 64175
## Ermittle aktuelle Rechnerzeit /datum/ zeit/ tag etc. ######################
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat,
  $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $jetztzeit = time();
my @Zeilen = ("");
# my @zeilen_werte = ("");
# öffne Steuerdatei nur zum Lesen
open(HEIZDAT,'<','/usr/share/fhem/FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
while(<HEIZDAT>)
{
  push(@Zeilen,$_);
}
close(HEIZDAT);
## entferne alle \n-Zeichen
chomp (@Zeilen);
for(@Zeilen)
{
  # in $_ steht die aktuelle Zeile und die wird per Leerzeichen aufgedröselt
  my @zeilen_werte = split(/ /,$_);
  ### Abfrage ob es eine Kommentarzeile ist - Kennzeichen ein #
  if (($zeilen_werte[0]) ne "#"){
      #Abfrage ob Urlaubszeit (Minimum)
      if (($zeilen_werte[0]) eq "MINIMUM"){
        ### Minimumzeitraum berechnen
        my $sekunde_tmp = "0";
        my @array_datumsplit = split(/\./, $zeilen_werte[1]);
        my @array_zeitsplit = split(/:/, $zeilen_werte[2]);       
        my $minimum_begin =  timelocal($sekunde_tmp,$array_zeitsplit[1],$array_zeitsplit[0],$array_datumsplit[0],$array_datumsplit[1]-1,$array_datumsplit[2]-1900);
        my @array_datumsplit2 = split(/\./, $zeilen_werte[3]);
        my @array_zeitsplit2 = split(/:/, $zeilen_werte[4]);       
        ### Endzeit = eingetragen Endzeit - 1 Tag
        my $minimum_ende = timelocal($sekunde_tmp,$array_zeitsplit2[1],$array_zeitsplit2[0],$array_datumsplit2[0],$array_datumsplit2[1]-1,$array_datumsplit2[2]-1900) - 86400;
        if (($jetztzeit > $minimum_begin ) && ( $jetztzeit < $minimum_ende)) {
                  Log 3, "Habe Urlaub Heizung auf 17 Grad Minimum Jetzt: $jetztzeit Start:$minimum_begin Ende:$minimum_ende";
                  fhem "set AZ_desired_temp 17";;
                  fhem "set Keller_desired_temp 17";;
        }
        } else {
        ### Abfrage ob heute entsprechender Tag
        if ($zeilen_werte[0] == $Wochentag){
        ## abprüfen ob Stunde erreicht
        if ($zeilen_werte[1] == $Stunde){
          ## abprüfen ob Minute erreicht
          if ($zeilen_werte[2] == $Minute){
            #### Jetzt Name des Antriebs und Dummys und Zieltemp einlesen sowie Befehle absetzen
            #fhem "set " . $zeilen_werte[3] . " desired " . $zeilen_werte[5];;
            fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5];;
            Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
        }}}
    } # Endif Minimum
  } # Endif # Kommentar
} # EndeFor
}
################### Ende SUB sucheSchaltzeit
</syntaxhighlight>


<nowiki>use Time::Local;</nowiki>
Danach wird die Subroutine eingetragen
<nowiki>sub
sucheSchaltzeit() {
## Ermittle aktuelle Rechnerzeit /datum/ zeit/ tag etc. ######################
my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat,
  $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
my $jetztzeit = time();
my @Zeilen = ("");
# my @zeilen_werte = ("");
# öffne Steuerdatei nur zum Lesen
open(HEIZDAT,'&lt;','/usr/share/fhem/FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
while(&lt;HEIZDAT&gt;)
{
push(@Zeilen,$_);
}
close(HEIZDAT);
## entferne alle \n-Zeichen
chomp (@Zeilen);
for(@Zeilen)
{
  # in $_ steht die aktuelle Zeile und die wird per Leerzeichen aufgedröselt
  my @zeilen_werte = split(/ /,$_);
  ### Abfrage ob es eine Kommentarzeile ist - Kennzeichen ein #
  if (($zeilen_werte[0]) ne "#"){
    #Abfrage ob Urlaubszeit (Minimum)
    if (($zeilen_werte[0]) eq "MINIMUM"){
      ### Minimumzeitraum berechnen
      my $sekunde_tmp = "0";
      my @array_datumsplit = split(/\./, $zeilen_werte[1]);
      my @array_zeitsplit = split(/:/, $zeilen_werte[2]);       
      my $minimum_begin = timelocal($sekunde_tmp,$array_zeitsplit[1],$array_zeitsplit[0],$array_datumsplit[0],$array_datumsplit[1]-1,$array_datumsplit[2]-1900);
      my @array_datumsplit2 = split(/\./, $zeilen_werte[3]);
      my @array_zeitsplit2 = split(/:/, $zeilen_werte[4]);       
      ### Endzeit = eingetragen Endzeit - 1 Tag
      my $minimum_ende = timelocal($sekunde_tmp,$array_zeitsplit2[1],$array_zeitsplit2[0],$array_datumsplit2[0],$array_datumsplit2[1]-1,$array_datumsplit2[2]-1900) - 86400;
      if (($jetztzeit &gt; $minimum_begin ) &amp;&amp; ( $jetztzeit &lt; $minimum_ende)) {
                  Log 3, "Habe Urlaub Heizung auf 17 Grad Minimum Jetzt: $jetztzeit Start:$minimum_begin Ende:$minimum_ende";
                  fhem "set AZ_desired_temp 17"&#160;;
                  fhem "set Keller_desired_temp 17"&#160;;
      }
      } else {
      ### Abfrage ob heute entsprechender Tag
      if ($zeilen_werte[0] == $Wochentag){
        ## abprüfen ob Stunde erreicht
        if ($zeilen_werte[1] == $Stunde){
        ## abprüfen ob Minute erreicht
        if ($zeilen_werte[2] == $Minute){
            #### Jetzt Name des Antriebs und Dummys und Zieltemp einlesen sowie Befehle absetzen
            #fhem "set " . $zeilen_werte[3] . " desired " . $zeilen_werte[5]&#160;;
            fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5]&#160;;
            Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
      }}}
    } # Endif Minimum
  } # Endif # Kommentar
} # EndeFor
}
################### Ende SUB sucheSchaltzeit</nowiki>
FHEM neu starten und...Fertig.
FHEM neu starten und...Fertig.


= Tips und Tricks =
== Tips und Tricks ==
1. In einem Raum befinden sich mehrere Heizkörper --&gt; R.König sagt:
1. In einem Raum befinden sich mehrere Heizkörper --&gt; R.König sagt:
 
:''Man kann mit dem PID zwar nur ein FHT8v steuern, aber ein FHT8v-Id kann man mehreren Geraeten zuweisen. Diese werden dann immer identisch eingestellt.
<nowiki>Man kann mit dem PID zwar nur ein FHT8v steuern, aber ein FHT8v-Id kann man
  mehreren Geraeten zuweisen. Diese werden dann immer identisch eingestellt.</nowiki>


[[Kategorie:Code Snippets]]
[[Kategorie:Code Snippets]]

Aktuelle Version vom 26. Juli 2017, 19:57 Uhr

Die Heizungs-Stellantriebe FHT8v können mit einem CUL direkt angesprochen werden. Eine sinnvolle Ergänzung dazu stellen die Temperatur und Feuchtemesser S300TH dar. Mit dieser Kombination ist es möglich die Stellantriebe temperaturabhängig zu steuern.

Kurzanleitung

Die FHT8v mittels Webfrontend in FHEM integrieren (die Beispiele zeigen einen CUL der als CUL_0 in der fhem.cfg definiert wurde). Folgenden Code in die fhem.cfg eintragen:

define stellantrieb.01 FHT8V 1234
attr stellantrieb.01 room Heizungen

Vorbereitung des FHT8V:

  1. Batterien in den Stellantrieb einlegen und warten bis "A2" im Display erscheint
  2. Antrieb an den Heizkörper anschrauben.
  3. einmal kurz drücken und der Antrieb fährt zu und wieder auf
  4. danach zeigt er "A3".
  5. Am Stellantrieb den Knopf solange drücken bis 3 Pieptöne ertönen
  6. Im Web-Frontend auf [Heizungen] gehen dann auf [Stellantrieb.01] und auf den Knopf [SET] stellantrieb.01 pair drücken.

Wenn alles geklappt hat ertönt ein Piepton am Antrieb. Weiter geht es im Abschnitt: Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan

Der lange Weg mit Erklärung

Die FHT8V mittels FHEM- Kommandozeile integrieren.

Hier gibt es 2 Wege, das, was in der Kurzanleitung beschrieben wurde "per Hand" umzusetzen.

1. Mit den FHEM-Befehlen für das Device "FHT8V" Das definieren des Stellantriebs in der fhem.cfg erfolgt wie oben beschrieben. (define <name> FHT <housecode> [IODev] )

Hier eine Übersicht der FHT-spezifischen Befehle:

set <name> pair ; zB. set stellantrieb.01 pair (pairen des Antriebes mit dem Namen stellantrieb.01)

set <name> valve <value;> zB. set stellantrieb.01 valve 90 (Stellantrieb auf 90 % setzen) get <name> valve zB. get stellantrieb.01 valve (Hole das letzte Stell-Kommando aus dem SendePuffer) Hier der Link zur Command-Ref : [1]

2. Mit den RAW-Befehlen

Vorbereitung wie oben in der Kurzanleitung.

Der Befehl pairt FHEM mit dem Stellantrieb.

set CUL_0 raw T1234012f00

Aufgesplittet:

set CUL_0 raw --> sendet über CUL_0
     T1234    --> Stellantriebe Raum1
         01   --> Der erste Stellantrieb des og. Raumes
          2f  --> Pairen
           00 --> gehört zum Pairbefehl

Der Befehl setzt die Stellposition.

set CUL_0 raw T1234012600

Aufgesplittet:

set CUL_0 raw --> sendet über CUL_0
     T1234    --> Stellantriebe Raum1
         01   --> Der erste Stellantrieb des og. Raumes
          26  --> Stellantrieb bewegen
           00 --> Wieviel Prozent der Öffung des Stellantriebes (Beachte in HEXADEZIMAL !)
           00 = 0 % Öffnung (Kalt)
           19 = 10 %
           33 = 20 %
           4c = 30 %
           ...
           ff = 100 % (Heiss)
           Berechnung : SollProzent * 255 / 100 = Wert
           og.Wert von Dezimal in Hexadezial umrechnen ergibt die beiden letzten Zahlen

Mehrere Räume

Wird zB. die FHT-ID 1234 gewählt, so kann diese für den ersten Raum genutzt werden. Der zweite Raum bekommt die FHT-ID 1334, der dritte 1434 usw. Es wir also das erste Byte um je eins erhöht.

Beispiele:

Die Kennung des 1. Raumes war 1234

Ein 2. Raum kann mit 1334

Ein 3. Raum kann mit 1434

definiert werden.

Der 1. Stellantrieb des 2. Raumes wird mit:

set CUL_0 raw T1334012f00 [Enter]

Der 1. Stellantrieb des 3. Raumes wird mit:

set CUL_0 raw T1434012f00 [Enter]

gepairt.

Entsprechend werden auch die Stellantriebe mit:

2. Raum set CUL_0 raw T1334012600 [Enter]

3. Raum set CUL_0 raw T1434012600 [Enter]

bewegt.


Mehrere Stellantriebe pro Raum

(wurde noch ńicht getestet)

Beispiele:

Die Kennung des 1. Raumes war 1234 es folgt die Kennung im Raum

01 (erster Antrieb im Raum 1234)
02 (2. Antrieb im Raum 1234) 
00 (es werden alle Antriebe im Raum 1234 angesprochen)
26 (zB.Antrieb stellen)
ff (zB.Antrieb 100% aufmachen)

Kommando Struktur und bekannte Befehle

set CUL_0 raw THHHHDDCCVV

T
FHT Protokoll (statisch T)
HHHH
Hauscode in Hex
DD
Gerätenummer in Hex (bis zu 8 pro Raum)
CC
Befehl
VV
Wert


Bekannte Befehle:

2f Pair Verbindung mit FHEM herstellen 
26 öffne den Stellantrieb in VV % (8bits of Hex) Berechnung siehe oben 

set CUL_0 raw T11 Puffer für alle FHT8V-Geräte abfragen

set CUL_0 raw T10 Puffer für alle FHT8V-Geräte löschen

Beispiel Befehle

set CUL_0 raw T1234012600   -> Raum 1234, Stellantrieb1, 0 % (kalt)

set CUL_0 raw T1234012685   -> Stellantrieb 52 %

set CUL_0 raw T12340126FF   -> Stellantrieb 100 % (heiss)

Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan

PID ist ein Helper-Modul von FHEM. Es steht standardmäßig zur Verfügung und steuert die Verbindung zwischen den Temperaturfühlern S300TH und dem Stellantrieb FHT8V.

Voraussetzung für die Nutzung von PID ist ein Temperaturfühler S300TH mit Namen "CUL_WS_1" sowie ein gepairter Stellantrieb FHT8V im Raum "1234".

Ein Floorplan names "fp_grundriss" sollte eingebunden sein.

Folgender Code ist in die fhem.cfg einzutragen:

define stellantrieb.01 FHT8V 1234
attr stellantrieb.01 room Heizungen
##
define heizung.01 PID CUL_WS_1 stellantrieb.01
attr heizung.01 alias Heizung_1
attr heizung.01 room Heizungen

Damit wird im Raum "Heizungen" ein FHT8v namens "Stellantrieb.01" und ein PID names "Heizung_1" dargestellt und kann dort auch bedient werden.

Um das Ganze noch etwas komfortabler zu gestalten, wird noch folgender Code in der fhem.cfg ergänzt:

define Heizkörper_1_desired_temp dummy
# die Position 300,210 ist natürlich zu ändern
attr Heizkörper_1_desired_temp fp_Grundriss 300,210,2,Wunschtemperatur
attr Heizkörper_1_desired_temp room Heizungen
attr Heizkörper_1_desired_temp setList state:17,18,19,20,21,21.5,22
attr Heizkörper_1_desired_temp webCmd state
### Der Notivy steuert das Zusammenspiel Änderung im Floorplan und Weitergabe an FHEM
define Change_heizung.01 notify Heizkörper_1_desired_temp {\
  my $neuer_wert = ReadingsVal("Heizkörper_1_desired_temp","state","0") ;;\
  fhem("set heizung.01 desired $neuer_wert");;\
}

Damit wird im Floorplan ein Dropdown dargestellt, mit welchem die Temperatur des Stellantriebs.01 geregelt werden kann (bitte Geduld. Zwischen Änderung im Floorplan und Umsetzung am Stellantrieb kann eine Weile vergehen).

Beispiel für einen zentralen Heizungsschalter

Voraussetzung ist ein Floorplan und die oben beschriebene Einbindung der FHT8+S300TH Kombination.

Die Schaltbilder auf dem Floorplan haben den Namen "Heizung_minimal.on.png" sowie "Heizung_minimal.off.png".

Die Bilder unter "fhem/www/pgm2" speichern.

Das Umschalten der Bilder geschieht automatisch mit diesem Attribut.

attr Heizung_minimal fp_image Heizung_minimal.{state}.png

Es folgen die Eintragungen im config file "fhem.cfg"

define Heizung_minimal dummy
attr Heizung_minimal fp_Grundriss 450,95,1,Heizung minimal
attr Heizung_minimal fp_image Heizung_minimal.{state}.png
attr Heizung_minimal room Heizungen
attr Heizung_minimal setList on off
#

Es folgen die entsprechende NOTIFY-Einträge.

Einmal werden die beiden unten genannten Heizkörper auf 17 Grad gebracht und zurück wieder auf 20 Grad.

define Heizung_MIN notify Heizung_minimal:on {\
   # jetzt werden die PIDs angwiesen mit den Stellantrieben 17 Grad zu erreichen
   fhem("set heizung.01 desired 17");;\
   # Die Dummys zur Darstellung der Wunschtemp. werden auch aktulisiert
   fhem("set Heizkörper_1_desired_temp 17");;\
   # analog zum ersten Heizkörper
   fhem("set heizung.02 desired 17");;\
   fhem("set Heizkörper_2_desired_temp 17");;\
    Log 3, "Heizung auf 17 Grad";;\
}
  define Heizung_MAX notify Heizung_minimal:off {\
   fhem("set heizung.01 desired 20");;\
   fhem("set Heizkörper_1_desired_temp 20");;\
   fhem("set heizung.02 desired 20");;\
   fhem("set Heizkörper_2_desired_temp 20");;\
   Log 3, "Heizung auf 20 Grad";;\
}

Einen Heiz-Zeitplan erstellen (mit Urlaubsfunktion)

Dazu läuft ein AT und dieser schaut immer um 00, 15, 30, 45 einer jeden Stunde in der Steuerdatei nach, ob etwas zu verändern ist.

In die fhem.cfg einfügen:

# Frage jede 1/4 Stunde Heizzeiten.cfg ab
define Heizschalter_alle_15_minuten at +*00:15:00 {sucheSchaltzeit()}
attr Heizschalter_alle_15_minuten alignTime 00:00:00

als nächstes die Datei /usr/share/fhem/FHEM/Heizzeiten.cfg anlegen und befüllen:

###########################################
##### Hier werden die Heizzeiten definiert
# 0-6 Wochentag beginnt mit Sonntag
# 00-23 Volle Stunde
# 00 oder 15 oder 30 oder 45 Minute
# PID-Name
# Dummy-Name
# gewünschte Temp. in vollen Graden
###########################################
# Es folgen die Zeiten (Zeitraum zB. Urlaub) in denen nur Minimum (17 Grad) gefahren wird
# Bitte bei Minute immer 00 15 30 oder 45 eingeben
# BEACHTE: 24 Stunden vor Ablauf der Endzeit wird auf normalen Wochenschaltbetrieb zurückgeschaltet
# MINIMUM als Wort
# 01.01.2012 12:30 als Begin des Minimum
# 12.01.2012 12:00 als Ende des Minimum
MINIMUM 14.11.2012 16:13 15.11.2012 12:00
#### Wochenschaltzeiten####################
# Sonntag
0 08 00 heizung.02 Heizkörper_1_desired_temp 20 
0 21 00 heizung.02 Heizkörper_1_desired_temp 17
#
0 08 00 heizung.01 Heizkörper_2_desired_temp 20
0 21 00 heizung.01 Heizkörper_2_desired_temp 17
############################################
# Montag
1 14 00 heizung.02 Heizkörper_1_desired_temp 20
1 21 00 heizung.02 Heizkörper_1_desired_temp 17 
#
1 06 00 heizung.01 Heizkörper_2_desired_temp 20
1 21 00 heizung.01 Heizkörper_2_desired_temp 17
############################################

und so weiter. Hier können natürlich auch mehr Schaltvorgänge definiert werden.

Einmal in /fhem/FHEM/ angelegt, taucht diese dann im Webinterface unter

"Edit Files"
"Own modules and helper files"

auf und kann ab dann auch dort bearbeitet werden.

Jetzt noch folgendes in die 99_myUtils.pm eintragen:

use Time::Local;

Danach wird die Subroutine eingetragen:

 sub
 sucheSchaltzeit() {
 sleep 10;  # Timingproblem loesen; siehe Forenbeitrag 64175 
 ## Ermittle aktuelle Rechnerzeit /datum/ zeit/ tag etc. ######################
 my ($Sekunde, $Minute, $Stunde, $Monatstag, $Monat,
   $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
 my $jetztzeit = time();
 my @Zeilen = ("");
 # my @zeilen_werte = ("");
 # öffne Steuerdatei nur zum Lesen
 open(HEIZDAT,'<','/usr/share/fhem/FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
 while(<HEIZDAT>)
 {
  push(@Zeilen,$_);
 }
 close(HEIZDAT);
 ## entferne alle \n-Zeichen
 chomp (@Zeilen);
 for(@Zeilen)
 {
   # in $_ steht die aktuelle Zeile und die wird per Leerzeichen aufgedröselt 
   my @zeilen_werte = split(/ /,$_);
   ### Abfrage ob es eine Kommentarzeile ist - Kennzeichen ein #
   if (($zeilen_werte[0]) ne "#"){
      #Abfrage ob Urlaubszeit (Minimum)
      if (($zeilen_werte[0]) eq "MINIMUM"){
        ### Minimumzeitraum berechnen
        my $sekunde_tmp = "0";
        my @array_datumsplit = split(/\./, $zeilen_werte[1]);
        my @array_zeitsplit = split(/:/, $zeilen_werte[2]);        
        my $minimum_begin =  timelocal($sekunde_tmp,$array_zeitsplit[1],$array_zeitsplit[0],$array_datumsplit[0],$array_datumsplit[1]-1,$array_datumsplit[2]-1900);
        my @array_datumsplit2 = split(/\./, $zeilen_werte[3]);
        my @array_zeitsplit2 = split(/:/, $zeilen_werte[4]);        
        ### Endzeit = eingetragen Endzeit - 1 Tag 
        my $minimum_ende = timelocal($sekunde_tmp,$array_zeitsplit2[1],$array_zeitsplit2[0],$array_datumsplit2[0],$array_datumsplit2[1]-1,$array_datumsplit2[2]-1900) - 86400;
        if (($jetztzeit > $minimum_begin ) && ( $jetztzeit < $minimum_ende)) {
                   Log 3, "Habe Urlaub Heizung auf 17 Grad Minimum Jetzt: $jetztzeit Start:$minimum_begin Ende:$minimum_ende";
                   fhem "set AZ_desired_temp 17";;
                   fhem "set Keller_desired_temp 17";;
        } 
        } else {
        ### Abfrage ob heute entsprechender Tag 
        if ($zeilen_werte[0] == $Wochentag){
         ## abprüfen ob Stunde erreicht
         if ($zeilen_werte[1] == $Stunde){
          ## abprüfen ob Minute erreicht
          if ($zeilen_werte[2] == $Minute){
             #### Jetzt Name des Antriebs und Dummys und Zieltemp einlesen sowie Befehle absetzen
             #fhem "set " . $zeilen_werte[3] . " desired " . $zeilen_werte[5];;
             fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5];;
             Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
        }}}
     } # Endif Minimum
   } # Endif # Kommentar
 } # EndeFor
 }
 ################### Ende SUB sucheSchaltzeit

FHEM neu starten und...Fertig.

Tips und Tricks

1. In einem Raum befinden sich mehrere Heizkörper --> R.König sagt:

Man kann mit dem PID zwar nur ein FHT8v steuern, aber ein FHT8v-Id kann man mehreren Geraeten zuweisen. Diese werden dann immer identisch eingestellt.