HM-CC-RT-DN Reading Gruppe

Begonnen von TNT0068, 25 August 2014, 13:22:46

Vorheriges Thema - Nächstes Thema

rasti

Hallo,

ich habe nichts an den subs geändert (würde ich mich gar net trauen....)

In der 99_myUtils.pm stand aber das "1;"  nicht am Ende sondern vor der Routine.
Obs daran nun gelegen hat oder an sonst was - keine Ahnung.

Nun geht folgendes bzw. geht nicht

- ich kann zwischen Auto und Manuell umschalten
- ich kann eine Solltemperatur einstellen, im Auto und im Manuell-Modus,
  die Temperatur wird auch eingestellt, d.h. kommt am Thermostat an und wird
  dort und auch in FHEM angezeigt und die "valve position" ändert sich und wird auch angezeigt
   Also Teilerfolg sozusagen....
- was nicht geht ist das btnLock / Vorhängeschloss, da kommt die Fehlermeldung         
    : invalid value. use:off,on    ....wobei ich wie gesagt an der Routine nix geändert habe,
   dein Code steht 1:1 gecopied&gepasted  in der 99_myUtils.pm
- alle Felder der Zeiten und Tag/Nacht-Temperaturen der Dropdown-Liste sind jetzt leer.
   (gestern standen da noch die Zeiten drin....)
   ich kann dann zwar neue Zeiten auswählen und xmit drücken aber es wird nicht übernommen
- habe im log noch diverse "isn't numeric" Fehler gefunden

2015.09.14 21:24:51 1: PERL WARNING: Argument "04:15" isn't numeric in multiplication (*) at ./FHEM/10_CUL_HM.pm line 4308.
2015.09.14 21:24:51 1: PERL WARNING: Argument "04:15" isn't numeric in sprintf at ./FHEM/10_CUL_HM.pm line 4324.
2015.09.13 22:01:26 1: PERL WARNING: Argument "measured-temp" isn't numeric in sprintf at ./FHEM/33_readingsGroup.pm line 735.
2015.09.13 22:01:26 1: PERL WARNING: Argument "ValvePosition" isn't numeric in sprintf at ./FHEM/33_readingsGroup.pm line 735.


Soweit also der Stand.

Noch eine (vielleicht blöde) Frage, ich habe anscheinend ein allgemeines Verständnisproblem mit den Soll/Tag/Nachttemperaturen und Auto/Manuell Einstellung. Ich dachte bis vor kurzem, dass die im dropdown-
Menü gewählte  Solltemperatur dann genommen wird wenn das Thermostat im Manuell-Modus ist
und die  Tag/Nachttemperaturen eben nur im Automodus. Dem scheint aber nicht so zu sein, das Thermostat
übernimmt die Solltemperatur (desired Temp ?) auch im Automodus und steuert das Ventil entsprechend
an. Wie geht das nun oder ist das nun gedacht ?

Gruss

Ralf

igami

Zitat von: rasti am 14 September 2015, 21:38:10
In der 99_myUtils.pm stand aber das "1;"  nicht am Ende sondern vor der Routine.
Was genau das bewirkt weiß ich auch nicht, aber der Code soll von der 1; stehen, steht so im wiki ;)

Kannst du mal bitte einen Screenshot von deiner jetzigen readingsGroup hoch laden?

Zitat von: rasti am 14 September 2015, 21:38:10
Noch eine (vielleicht blöde) Frage, ich habe anscheinend ein allgemeines Verständnisproblem mit den Soll/Tag/Nachttemperaturen und Auto/Manuell Einstellung. Ich dachte bis vor kurzem, dass die im dropdown-
Menü gewählte  Solltemperatur dann genommen wird wenn das Thermostat im Manuell-Modus ist
und die  Tag/Nachttemperaturen eben nur im Automodus. Dem scheint aber nicht so zu sein, das Thermostat
übernimmt die Solltemperatur (desired Temp ?) auch im Automodus und steuert das Ventil entsprechend
an. Wie geht das nun oder ist das nun gedacht ?
Soll zeigt immer die Temperatur an die am Heikörper eingestellt ist und kann auch verändert werden, ist als ob man am thermostat selbst dreht, hat aber keinen Einfluss auf das Wochenprogramm.
Tag/Nacht sind vorgaben für das Wochenprogramm, wenn das Wochenprogramm übertragen wird, wird auch geprüft welcher Wert nun eigentlich eingestellt sein sollt. Bsp: deine Heizung steht um 16:34 Uhr auf 22.0 °C und du überträgst ein Programm Tags 07:00-21:00 Uhr mit 21.0 °C und Nacht mit 17.0 °C so ändert sich der desired Wert auf 21.0.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rasti

Hallo,

nochmal zur Soll/Tag/Nachttemperatur : Nach deiner Erklärung ist
das ja so wie ich es immer dachte, d.h. die im dropdown-Menü gewählte 
Solltemperatur sollte nur im  Manuell-Modus übernommen werden
und die  Tag/Nachttemperaturen nur im Auto-Modus.

Nun steht das Thermostat aber im Auto-Modus und der Sollwert
(der ja nur für Manuell relevant sein sollte) wird trotzdem übernommen.
Passend zum Screenshot steht auf der LCD des Thermostats nun
auch Auto und Off, obwohl ein Wochenprogramm hinterlegt ist.
Das verstehe ich nicht....

Anbei der Screenshot.  Wie du siehst sind fast alle Felder des Dropdownmenüs leer.

