FHT 8v direkt ansprechen: Unterschied zwischen den Versionen

Aus FHEMWiki
K (Ergänzung lt. Forenthread #64175)
(Anpassung von <source>-Tags nach <syntaxhighlight>)
 
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 26: 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 &lt;name&gt; FHT &lt;housecode&gt; [IODev] )
Das definieren des Stellantriebs in der fhem.cfg erfolgt wie oben beschrieben. (define <name> FHT <housecode> [IODev] )


Hier eine Übersicht der FHT-spezifischen Befehle:
Hier eine Übersicht der FHT-spezifischen Befehle:
Zeile 143: Zeile 143:


== Temperaturabhängige Steuerung per PID und grafische Darstellung im Floorplan ==
== 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.
[[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.


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".
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".
Zeile 272: Zeile 272:
Danach wird die Subroutine eingetragen:
Danach wird die Subroutine eingetragen:


<source lang="Perl">
<syntaxhighlight lang="Perl">
  sub
  sub
  sucheSchaltzeit() {
  sucheSchaltzeit() {
Zeile 283: Zeile 283:
  # my @zeilen_werte = ("");
  # my @zeilen_werte = ("");
  # öffne Steuerdatei nur zum Lesen
  # öffne Steuerdatei nur zum Lesen
  open(HEIZDAT,'&lt;','/usr/share/fhem/FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
  open(HEIZDAT,'<','/usr/share/fhem/FHEM/Heizzeiten.cfg') || die "Datei mit Heizzeiten nicht gefunden";
  while(&lt;HEIZDAT&gt;)
  while(<HEIZDAT>)
  {
  {
   push(@Zeilen,$_);
   push(@Zeilen,$_);
Zeile 308: Zeile 308:
         ### Endzeit = eingetragen Endzeit - 1 Tag  
         ### 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;
         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)) {
         if (($jetztzeit > $minimum_begin ) && ( $jetztzeit < $minimum_ende)) {
                   Log 3, "Habe Urlaub Heizung auf 17 Grad Minimum Jetzt: $jetztzeit Start:$minimum_begin Ende:$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 AZ_desired_temp 17";;
                   fhem "set Keller_desired_temp 17"&#160;;
                   fhem "set Keller_desired_temp 17";;
         }  
         }  
         } else {
         } else {
Zeile 321: Zeile 321:
           if ($zeilen_werte[2] == $Minute){
           if ($zeilen_werte[2] == $Minute){
             #### Jetzt Name des Antriebs und Dummys und Zieltemp einlesen sowie Befehle absetzen
             #### 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[3] . " desired " . $zeilen_werte[5];;
             fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5]&#160;;
             fhem "set " . $zeilen_werte[4] . " " . $zeilen_werte[5];;
             Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
             Log 3, "$zeilen_werte[3] geaendert auf $zeilen_werte[5]";
         }}}
         }}}
Zeile 330: Zeile 330:
  }
  }
  ################### Ende SUB sucheSchaltzeit
  ################### Ende SUB sucheSchaltzeit
</source>
</syntaxhighlight>


Fhem neu starten und...Fertig.
FHEM neu starten und...Fertig.


== Tips und Tricks ==
== Tips und Tricks ==

Aktuelle Version vom 26. Juli 2017, 18: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.