FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: nesges am 27 Dezember 2014, 01:50:33

Titel: Konfigurations-Templates
Beitrag von: nesges am 27 Dezember 2014, 01:50:33
Hallo,

gibt es Konfigurations-Templates für die fhem.cfg?

Die Konfiguration für "einen Heizkörper" sieht bei mir immer gleich aus: Ein MAX-Device, mehrere Dummys für Schaltzustände und Floorplan-Gimmicks, ein FileLog, ein SVG, verschiedene Notifies. Diese Gruppen unterscheiden sich prinzipiell nur durch MAX-Adresse, Device-Namen und Position auf dem Floorplan. Schön wäre eine Möglichkeit ein Template anzulegen, das man mit abweichenden Werten in die fhem.cfg aufnimmt, ohne jedes mal c&p der vollen Konfiguration. Gibt es dafür eine Lösung?

Aktuell nutze ich dafür einen großen eval-Block. Das funktioniert soweit, hat allerdings kleinere Macken (keine Kommentare, Escape-Hölle..) und ich bin nicht sicher, ob ich damit nicht Gefahr laufe, später Probleme zu bekommen. Wenn's interessiert, so sieht der Block aus:

{ sub template_heizkoerper($$$$$$) {                                                                                                                \\
    my $addr = shift;;                                                                                                                              \\
    my $name = shift;;                                                                                                                              \\
    my $alias = shift;;                                                                                                                             \\
    my $fp_y = shift;;                                                                                                                              \\
    my $fp_x = shift;;                                                                                                                              \\
    my $room = shift;;                                                                                                                              \\
                                                                                                                                                    \\
    fhem("define $name MAX HeatingThermostatPlus $addr");;                                                                                          \\
    fhem("attr $name userattr ALL_HEIZUNG ALL_HEIZUNG_map structexclude");;                                                                         \\
    fhem("attr $name ALL_HEIZUNG ALL_HEIZUNG");;                                                                                                    \\
    fhem("attr $name IODev CULM");;                                                                                                                 \\
    fhem("attr $name alias $alias");;                                                                                                               \\
    fhem("attr $name fp_Wohnung $fp_y,$fp_x,2,");;                                                                                                  \\
    fhem("attr $name icon sani_heating");;                                                                                                          \\
    fhem("attr $name room 10 Heizung,$room");;                                                                                                      \\
    fhem("attr $name group $alias");;                                                                                                               \\
                                                                                                                                                    \\
    fhem("define $name"."_FHEMSETTING dummy");;                                                                                                     \\ 
    fhem("attr $name"."_FHEMSETTING room hidden");;                                                                                                 \\ 
                                                                                                                                                    \\ 
    fhem("define $name"."_FHEMSETTING_CHECK notify $name:desiredTemperature:.* { heizungCheckManualOverride('$name') }");;                          \\
    fhem("attr $name"."_FHEMSETTING_CHECK room hidden");;                                                                                           \\
                                                                                                                                                    \\
    fhem("define $name"."_OVERRIDE dummy");;                                                                                                        \\
    fhem("attr $name"."_OVERRIDE alias $alias manuell");;                                                                                           \\
    fhem("attr $name"."_OVERRIDE devStateIcon 1:sani_heating_automatic\@orange:0 0:sani_heating_timer\@green:1");;                                  \\
    fhem("attr $name"."_OVERRIDE fp_Wohnung ".($fp_y+31).",".($fp_x-55).",0,");;                                                                    \\
    fhem("attr $name"."_OVERRIDE room 10 Heizung,00 Optionen");;                                                                                    \\
    fhem("attr $name"."_OVERRIDE webCmd 1:0");;                                                                                                     \\
    fhem("attr $name"."_OVERRIDE group $alias");;                                                                                                   \\
                                                                                                                                                    \\
    fhem("define $name"."_OVERRIDE_Reset_1 notify $name"."_OVERRIDE:1 define $name"."_OVERRIDE_Reset_Timer at +03:00:00 set $name"."_OVERRIDE 0");; \\
    fhem("define $name"."_OVERRIDE_Reset_0 notify $name"."_OVERRIDE:0 { fhem('delete $name"."_OVERRIDE_Reset_Timer');;;;heizung(1);;;; }");;        \\
                                                                                                                                                    \\
    fhem("define $name"."_BatteryLED dummy");;                                                                                                      \\
    fhem("attr $name"."_BatteryLED alias $alias Batterie");;                                                                                        \\
    fhem("attr $name"."_BatteryLED devStateIcon low:measure_battery_50\@red ok:measure_battery_100\@green");;                                       \\
    fhem("attr $name"."_BatteryLED fp_Wohnung ".($fp_y+47).",".($fp_x-29).",0,");;                                                                  \\
    fhem("attr $name"."_BatteryLED room hidden");;                                                                                                  \\
    fhem("attr $name"."_BatteryLED group $alias");;                                                                                                 \\
                                                                                                                                                    \\
    fhem("define $name"."_BatteryNotify notify $name:battery.* { fhem('set $name"."_BatteryLED '.(\$EVENT=~/ok\$/?'ok':'low')) }");;                \\
    fhem("attr $name"."_BatteryNotify room hidden");;                                                                                               \\
                                                                                                                                                    \\
    fhem("define FileLog_$name FileLog ./log/$name-%Y.log $name");;                                                                                 \\
    fhem("attr FileLog_$name logtype text");;                                                                                                       \\
    fhem("attr FileLog_$name room Logfile");;                                                                                                       \\
                                                                                                                                                    \\
    fhem("define SVG_FileLog_$name"."_1 SVG FileLog_$name:SVG_FileLog_$name"."_1:CURRENT");;                                                        \\
    fhem("attr SVG_FileLog_$name"."_1 fp_$name"."_LOGVIEW 40,10,0,");;                                                                              \\
    fhem("attr SVG_FileLog_$name"."_1 plotsize 1400,300");;                                                                                         \\
    fhem("attr SVG_FileLog_$name"."_1 room hidden");;                                                                                               \\
                                                                                                                                                    \\
    fhem("define $name"."_LOGVIEW FLOORPLAN");;                                                                                                     \\
    fhem("attr $name"."_LOGVIEW alias $alias Temperatur-Plot");;                                                                                    \\
    fhem("attr $name"."_LOGVIEW fp_backgroundimg  ;;;");;                                                                                      \\
    fhem("attr $name"."_LOGVIEW fp_noMenu 1");;                                                                                                     \\
    fhem("attr $name"."_LOGVIEW room hidden");;                                                                                                     \\
    fhem("attr $name"."_LOGVIEW stylesheet empty.css");;                                                                                            \\
                                                                                                                                                    \\
    fhem("define $name"."_LOGVIEW_Backlink weblink htmlCode <a href='/fhem/floorplan/'>[zum Floorplan]</a>");;                                      \\
    fhem("attr $name"."_LOGVIEW_Backlink fp_$name"."_LOGVIEW 10,10,0,");;                                                                           \\
    fhem("attr $name"."_LOGVIEW_Backlink room hidden");;                                                                                            \\
                                                                                                                                                    \\
    fhem("define btn$name"."_LOGVIEW weblink htmlCode { jquery_dialog_small('$name"."_LOGVIEW') }");;                                               \\
    fhem("attr btn$name"."_LOGVIEW fp_Wohnung ".($fp_y+38).",".($fp_x+107).",0,");;                                                                 \\
    fhem("attr btn$name"."_LOGVIEW room hidden");;                                                                                                  \\
  }                                                                                                                                                 \\
  template_heizkoerper('123456', 'W_HEIZUNG_COUCH', 'Heizkoerper Couch', 717, 1085, '50 Wohnzimmer');;                                              \\
  template_heizkoerper('123457', 'W_HEIZUNG_FENSTER', 'Heizkoerper Fenster', 850, 880, '50 Wohnzimmer');;                                          \\
}
Titel: Antw:Konfigurations-Templates
Beitrag von: nesges am 26 Januar 2015, 14:27:05
Zitat von: nesges am 27 Dezember 2014, 01:50:33und ich bin nicht sicher, ob ich damit nicht Gefahr laufe, später Probleme zu bekommen