=> Klickt man auf Solltemperatur, dann kann man den Wert im Dropdownmenü
      auswählen, anschliessend wird der Befehl ausgeführt (cmd pending ....cmd done)
=> Klickt man auf das Dropdownmenü von Tag/Nachtemp oder die Zeiten kann man
     neue Werte auswählen aber es tut sich nichts (kein cmd pending ....cmd done es tut sich halt nix)
=> klickt man auf das Heizkörpersymbol kann man zwischen Manuell/Auto umschalten
=> Klick auf das Vorhängeschloss führt nur zu besagter Fehlermeldung
=> IST-Temperatur und Ventilposition wird m.E. korrekt angezeigt

Gruss
Ralf

igami

Solltemperatur wird aber immer übernommen, ist auch nur das desired Reading aus dem Clima Channel.

Dass bei Tag im Dropdown etwas angezeigt wird macht mich stutzig. Ehrlich gesagt weiß ich auch nicht mehr weiter, habe es nach dem Programmieren bei mir auch so eingefügt und alles lief. Vielleicht solltest du alle Devices die von der Sub automatisch angelegt wurden noch ein mal löschen und auch den Code in die myUtils neu kopieren und zwei mal {clean()} aufrufen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rasti

Zitat von: igami am 15 September 2015, 16:26:21
Vielleicht solltest du alle Devices die von der Sub automatisch angelegt wurden noch ein mal löschen und auch den Code in die myUtils neu kopieren und zwei mal {clean()} aufrufen.

Hallo Igami,

genau das habe ich nun gemacht.
- den ganzen vom Script angelegten Kram im fhem.cfg gelöscht
- den Code neu in die 99myutils.pm reinpkopiert+gespeichert
- fhem neu gestartet
- 2 mal {clean()} eingegeben, jeweils danach auf save config geklickt
- Alle Dropdownmenü-Zeiten und Temperaturen sind wieder da !
- aber ein Klick aufs Vorhängeschloss ergibt denselben Fehler im Log wie zuvor
2015.09.15 20:01:39 3: CUL_HM set HM_XX getConfig
2015.09.15 20:01:39 3:
        set HM_XX regSet btnLock on;
        set HM_XX getConfig;
         : invalid value. use:off,on


Im Eventmonitor finde ich 
2015-09-15 20:52:22 notify ntfy_rg HM_XX_Clima btnLock

Das manuelle Absetzen von Befehlen scheint zu funktionieren. Gebe ich ein

set HM_XX_Clima tempListSat 05:15 17.5 21:00 21.5 24:00 17.5 24:00 21.0 24:00 17.5

sehe ich das auch im Log. Und später im Eventmonitor
2015-09-15 20:40:43 CUL_HM HM_XX_Clima R_0_tempListSat: 05:15 17.5 21:00 21.5 24:00 17.5


Mache ich das über das vom Skript erzeugte Dropmenü, wird aber egal was darin einstelle, die folgende
Wochenliste rausgehauen:

2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListMon prep 04:15 17.0 06:30 21.0 15:15 17.0 06:30 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListTue prep 04:15 17.0 06:30 21.0 15:15 17.0 06:30 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListWed prep 04:15 17.0 06:30 21.0 15:15 17.0 06:30 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListThu prep 04:15 17.0 06:30 21.0 15:15 17.0 06:30 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListFri prep 04:15 17.0 06:30 21.0 15:15 17.0 06:30 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListSat prep 04:15 17.0 21:00 21.0 24:00 17.0 24:00 21.0 24:00 17.0
2015.09.15 20:42:30 3: CUL_HM set HM_XX_Clima tempListSun exec 04:15 17.0 21:00 21.0 24:00 17.0 24:00 21.0 24:00 17.0


Installiert habe ich dein Script aus Post #177 .
Also irgendwas stimmt da nicht. Entweder bei mir keine Ahnung wo oder evtl. doch in deinem Code....
Ich hab mal unten meine gesamte 99_myUtils.pm als Code eingefügt....


Gruss

Ralf



##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.



package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

  use Switch;

sub clean{
  generate_heating_control();
  inheritance();
}

