HM-CC-TC auf auto Temp zurückstellen

Begonnen von unimatrix, 11 November 2013, 22:05:30

Vorheriges Thema - Nächstes Thema

unimatrix

Hi,

ich hoffe die Frage wurde nicht schon 100 mal gestellt. Ich bin in meiner TODO Liste endlich mal so weit gekommen, die automatische Deaktivierung aller Thermostate im Haus bei längerer Abwesenheit zu implementieren. Sobald man zurückkommt (Bewegungsmelder im Eingangsbereich erkennt dies sofort), soll alles wieder aktiviert werden.

Ich löse die deaktivierung für die HM-CC-TC mit 2 Befehlen: Setzen auf Manual controlMode und desired-temp auf off. Klappt. (für die DN mit controlManu off)

Die Aktivierung beim DN ist auch einfach: controlMode auto. Die DN setzen sich automatisch wieder auf die desired-temp, die laut Automatik-Programm jetzt dran wäre. die HM-CC-TC tun dies allerdings nicht. Sie schalten erst zur nächsten Schaltzeit auf die entsprechende desired-temp um.

Gibt es eine Möglichkeit, das irgendwie umzustellen oder kann die doofe Kiste (das Thermostat) das einfach nicht? Dann muss ich ja die tempListen selbst parsen und die desired-temp manuell richtig setzen :(

falls das so ist, hat das zufällig jemand implementiert? Also eine Routine die anhand der ausgelesenen tempListen feststellt, welche desired-temp denn jetzt anliegen sollte.

Wenn nicht, muss ichs wohl machen (und poste sie dann hier)

VG!

unimatrix

so, nun habe ich mir doch selbst geholfen. Kann man sicher brauchen.

Folgendes sub liefert die Temperatur zurück, die nach den eingestellten tempListen gerade im Auto Modus anliegen muss.

Es wird davon ausgegangen, dass die tempListen in FHEM aktuell sind, um das Auslesen muss man sich selbst kümmern


sub autotemp{
my $chan=$_[0]; # welcher Kanal (nicht device)
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime;
my @wdays=("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); # strftime ("%a",localtime()) ist nicht ohne weiteres möglich, da abhängig von locale setting (Tue=Di usw)
my $day=$wdays[$wday];  # Kurzbezeichnung des heutigen Wochentags aus Array auslesen
my $templist=ReadingsVal("$chan","tempList$day",""); # liste von HEUTE auslesen
$templist =~ s/^\s+//; # leerzeichen am anfang weg
$templist =~ s/\s+$//; # leerzeichen am Ende weg
my @templistelements=split(" ", $templist); # Die Templist in ihre Elemente zerlegen
# folgende Schleife erzeugt time/value paare aller angegebenen Stellzeiten (geht bestimmt auch viel cooler)
my $mindiff="24:00:00"; # eine Tageslänge
my $value;
for(my $i=0;$i<@templistelements/2;$i++){
my $diff=abstime2rel($templistelements[$i*2].":00"); # wie lange sind wir weg von der SChaltzeit?
if($diff<$mindiff){$mindiff=$diff;$value=$templistelements[1+($i*2)];} # wir suchen die kleinste relative Zeit
}
return $value; # der aktuelle Auto-Wert wird zurückgegeben
}

unimatrix

Nach einigen Tests fällt allerdings auf, dass offenbar vor allem dann, wenn man sowohl die desired-temp per FHEM setzt als auch gleichzeitig (also direkt in der nächsten Codezeile) den Modus von CENT auf AUTO umstellen will, dsas dann oft mals letztes nicht klappt. und das OBWOHL ein ACK vom Device zurück kommt. Da hilft auch der Watchdog so nicht. Da müsste ich eine Routine bauen die sich merkt, dass man jetzt AUTO setzen will und die erstmal nicht aufgibt, es immer wieder neu zu probieren, bis von dem Device wirklich das Register erfolgreich und richtig zurückgelesen werden kann...

Diese TCs machen mich noch wahnsinnig....


martinp876

kannst du den Fehlerfall einmal loggen? Und die Beschreibung dazu posten?
Roh-messages natürlich ;-)

unimatrix

kommt leider nur sehr selten vor. Ich habe auch schon NACKs gesehen und dann war der Value doch im Device. Da ich das auch ohne Burst mache (denn es soll ohne gehen) ist das immer was für entspannte Stunden weil man viel warten muss...

ich hab zwar jetzt kein log mehr aber ich bin sicher, dass ich keine Fehlermeldung hatte (ganz normal CMDs_done, ACK, usw) und im Device trotzdem der Mode nicht geändert war. Das ist nur dadurch festzustellen das das reading halt immer noch auf central und nicht auto stand.

Daher habe ich mir jetzt was anderes gebaut. Eiine Routine, die sich merkt, was man setzen will und das dann während einer definierten Zeit immer wieder versucht, bis das Reading tatsächlich dem gewünschten Wert entspricht. Das ganze im Moment realisiert für den controlMode auto und cent (bzw. manu beim DN) und für die desired-temp. Hab ich jetzt mal testweise laufen.

Hier der code daz (wird sicher noch bugs enthalten) - ist noch nicht kommentiert, mach ich noch


sub tempcc{
state @actions;
if(defined($_[0]) && defined($_[1])){
my %item;
$item{'channel'}=$_[0];
$item{'action'}=$_[1];
$item{'timestamp'}=time();
if(defined($_[2])){
$item{'value'}=$_[2];
}
push @actions, \%item;
}
my $i=0;
my @splices;
foreach my $item (@actions){
print "Channel: ".$item->{'channel'}." - ";
print "Item: ".$item->{'action'}." - ";
print "Timestamp: ".(time()-$item->{'timestamp'})."\n\n";
if(time()-$item->{'timestamp'}>3600){
push @splices, $i;
my $mailbody="Item ".$item->{'action'}." auf channel ".$item->{'channel'}." ist in den Timeout gelaufen";
DebianMail("tempcc Action timeout",$mailbody);
}
my $chan=$item->{'channel'};
my $cmd=$item->{'action'};
my $val=$item->{'value'};
if(!defined($therm_reads->{"$cmd"}) || !defined($therm_cmds->{"$cmd"}) || !defined($thermtypes->{"$chan"})){
DebianMail("tempcc: CMD $cmd ist nicht definiert","");
push @splices, $i;
}else{
my $type = $thermtypes->{"$chan"};
my $ist=ReadingsVal("temp_".$chan.$therm_reads->{"$cmd"}->{"$type"}->{"channel"},$therm_reads->{"$cmd"}->{"$type"}->{"register"},"");
my $soll=$therm_reads->{"$cmd"}->{"$type"}->{"value"};
$soll=~s/VALUE/$val/;
print "Soll: $soll, Ist: $ist\n";
if($soll eq $ist){
push @splices, $i; #erledigt!
}else{
if($thermtypes->{"$chan"} eq "CC"){
my $fhem=$therm_cmds->{"$cmd"}->{"$type"};
$fhem=~s/VALUE/$val/;
fhem "set temp_".$chan."_Climate ".$fhem;
}
}
}
}
foreach my $splice (@splices){splice(@actions,$splice,1);}
}


Die entsprechenden Hashrefs habe ich global definiert (nun seht ihr mal was ich für tolle Namen für meine Geräte habe)


my $thermtypes = {"hobby" => "CC", "nele" => "CC", "merle" => "CC", "bad" => "CC", "schlaf" => "DN", "buero" => "DN", "gbad" => "DN", "gzbad" => "DN", "gz" => "DN"};
my $therm_cmds = {"auto" => {"CC" => "controlMode auto", "DN" => "controlMode auto"},
      "manu" => {"CC" => "controlMode cent", "DN" => "controlManu off"},
  "temp" => {"CC" => "desired-temp VALUE", "DN" => "controlManu VALUE"}};
my $therm_reads = {"auto" => {"CC" => {"channel" => "","register" => "controlMode","value" => "auto"},
  "DN" => {"channel" => "_ClimRT_tr","register" => "mode","value" => "auto"}},
       "manu" => {"CC" => {"channel" => "","register" => "controlMode","value" => "central"},
  "DN" => {"channel" => "_ClimRT_tr","register" => "mode","value" => "manu"}},
   "temp" => {"CC" => {"channel" => "","register" => "desired-temp","value" => "VALUE"},
"DN" => {"channel" => "","register" => "desired-temp","value" => "VALUE"}}};



Die Routine muss per AT regelmäßig alle paar Minuten ohne Argumente aufgerufen werden. Will man was neues setzen, ruft man sie unabhängig davon mit Argumenten auf (z.B. tempcc("hobby","temp","5"); )

Man kann mehrere sachen machen, das ganze wird in einem statischen Array gespeichert und die Elemente werden dann gelöscht, entweder wenn das Auslesen zeigt, dass der Istwert nun dem Sollwert entspricht, oder wenn die Zeit abgelaufen ist, dann wird im Moment eine Email verschickt.

Freibeuter

Hallo unimatrix,

Wollte Deinen Code (ist in 99_myUtils.pm) ausprobieren mit:
{autotemp("Hzg_Wohnzimmer_Climate")}
aber ich bekomme keinen Wert und keine Fehlermeldung.
Was mache ich falsch ?

Freibeuter

Die Readings wurden umbenannt, habe den Code angepasst:
###############################
# autotemp
#  den aktuellen wert der Templist auslesen
#  {autotemp("Hzg_Wohnzimmer_Climate")}
#
###############################
sub autotemp{
my $chan=$_[0]; # welcher Kanal (nicht device)
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime;
my @wdays=("Sun","Mon","Tue","Wed","Thu","Fri","Sat"); # strftime ("%a",localtime()) ist nicht ohne weiteres möglich, da abhängig von locale setting (Tue=Di usw)
my $day=$wdays[$wday];  # Kurzbezeichnung des heutigen Wochentags aus Array auslesen
        my $templist= "ERR";
if ($wday = "Sat"){ $templist=ReadingsVal("$chan","R_0_tempListSat","ERR");} # liste von HEUTE auslesen
if ($wday = "Sun"){ $templist=ReadingsVal("$chan","R_1_tempListSun","ERR");} # liste von HEUTE auslesen
if ($wday = "Mon"){ $templist=ReadingsVal("$chan","R_2_tempListMon","ERR");} # liste von HEUTE auslesen
if ($wday = "Tue"){ $templist=ReadingsVal("$chan","R_3_tempListTue","ERR");} # liste von HEUTE auslesen
if ($wday = "Wed"){ $templist=ReadingsVal("$chan","R_4_tempListWed","ERR");} # liste von HEUTE auslesen
if ($wday = "Thu"){ $templist=ReadingsVal("$chan","R_5_tempListThu","ERR");} # liste von HEUTE auslesen
if ($wday = "Fri"){ $templist=ReadingsVal("$chan","R_6_tempListFri","ERR");} # liste von HEUTE auslesen
        $templist =~ s/^\s+//; # leerzeichen am anfang weg
$templist =~ s/\s+$//; # leerzeichen am Ende weg
my @templistelements=split(" ", $templist); # Die Templist in ihre Elemente zerlegen
# folgende Schleife erzeugt time/value paare aller angegebenen Stellzeiten (geht bestimmt auch viel cooler)
my $mindiff="24:00:00"; # eine Tageslänge
my $value= "ERROR";;
for(my $i=0;$i<@templistelements/2;$i++){
my $diff=abstime2rel($templistelements[$i*2].":00"); # wie lange sind wir weg von der SChaltzeit?
if($diff<$mindiff){
   $mindiff=$diff;
   $value=$templistelements[1+($i*2)];
    } # wir suchen die kleinste relative Zeit
}
    Log 5, "autotemp $chan Temp: $value";
return $value; # der aktuelle Auto-Wert wird zurückgegeben
}

martinp876

Da ich keinen cctc mehr habe kann ich es nicht darstellen. Ich dachte allerdings, dass der cctc nach umschalten auf Auto sofort die temp anpasst.  Schade, wenn es nicht klappt. Die manuellen temps sind in readings gespeichert. Tja, vielleicht ist er doch veraltet

unimatrix

Veraltet ist er, aber eben nur wegen der doofen Firmware. Von dem nicht gehenden Stellrad mal abgesehen. Vll sollte ich so ein Ding mal auseinandernehmen. Aber das landet dann auf TODO Position 127 und wird wohl erstmal wieder nix ...

frank

ich finde die tc funktionieren am besten im cent modus.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html