Als da wären:

Mit den beiden Punkten kann man umgehen, aber insbesondere der erste ist lästig. Daher bin ich mittlerweile wieder von der Idee abgerückt. Das nur als Info für Nachahmer.
Titel: Antw:Konfigurations-Templates
Beitrag von: SVLoneStar am 19 Februar 2015, 14:46:21
Hallo,
was macht denn bitte das
heizungCheckManualOverride('$name')
in Deinem obigen Template?

Danke,
Stefan
Titel: Antw:Konfigurations-Templates
Beitrag von: Wuppi68 am 19 Februar 2015, 16:23:21
wohnst Du in einem Schloss oder hast Du andere Gebäude mit vielen Zimmern und Thermostaten?

Einmal installiert und gut :-)
Titel: Antw:Konfigurations-Templates
Beitrag von: nesges am 19 Februar 2015, 19:07:42
Zitat von: SVLoneStar am 19 Februar 2015, 14:46:21
was macht denn bitte das
heizungCheckManualOverride('$name')
in Deinem obigen Template?

Die Funktion stellt fest, ob die Wunschtemperatur an einem Heizkörper manuell verändert worden ist.

Da ich in meinem Heizprogramm von Anwesenheiten abhängig bin, ist ein fixes Wochenprogramm in den Thermostaten nicht ideal. Das Wochenprogramm wird daher vollständig von fhem gesteuert. Dabei wird die Wunschtemperatur durch fhem ausschliesslich mit einer Funktion set_heizung() gesetzt, die sich die durch fhem gesetzte Temperatur (in einen Dummy $device_FHEMSETTING) merkt. heizungCheckManualOverride() wird bei $device:desiredTemperature:.* Events ausgelöst und vergleicht den gemerkten Wert mit  dem vom Thermostat gemeldeten Wert. Wenn die Werte ungleich sind, wird das Wochenprogramm für 3h ausgesetzt. Hier der (aufs Wesentliche reduzierte) Code:

sub set_heizung() {
    [...]
    if(Value('HEIZUNG_OVERRIDE') || Value($device.'_OVERRIDE')) {
        return 0;
    } else {
        my $desiredTemperature = $heizung_queue{$device};
        my $act = ReadingsVal($device, 'desiredTemperature', undef);

        if($act ne $desiredTemperature) {
            fhem("set ".$device."_FHEMSETTING $desiredTemperature");
            fhem("set $device desiredTemperature $desiredTemperature");
        }
    }
}

sub heizungCheckManualOverride($) {
    my $device = shift;
   
    my $act = ReadingsNum($device, 'desiredTemperature', undef) || ReadingsNum($device, 'state', undef);
    my $set = Value($device.'_FHEMSETTING');
    my $override = Value($device.'_OVERRIDE');
   
    if($override ne "1" && $act && $set && $set ne '???' && $act ne $set) {
        fhem('set '.$device.'_OVERRIDE 1');
    }
    return $override;
}


Ein notify auf $device_OVERRIDE:1 sorgt dann dafür, dass $device_OVERRIDE nach 3h zurück gesetzt wird.