sub generate_heating_control{
  my $default_hc = 'default_hc';
  if(!(defined($defs{$default_hc}))){
    my $timeDropDown = '00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,24:00';
    my $tempDropDown = '5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0';

    fhem("
      define $default_hc dummy;

      setreading $default_hc 8p1b 04:15;
      setreading $default_hc 8p1e 06:30;
      setreading $default_hc 8p2b 15:15;
      setreading $default_hc 8p2e 21:00;
      setreading $default_hc 6p1b 04:15;
      setreading $default_hc 6p1e 21:00;
      setreading $default_hc 6p2b 24:00;
      setreading $default_hc 6p2e 24:00;
      setreading $default_hc 0p1b 04:15;
      setreading $default_hc 0p1e 21:00;
      setreading $default_hc 0p2b 24:00;
      setreading $default_hc 0p2e 24:00;
      setreading $default_hc dayTemp 21.0;
      setreading $default_hc nightTemp 17.0;

      attr $default_hc userattr attributes devices lockMode model subType wildcard;
      attr $default_hc attributes userattr group readingList setList;
      attr $default_hc devices TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04;
      attr $default_hc group Heizkörper;
      attr $default_hc lockMode btnLock;
      attr $default_hc model heating-control;
      attr $default_hc readingList 8p1b 8p1e 8p2b 8p2e 6p1b 6p1e 6p2b 6p2e 0p1b 0p1e 0p2b 0p2e dayTemp nightTemp;
      attr $default_hc room default;
      attr $default_hc setList  0p1b:$timeDropDown 0p1e:$timeDropDown 0p2b:$timeDropDown 0p2e:$timeDropDown 6p1b:$timeDropDown 6p1e:$timeDropDown 6p2b:$timeDropDown 6p2e:$timeDropDown 8p1b:$timeDropDown 8p1e:$timeDropDown 8p2b:$timeDropDown 8p2e:$timeDropDown dayTemp:$tempDropDown nightTemp:$tempDropDown;
      attr $default_hc subType default;
      attr $default_hc widgetOverride lockMode:btnLock,globalBtnLock,modusBtnLock;
      attr $default_hc wildcard TYPE=dummy:FILTER=model=heating-control:FILTER=subType!=default;
      ",1);
  }else{
    my $devices = AttrVal('default_hc', 'devices', 'TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04');
    my $_8p1b = ReadingsVal($default_hc, '8p1b', '04:15');
    my $_8p1e = ReadingsVal($default_hc, '8p1e', '06:30');
    my $_8p2b = ReadingsVal($default_hc, '8p2b', '15:15');
    my $_8p2e = ReadingsVal($default_hc, '8p2e', '21:00');
    my $_6p1b = ReadingsVal($default_hc, '6p1b', '04:15');
    my $_6p1e = ReadingsVal($default_hc, '6p1e', '21:00');
    my $_6p2b = ReadingsVal($default_hc, '6p2b', '24:00');
    my $_6p2e = ReadingsVal($default_hc, '6p2e', '24:00');
    my $_0p1b = ReadingsVal($default_hc, '0p1b', '04:15');
    my $_0p1e = ReadingsVal($default_hc, '0p1e', '21:00');
    my $_0p2b = ReadingsVal($default_hc, '0p2b', '21:00');
    my $_0p2e = ReadingsVal($default_hc, '0p2e', '21:00');
    my $dayTemp = ReadingsVal($default_hc, 'dayTemp', '04:15');
    my $nightTemp = ReadingsVal($default_hc, 'nightTemp', '04:15');

    foreach (devspec2array($devices)){
      my $room = AttrVal($_, 'room', 'Unsorted');
      my $hc = 'hc_'.string2devspec($room);

      if(!(defined($defs{$hc}))){
        fhem("
          define $hc dummy;

          setreading $hc 8p1b $_8p1b;
          setreading $hc 8p1e $_8p1e;
          setreading $hc 8p2b $_8p2b;
          setreading $hc 8p2e $_8p1e;
          setreading $hc 6p1b $_6p1b;
          setreading $hc 6p1e $_6p1e;
          setreading $hc 6p2b $_6p2b;
          setreading $hc 6p2e $_6p2e;
          setreading $hc 0p1b $_0p1b;
          setreading $hc 0p1e $_0p1e;
          setreading $hc 0p2b $_0p2b;
          setreading $hc 0p2e $_0p2e;
          setreading $hc dayTemp $dayTemp;
          setreading $hc nightTemp $nightTemp;

          attr $hc userattr model;
          attr $hc model heating-control;
          attr $hc room $room;
          ",1);
      }
    }

    my $rg_heater = 'rg_heater';
    if(!(defined($defs{$rg_heater}))){
      fhem("
        define $rg_heater readingsGroup <>,<Heizung>,<Temperatur>,<Status>,<Wochenprofil>,<Montag-Freitag>,<Samstag>,<Sonntag>,<> $devices:<>,!alias,<Soll>,!desired-temp,<Tag>,!dayTemp\@\{readingsGroup(\$DEVICE,'hc')\},!controlMode,!btnLock,<Zeitraum&nbsp\;\;1>,!8p1b\@\{readingsGroup(\$DEVICE,'hc')\},!8p1e\@\{readingsGroup(\$DEVICE,'hc')\},!6p1b\@\{readingsGroup(\$DEVICE,'hc')\},!6p1e\@\{readingsGroup(\$DEVICE,'hc')\},!0p1b\@\{readingsGroup(\$DEVICE,'hc')\},!0p1e\@\{readingsGroup(\$DEVICE,'hc')\},!system_fhem_update,<br>,!state\@\{readingsGroup(\$DEVICE,'device')\},!getConfig,<Ist>,!measured-temp,<Nacht>,!nightTemp\@\{readingsGroup(\$DEVICE,'hc')\},<Ventil>,!ValvePosition,<Zeitraum&nbsp\;\;2>,!8p2b\@\{readingsGroup(\$DEVICE,'hc')\},!8p2e\@\{readingsGroup(\$DEVICE,'hc')\},!6p2b\@\{readingsGroup(\$DEVICE,'hc')\},!6p2e\@\{readingsGroup(\$DEVICE,'hc')\},!0p2b\@\{readingsGroup(\$DEVICE,'hc')\},!0p2e\@\{readingsGroup(\$DEVICE,'hc')\},!burstXmit;

        attr $rg_heater alias Übersicht Heizkörper;
        attr $rg_heater commands \{'desired-temp' => 'desired-temp:', 'dayTemp' => 'dayTemp:', 'controlMode' => 'trigger ntfy_rg \$DEVICE controlMode', 'btnLock' => 'trigger ntfy_rg \$DEVICE btnLock', '8p1b' => '8p1b:', '8p1e' => '8p1e:', '6p1b' => '6p1b:', '6p1e' => '6p1e:', '0p1b' => '0p1b:', '0p1e' => '0p1e:', 'system_fhem_update' => 'trigger ntfy_rg \$DEVICE setTimeTable', 'getConfig' => 'trigger ntfy_rg \$DEVICE getConfig', 'nightTemp' => 'nightTemp:', '8p2b' => '8p2b:', '8p2e' => '8p2e:', '6p2b' => '6p2b:', '6p2e' => '6p2e:', '0p2b' => '0p2b:', '0p2e' => '0p2e:', 'burstXmit' => 'trigger ntfy_rg \$DEVICE burstXmit'};
        attr $rg_heater nameStyle \{(\$READING eq \"Temperatur\"|| \$READING eq \"Status\"|| \$READING eq \"Montag-Freitag\"|| \$READING eq \"Samstag\"|| \$READING eq \"Sonntag\"|| \$READING eq \"system_fhem_update\")?'style=\"text-align:center\"':'style=\"\"'};
        attr $rg_heater nonames 1;
        attr $rg_heater room controlRoom;
        attr $rg_heater sortDevices 1;
        attr $rg_heater valueColumns \{'Heizung' => 'colspan=\"2\"', 'alias' => 'colspan=\"2\"', 'Temperatur' => 'colspan=\"4\"', 'Status' => 'colspan=\"2\"', 'Montag-Freitag' => 'colspan=\"2\"', 'Samstag' => 'colspan=\"2\"', 'Sonntag' => 'colspan=\"2\"'};
        attr $rg_heater valueFormat \{'alias' => '\{\"<a href=/fhem?detail=\$DEVICE>\".readingsGroup(\$DEVICE,\"alias\").\"</a>\"\}', 'btnLock' => '\{ReadingsVal(readingsGroup(\$DEVICE,\"device\"),\"R-\".AttrVal(\"default_hc\",\"lockMode\",\"btnLock\"),\"off\")\}', 'measured-temp' => \"%0.1f °C\", 'ValvePosition' => \"%0.1f %%\"\};
        attr $rg_heater valueIcon \{'controlMode.auto' => 'sani_heating_automatic\@green', 'controlMode.set_auto' => 'sani_heating_automatic\@orange', 'controlMode.manual' => 'sani_heating_manual\@red', 'controlMode.set_manual' => 'sani_heating_manual\@orange', 'btnLock.on' => 'secur_locked\@green', 'btnLock.on ' => 'secur_locked\@green', 'btnLock.set_on' => 'secur_locked\@orange', 'btnLock.set_on ' => 'secur_locked\@orange', 'btnLock.off' => 'secur_open\@red', 'btnLock.off ' => 'secur_open\@red', 'btnLock.set_off' => 'secur_open\@orange', 'btnLock.set_off ' => 'secur_open\@orange', 'system_fhem_update' => 'system_fhem_update'\};
        attr $rg_heater visibility hidden;
        ");
    }
  generate_notify_readingsGroup();
  }
}

sub generate_notify_readingsGroup{
  my $ntfy_rg = 'ntfy_rg';
  if(!(defined($defs{$ntfy_rg}))){
    fhem("
      define $ntfy_rg notify $ntfy_rg {readingsGroup(\$EVTPART0, \$EVTPART1)};

      attr $ntfy_rg alias notify readingsGroup;
      attr $ntfy_rg room global;
      ");
  }
}

sub inheritance{
  foreach my $default (devspec2array('TYPE=dummy:FILTER=subType=default')){
    my $wildcard = AttrVal($default, 'wildcard', 'TYPE=none');
    my @attributes = split(' ',AttrVal($default, 'attributes', ''));
    foreach my $attribute (@attributes){
      my $AttrVal = AttrVal($default, $attribute, '');
      fhem("attr $wildcard $attribute $AttrVal", 1);
    }
  }
}

sub readingsGroup($$){
  my ($device, $function) = @_;
  my $room = AttrVal($device, 'room', 'Unsorted');

  switch ($function) {
    case 'alias' {
      return (AttrVal($device, 'alias', $device));
    }
    case 'btnLock' {
      $device = readingsGroup($device, 'device');
      $function = AttrVal('default_hc', 'lockMode', 'btnLock');
      my $btnLock = ReadingsVal($device, 'R-'.$function, '');

      switch ($btnLock) {
        case /off/ {
          $btnLock = 'on';
        }
        else {
          $btnLock = 'off';
        }
      }
      fhem ("
        set $device regSet $function $btnLock;
        set $device getConfig;
        ");
    }
    case 'burstXmit' {
      $device = readingsGroup($device, 'device');
      fhem("set $device burstXmit");
    }
    case 'controlMode' {
      my $controlMode = ReadingsVal($device, 'controlMode', '');

      switch ($controlMode) {
        case /manual/ {
          fhem("set $device controlMode auto");
        }
        else {
          fhem("set $device controlMode manual");
        }
      }
    }
    case 'device' {
      return (InternalVal($device, 'device', $device));
    }
    case 'getConfig' {
      $device = readingsGroup($device, 'device');
      fhem("set $device getConfig");
    }
    case 'hc' {
      return ('hc_'.string2devspec($room));
    }
    case 'setTimeTable' {
      my $hc = readingsGroup($device, 'hc');
      my $_8p1b = ReadingsVal($hc, '8p1b', '04:15');
      my $_8p1e = ReadingsVal($hc, '8p1e', '06:30');
      my $_8p2b = ReadingsVal($hc, '8p2b', '15:15');
      my $_8p2e = ReadingsVal($hc, '8p2e', '21:00');
      my $_6p1b = ReadingsVal($hc, '6p1b', '04:15');
      my $_6p1e = ReadingsVal($hc, '6p1e', '21:00');
      my $_6p2b = ReadingsVal($hc, '6p2b', '24:00');
      my $_6p2e = ReadingsVal($hc, '6p2e', '24:00');
      my $_0p1b = ReadingsVal($hc, '0p1b', '04:15');
      my $_0p1e = ReadingsVal($hc, '0p1e', '21:00');
      my $_0p2b = ReadingsVal($hc, '0p2b', '21:00');
      my $_0p2e = ReadingsVal($hc, '0p2e', '21:00');
      my $dayTemp = ReadingsVal($hc, 'dayTemp', '04:15');
      my $nightTemp = ReadingsVal($hc, 'nightTemp', '04:15');

      fhem("
        set $device tempListMon prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListTue prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListWed prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListThu prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListFri prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListSat prep $_6p1b $nightTemp $_6p1e $dayTemp $_6p2b $nightTemp $_6p2e $dayTemp 24:00 $nightTemp;
        set $device tempListSun exec $_0p1b $nightTemp $_0p1e $dayTemp $_0p2b $nightTemp $_0p2e $dayTemp 24:00 $nightTemp;
        ",1);
    }
    case 'state' {
      my $state = ReadingsVal($device, 'state', '');

      switch ($state) {
        case /on/ {
          fhem("set $device off");
        }
        else {
          fhem("set $device on");
        }
      }
    }
  }
}

sub string2devspec($){
  my $string = shift;
  my %mutated_vowel =
    ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss");
  my $mutated_vowel_keys =
    join ("|", keys(%mutated_vowel));

  $string =~ s/($mutated_vowel_keys)/$mutated_vowel{$1}/g;
  $string =~ s/[^A-Za-z0-9\.\_]//g;

  return $string;
}


1;





igami

Ich habe nun mal eine zweite FHEM Instanz aufgesetzt und ein Thermostat hinzugefügt, dazu den code aus dem Post 177 Eingefügt, bzw. das ganz als 99_cleanUtils.pm abgespeichert, dann gibt es keine Konflikte mehr mit bestehenden Subs in den my Utils

package main;
  use POSIX;
  use strict;
  use Switch;
  use warnings;

sub cleanUtils_Initialize($$){
  my ($hash) = @_;
}

sub clean{
  generate_heating_control();
  inheritance();
}

sub generate_heating_control{
  my $default_hc = 'default_hc';
  if(!(defined($defs{$default_hc}))){
    my $timeDropDown = '00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45,05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:45,07:00,07:15,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,24:00';
    my $tempDropDown = '5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.0,12.5,13.0,13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0,22.5,23.0,23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0,28.5,29.0,29.5,30.0';

    fhem("
      define $default_hc dummy;

      setreading $default_hc 8p1b 04:15;
      setreading $default_hc 8p1e 06:30;
      setreading $default_hc 8p2b 15:15;
      setreading $default_hc 8p2e 21:00;
      setreading $default_hc 6p1b 04:15;
      setreading $default_hc 6p1e 21:00;
      setreading $default_hc 6p2b 24:00;
      setreading $default_hc 6p2e 24:00;
      setreading $default_hc 0p1b 04:15;
      setreading $default_hc 0p1e 21:00;
      setreading $default_hc 0p2b 24:00;
      setreading $default_hc 0p2e 24:00;
      setreading $default_hc dayTemp 21.0;
      setreading $default_hc nightTemp 17.0;

      attr $default_hc userattr attributes devices lockMode model subType wildcard;
      attr $default_hc attributes userattr group readingList setList;
      attr $default_hc devices TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04;
      attr $default_hc group Heizkörper;
      attr $default_hc lockMode btnLock;
      attr $default_hc model heating-control;
      attr $default_hc readingList 8p1b 8p1e 8p2b 8p2e 6p1b 6p1e 6p2b 6p2e 0p1b 0p1e 0p2b 0p2e dayTemp nightTemp;
      attr $default_hc room default;
      attr $default_hc setList  0p1b:$timeDropDown 0p1e:$timeDropDown 0p2b:$timeDropDown 0p2e:$timeDropDown 6p1b:$timeDropDown 6p1e:$timeDropDown 6p2b:$timeDropDown 6p2e:$timeDropDown 8p1b:$timeDropDown 8p1e:$timeDropDown 8p2b:$timeDropDown 8p2e:$timeDropDown dayTemp:$tempDropDown nightTemp:$tempDropDown;
      attr $default_hc subType default;
      attr $default_hc widgetOverride lockMode:btnLock,globalBtnLock,modusBtnLock;
      attr $default_hc wildcard TYPE=dummy:FILTER=model=heating-control:FILTER=subType!=default;
      ",1);
  }else{
    my $devices = AttrVal('default_hc', 'devices', 'TYPE=CUL_HM:FILTER=model=HM-CC-RT-DN:FILTER=chanNo=04');
    my $_8p1b = ReadingsVal($default_hc, '8p1b', '04:15');
    my $_8p1e = ReadingsVal($default_hc, '8p1e', '06:30');
    my $_8p2b = ReadingsVal($default_hc, '8p2b', '15:15');
    my $_8p2e = ReadingsVal($default_hc, '8p2e', '21:00');
    my $_6p1b = ReadingsVal($default_hc, '6p1b', '04:15');
    my $_6p1e = ReadingsVal($default_hc, '6p1e', '21:00');
    my $_6p2b = ReadingsVal($default_hc, '6p2b', '24:00');
    my $_6p2e = ReadingsVal($default_hc, '6p2e', '24:00');
    my $_0p1b = ReadingsVal($default_hc, '0p1b', '04:15');
    my $_0p1e = ReadingsVal($default_hc, '0p1e', '21:00');
    my $_0p2b = ReadingsVal($default_hc, '0p2b', '21:00');
    my $_0p2e = ReadingsVal($default_hc, '0p2e', '21:00');
    my $dayTemp = ReadingsVal($default_hc, 'dayTemp', '04:15');
    my $nightTemp = ReadingsVal($default_hc, 'nightTemp', '04:15');

    foreach (devspec2array($devices)){
      my $room = AttrVal($_, 'room', 'Unsorted');
      my $hc = 'hc_'.string2devspec($room);

      if(!(defined($defs{$hc}))){
        fhem("
          define $hc dummy;

          setreading $hc 8p1b $_8p1b;
          setreading $hc 8p1e $_8p1e;
          setreading $hc 8p2b $_8p2b;
          setreading $hc 8p2e $_8p1e;
          setreading $hc 6p1b $_6p1b;
          setreading $hc 6p1e $_6p1e;
          setreading $hc 6p2b $_6p2b;
          setreading $hc 6p2e $_6p2e;
          setreading $hc 0p1b $_0p1b;
          setreading $hc 0p1e $_0p1e;
          setreading $hc 0p2b $_0p2b;
          setreading $hc 0p2e $_0p2e;
          setreading $hc dayTemp $dayTemp;
          setreading $hc nightTemp $nightTemp;

          attr $hc userattr model;
          attr $hc model heating-control;
          attr $hc room $room;
          ",1);
      }
    }

    my $rg_heater = 'rg_heater';
    if(!(defined($defs{$rg_heater}))){
      fhem("
        define $rg_heater readingsGroup <>,<Heizung>,<Temperatur>,<Status>,<Wochenprofil>,<Montag-Freitag>,<Samstag>,<Sonntag>,<> $devices:<>,!alias,<Soll>,!desired-temp,<Tag>,!dayTemp\@\{readingsGroup(\$DEVICE,'hc')\},!controlMode,!btnLock,<Zeitraum&nbsp\;\;1>,!8p1b\@\{readingsGroup(\$DEVICE,'hc')\},!8p1e\@\{readingsGroup(\$DEVICE,'hc')\},!6p1b\@\{readingsGroup(\$DEVICE,'hc')\},!6p1e\@\{readingsGroup(\$DEVICE,'hc')\},!0p1b\@\{readingsGroup(\$DEVICE,'hc')\},!0p1e\@\{readingsGroup(\$DEVICE,'hc')\},!system_fhem_update,<br>,!state\@\{readingsGroup(\$DEVICE,'device')\},!getConfig,<Ist>,!measured-temp,<Nacht>,!nightTemp\@\{readingsGroup(\$DEVICE,'hc')\},<Ventil>,!ValvePosition,<Zeitraum&nbsp\;\;2>,!8p2b\@\{readingsGroup(\$DEVICE,'hc')\},!8p2e\@\{readingsGroup(\$DEVICE,'hc')\},!6p2b\@\{readingsGroup(\$DEVICE,'hc')\},!6p2e\@\{readingsGroup(\$DEVICE,'hc')\},!0p2b\@\{readingsGroup(\$DEVICE,'hc')\},!0p2e\@\{readingsGroup(\$DEVICE,'hc')\},!burstXmit;

        attr $rg_heater alias Übersicht Heizkörper;
        attr $rg_heater commands \{'desired-temp' => 'desired-temp:', 'dayTemp' => 'dayTemp:', 'controlMode' => 'trigger ntfy_rg \$DEVICE controlMode', 'btnLock' => 'trigger ntfy_rg \$DEVICE btnLock', '8p1b' => '8p1b:', '8p1e' => '8p1e:', '6p1b' => '6p1b:', '6p1e' => '6p1e:', '0p1b' => '0p1b:', '0p1e' => '0p1e:', 'system_fhem_update' => 'trigger ntfy_rg \$DEVICE setTimeTable', 'getConfig' => 'trigger ntfy_rg \$DEVICE getConfig', 'nightTemp' => 'nightTemp:', '8p2b' => '8p2b:', '8p2e' => '8p2e:', '6p2b' => '6p2b:', '6p2e' => '6p2e:', '0p2b' => '0p2b:', '0p2e' => '0p2e:', 'burstXmit' => 'trigger ntfy_rg \$DEVICE burstXmit'};
        attr $rg_heater nameStyle \{(\$READING eq \"Temperatur\"|| \$READING eq \"Status\"|| \$READING eq \"Montag-Freitag\"|| \$READING eq \"Samstag\"|| \$READING eq \"Sonntag\"|| \$READING eq \"system_fhem_update\")?'style=\"text-align:center\"':'style=\"\"'};
        attr $rg_heater nonames 1;
        attr $rg_heater room controlRoom;
        attr $rg_heater sortDevices 1;
        attr $rg_heater valueColumns \{'Heizung' => 'colspan=\"2\"', 'alias' => 'colspan=\"2\"', 'Temperatur' => 'colspan=\"4\"', 'Status' => 'colspan=\"2\"', 'Montag-Freitag' => 'colspan=\"2\"', 'Samstag' => 'colspan=\"2\"', 'Sonntag' => 'colspan=\"2\"'};
        attr $rg_heater valueFormat \{'alias' => '\{\"<a href=/fhem?detail=\$DEVICE>\".readingsGroup(\$DEVICE,\"alias\").\"</a>\"\}', 'btnLock' => '\{ReadingsVal(readingsGroup(\$DEVICE,\"device\"),\"R-\".AttrVal(\"default_hc\",\"lockMode\",\"btnLock\"),\"off\")\}', 'measured-temp' => \"%0.1f °C\", 'ValvePosition' => \"%0.1f %%\"\};
        attr $rg_heater valueIcon \{'controlMode.auto' => 'sani_heating_automatic\@green', 'controlMode.set_auto' => 'sani_heating_automatic\@orange', 'controlMode.manual' => 'sani_heating_manual\@red', 'controlMode.set_manual' => 'sani_heating_manual\@orange', 'btnLock.on' => 'secur_locked\@green', 'btnLock.on ' => 'secur_locked\@green', 'btnLock.set_on' => 'secur_locked\@orange', 'btnLock.set_on ' => 'secur_locked\@orange', 'btnLock.off' => 'secur_open\@red', 'btnLock.off ' => 'secur_open\@red', 'btnLock.set_off' => 'secur_open\@orange', 'btnLock.set_off ' => 'secur_open\@orange', 'system_fhem_update' => 'system_fhem_update'\};
        attr $rg_heater visibility hidden;
        ");
    }
  generate_notify_readingsGroup();
  }
}

sub generate_notify_readingsGroup{
  my $ntfy_rg = 'ntfy_rg';
  if(!(defined($defs{$ntfy_rg}))){
    fhem("
      define $ntfy_rg notify $ntfy_rg {readingsGroup(\$EVTPART0, \$EVTPART1)};

      attr $ntfy_rg alias notify readingsGroup;
      attr $ntfy_rg room global;
      ");
  }
}

sub inheritance{
  foreach my $default (devspec2array('TYPE=dummy:FILTER=subType=default')){
    my $wildcard = AttrVal($default, 'wildcard', 'TYPE=none');
    my @attributes = split(' ',AttrVal($default, 'attributes', ''));
    foreach my $attribute (@attributes){
      my $AttrVal = AttrVal($default, $attribute, '');
      fhem("attr $wildcard $attribute $AttrVal", 1);
    }
  }
}

sub readingsGroup($$){
  my ($device, $function) = @_;
  my $room = AttrVal($device, 'room', 'Unsorted');

  switch ($function) {
    case 'alias' {
      return (AttrVal($device, 'alias', $device));
    }
    case 'btnLock' {
      $device = readingsGroup($device, 'device');
      $function = AttrVal('default_hc', 'lockMode', 'btnLock');
      my $btnLock = ReadingsVal($device, 'R-'.$function, '');

      switch ($btnLock) {
        case /off/ {
          $btnLock = 'on';
        }
        else {
          $btnLock = 'off';
        }
      }
      fhem ("
        set $device regSet $function $btnLock;
        set $device getConfig;
        ");
    }
    case 'burstXmit' {
      $device = readingsGroup($device, 'device');
      fhem("set $device burstXmit");
    }
    case 'controlMode' {
      my $controlMode = ReadingsVal($device, 'controlMode', '');

      switch ($controlMode) {
        case /manual/ {
          fhem("set $device controlMode auto");
        }
        else {
          fhem("set $device controlMode manual");
        }
      }
    }
    case 'device' {
      return (InternalVal($device, 'device', $device));
    }
    case 'getConfig' {
      $device = readingsGroup($device, 'device');
      fhem("set $device getConfig");
    }
    case 'hc' {
      return ('hc_'.string2devspec($room));
    }
    case 'setTimeTable' {
      my $hc = readingsGroup($device, 'hc');
      my $_8p1b = ReadingsVal($hc, '8p1b', '04:15');
      my $_8p1e = ReadingsVal($hc, '8p1e', '06:30');
      my $_8p2b = ReadingsVal($hc, '8p2b', '15:15');
      my $_8p2e = ReadingsVal($hc, '8p2e', '21:00');
      my $_6p1b = ReadingsVal($hc, '6p1b', '04:15');
      my $_6p1e = ReadingsVal($hc, '6p1e', '21:00');
      my $_6p2b = ReadingsVal($hc, '6p2b', '24:00');
      my $_6p2e = ReadingsVal($hc, '6p2e', '24:00');
      my $_0p1b = ReadingsVal($hc, '0p1b', '04:15');
      my $_0p1e = ReadingsVal($hc, '0p1e', '21:00');
      my $_0p2b = ReadingsVal($hc, '0p2b', '21:00');
      my $_0p2e = ReadingsVal($hc, '0p2e', '21:00');
      my $dayTemp = ReadingsVal($hc, 'dayTemp', '04:15');
      my $nightTemp = ReadingsVal($hc, 'nightTemp', '04:15');

      fhem("
        set $device tempListMon prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListTue prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListWed prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListThu prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListFri prep $_8p1b $nightTemp $_8p1e $dayTemp $_8p2b $nightTemp $_8p2e $dayTemp 24:00 $nightTemp;
        set $device tempListSat prep $_6p1b $nightTemp $_6p1e $dayTemp $_6p2b $nightTemp $_6p2e $dayTemp 24:00 $nightTemp;
        set $device tempListSun exec $_0p1b $nightTemp $_0p1e $dayTemp $_0p2b $nightTemp $_0p2e $dayTemp 24:00 $nightTemp;
        ",1);
    }
    case 'state' {
      my $state = ReadingsVal($device, 'state', '');

      switch ($state) {
        case /on/ {
          fhem("set $device off");
        }
        else {
          fhem("set $device on");
        }
      }
    }
  }
}

sub string2devspec($){
  my $string = shift;
  my %mutated_vowel =
    ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss");
  my $mutated_vowel_keys =
    join ("|", keys(%mutated_vowel));

  $string =~ s/($mutated_vowel_keys)/$mutated_vowel{$1}/g;
  $string =~ s/[^A-Za-z0-9\.\_]//g;

  return $string;
}

1;

Und ich bekomme keine Fehler.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rasti

Danke Igami für all deine Arbeit und Mühe
- aber bei mir will es nicht  :(

Ich hab nun versuchsweise den Inhalt der 99_myUtils.pm geleert und alles in eine neue
99_cleanUtils.pm reingepackt. Same Procedure wie zuvor und leider selbes Ergebnis.

Sorry tut mir leid.....  :(

igami

Ich werde es bei Gelegenheit mal bei bekannten testen, bis dahin musst du selbst suchen.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

rasti

Hallo Igami,

ich habe nun eine vorige Version von dir installiert und zwar aus deinem Post#17

Nun was soll ich sagen : Das geht (fast) !
=> BtnLock produziert zwar noch den Fehler
2015.09.16 21:07:40 3: set HM_XX regSet globalBtnLock on : invalid value. use:off,on
Aber Zeiten und Temperaturlisten werden übertragen und nachher auch angezeigt.

Könntest du mal für das neue Layout (das mit den 2 Tageszeiträumen) den vom Skript
erzeugten fhem.cfg Code posten,  den würde ich vielleicht mal probieren bei mir manuell anzupassen.

Gruss

Ralf


rasti

Hallo Igami,

ich habe nun die ReadingsGroup aus deinem Post #140 nachgebaut.

(auch Post #177 habe ich nochmal neu von vorne installiert aber das geht einfach nicht....)

Also gem. #140 funktioniert es im Prinzip also ich kann Temperaturen bzw. Zeiten
als Templiste übertragen und zwischen Auto/Manuell umschalten.

Leider erscheinen die neuen Temperaturen und Zeiten nicht im Dropdown menü,
d.h. es steht immer auf den Standardwerten (21 17 Grad, 4:15 Uhr etc.).
Mit getconfig kann ich allerdings verifzieren, dass die neuen Templisten
korrekt ans Thermostat übertragen werden.

=> Ist das in der Version halt so oder habe ich da noch einen Fehler ?
=> Zudem ist bei mir die zweite Zeile verrückt (siehe Screenshot) Wo kann da der Fehler liegen ?
=> ButtonLock geht nach wie vor nicht, d.h. es kommt die o.g. Fehlermeldung

Gruss

Ralf








kleinerDrache

Als erstes mal aller besten Dank für die Readingsgroup, klasse teil.

Funktioniert auch soweit nur hab ich im Log beim Server neustart immer:

main::rg() called too early to check prototype at ./FHEM/99_myUtils.pm line 107.
main::rg() called too early to check prototype at ./FHEM/99_myUtils.pm line 121.
main::rg() called too early to check prototype at ./FHEM/99_myUtils.pm line 135.
main::rg() called too early to check prototype at ./FHEM/99_myUtils.pm line 160.
main::rg() called too early to check prototype at ./FHEM/99_myUtils.pm line 164.


bekommt man das weg ?
Raspi 2 - Hmusb2 , 2xJeeLink , EnOcean pi: Serie14 Geräte , 6xHM-Sec-Rhs , 6xHM-CC-RT-DN, verschiedene MySensor Nodes, ein bischen MQTT

2P4u

Hi Zusammen.
Ich habe das jetzt auch mal versucht mit der Version die alles selbst erstellt.
Jedoch bekomme ich den Fehler, dass die Switch.pm nicht gefunden wird.

Kann mir jemand sagen ob die Standard ist? Wo bekomme ich die her?
Ich bin hier alle durch und konnte die Switch.pm nicht finden :(
http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/FHEM/

Hoffe mir kann jemand helfen.
Danke und lieben Gruss
Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

rasti

Hallo Daniel,

switch.pm sollte standardmäßig bei Perl dabeisein.
Schau mal bei http://forum.fhem.de/index.php?topic=10871.5

Gruss

Ralf

Jojo11

Zitat von: igami am 15 September 2015, 21:24:40
Ich habe nun mal eine zweite FHEM Instanz aufgesetzt und ein Thermostat hinzugefügt, dazu den code aus dem Post 177 Eingefügt, bzw. das ganz als 99_cleanUtils.pm abgespeichert, dann gibt es keine Konflikte mehr mit bestehenden Subs in den my Utils
...

Und ich bekomme keine Fehler.

Hallo,

habe den code soeben auch mal ausprobiert und kann bestätigen, dass es bei mir mit 7 Thermostaten auf Anhieb geklappt hat. Vielen Dank dafür!

schöne Grüße
Jo

DrJJ

Habe den Code auch mal getestet, ging auch bei mir ohne Probleme.

Was ich bei der Sache noch vermisse, ist ein extra Tag Freitag. Da ich Samstags nicht arbeiten muss bin ich meist länger wach als die Tage Montag bis Donnerstag

Ansonsten vielen Dank für die Mühen diese schöne Steuerung zu programmieren