Autor Thema: Offset Einstellung Fritz Dect 301  (Gelesen 2624 mal)

Offline Pocki90

  • New Member
  • *
  • Beiträge: 4
Offset Einstellung Fritz Dect 301
« am: 22 Januar 2019, 15:59:44 »
Hallo Leute,
erstmal will ich mich hier für die tolle Arbeit und dieses super Forum bedanken. Ich bin relativ neu bei FHEM und hab hierdurch viel erfahren und schon gelernt. Jetzt stehe ich aber vor einem Problem und komm nicht weiter und finde auch nix dazu im Forum. Ich würde gerne die Offset Einstellung meiner Fritz Dect 301 Geräte verändern können. Das entsprechende reading mit tempadjust gibt es ja. Aber einfach per SET diesen Wert zu verändern klappt leider nicht. Gibt es andere Möglichkeiten oder wir diese Einstellung gar nicht unterstützt. Hintergrund meiner Frage ist, das ich die Raumtemperatur mithilfe eines Wemos D1 Boards und der Software ESPEasy messe. Dabei hab ich Abweichungen zu den Thermostaten von bis zu 2 Grad festgestellt. Diese Abweichung würde ich gerne als Offset einstellen können.

Viele Dank schon mal für eure Hilfe.
Martin

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 24510
Antw:Offset Einstellung Fritz Dect 301
« Antwort #1 am: 22 Januar 2019, 19:52:53 »
Laut
https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AHA-HTTP-Interface.pdf
Kapitel 1.2, gibt es keine Moeglichkeit, diesen Wert per API zu setzen.
Man muss es wohl direkt in der Fritz!Box oberflaeche setzen.

Offline Pocki90

  • New Member
  • *
  • Beiträge: 4
Antw:Offset Einstellung Fritz Dect 301
« Antwort #2 am: 23 Januar 2019, 09:14:08 »
Vielen Dank für die Antwort. Dann muss ich es jetzt erstmal anders lösen und hoffen, das AVM irgendwann seine API erweitert.

Offline Randybobandy

  • New Member
  • *
  • Beiträge: 10
Antw:Offset Einstellung Fritz Dect 301
« Antwort #3 am: 13 April 2021, 10:00:21 »
Ich habe schon vor ein oder zwei Jahren an AVM geschrieben mit der Bitte, die Einstellung der tatsächlichen Raumtemperatur im FBAHAHTTP Interface zu integrieren. Vermutlich gibt es aber nicht viele Leute, die dies benötigen- jedenfalls geht es immer noch nicht.

Ich habe jetzt ein Perl script für meine persönliche Verwendung geschrieben. Ich habs nicht als DOIF und in 99_myUtils.pm umgesetzt, weil ich mein Fritzbox Kennwort nicht da drin speichern wollte. Vielleicht ist das albern- keine Ahnung. Ich bin leider kein Linux Sicherheitsexperte.

Ich habe es umgesetzt als Perl script für einen Cron Job der 1x Nachts um 00:05 laufen soll und Leserechte nur für root hat. Es kann auf dem FHEM Rechner selbst laufen (telnet oder web FHEM interface) oder auf einem anderen Rechner im Netzwerk (web interface).

Das Script holt sich die statTemperatureDayAvgLast von meinen FBDECT Geräten und meinen Sensoren (Aqara Temp/Humi/Baro) und vergleicht diese. Die Differenz in °C in 0,5° Schritten wird dann als "Klicks" an Firefox::Marionette weitergegeben. Firefox Marionette bedient dann das ganz normale FritzBox web interface, loggt sich ein und klickt bei Tatsächliche Raumtemperatur der Geräte die + und - Knöpfe.

Beispiel: Gemessene Raumtemperatur vom externen Sensor im Wohnzimmer ist 19°C, eingestellte tatsächliche Raumtemperatur vom FBDECT ist 20°C -> Öffne Wohnzimmer FBDECT im Fritzbox Web Interface und klicke 2x "-"

Firefox::Marionette->new(visible => auf 1 stellen anstatt auf 0, dann geht ein Firefox Fenster auf und ich kann genau beobachten, was passiert. Bei 0 läuft es headless aber gibt trotzdem ziemlich viel Diagnosetext aus.

Wenn $testdrive = 1, klickt Firefox bei den FBDECTs nicht auf OK sondern auf Abbrechen. Nützlich, wenn ich das script mehrmals laufen lassen und schauen will, ob es richtig klickt, ohne jedes mal alles in den FBDECTs zu verstellen.

Ich habe für FHEM kein Passwort vergeben- weder für Telnet noch für das Web Interface. Das script kann sich nicht an FHEM mit Passwort anmelden.

Mit "statTemperatureDayAvgLast" darf ich das Script nur 1x täglich laufen lassen im nicht-test-modus. Sonst laufen die Werte komplett auseinander. Mit "statTemperatureHourAvgLast" ginge es stündlich 1x aber keine Ahnung, ob das Sinnvoll ist. Vielleicht sind die Batterien von den FBDECT dann schneller leer?

Mein Cron Job für root (sudo crontab -e) sieht so aus: 5 0 * * * /usr/bin/perl /home/pi/scripts/uni.pl >> /tmp/fbdect_marionette.txt

Bestimmt könnte man das alles schöner als richtiges FHEM Modul umsetzen.

Auf meinem Windows PC läuft das Script ziemlich schnell durch. Beim Raspberry Pi 4 kann es schonmal ein paar Minuten dauern, bis es fertig ist.

Wenn jemand Vorschläge hat, wie man das sicherer oder besser umsetzen könnte, würde ich mich freuen. Fürs erste funktioniert es bei mir schonmal.


#!/usr/bin/perl

use strict;
use warnings;
use Firefox::Marionette;
use Text::Table;
use LWP::Simple;

$| = 1;

#Fritzbox Kennwort
my $password = "12345678";

# web or telnet
my $interface = "web";

# 1: Änderungen nicht speichern in den FBDECTs
# 0: Änderungen speichern
my $testdrive = 1;

my $stattype = "statTemperatureDayAvgLast"; # welches Reading
my $fbdectvorname = "FBDECT_301_"; # Namenskonvention FBDECT
my $sensorvorname = "SENSOR_ZHATemperature_"; # Namenskonvention Externer Sensor

# FBDect Name => Externer Sensor Name
my %sensors;
my %fbdects = (
"Bad"            => "Bad",
"Kueche"         => "Kueche",
"Schlafzimmer"   => "Schlafzimmer",
"Kleiderschrank" => "Kleiderschrank",
"Esszimmer"      => "Esszimmer",
"Esszimmer_2"    => "Esszimmer",
"Wohnzimmer"     => "Wohnzimmer"
);
foreach my $fbdect ( keys(%fbdects) ) {
$sensors{ $fbdects{$fbdect} } = 1;
}
my @sensors = keys(%sensors);
@sensors = sort(@sensors);
my @fbdects = keys(%fbdects);
@fbdects = sort(@fbdects);

my $date = `date`;
print $date;

my $tb = Text::Table->new(
    '$fbdect','$sensor_temp','$fbdect_temp','$tune','$clicks'
);
my @tdata;
my %clicks;
my %avgsensor;
my %avgfbdect;
foreach my $fbdect (@fbdects) {
my $fbdect_temp;
my $sensor_temp;
my $sensor = $fbdects{$fbdect};

my $content;
if ($interface eq "web"){
$content = get("http://raspberrypi:8083/fhem?cmd=list $fbdectvorname$fbdect $stattype&XHR=1");
} else {
$content = `/opt/fhem/fhem.pl 7072 "list $fbdectvorname$fbdect $stattype"`;
}
die "Couldn't get it!" unless defined $content;
chomp $content;
if ($content =~ /(\d+\.\d*)$/){
$fbdect_temp = $1;
}
else {die}
if ($interface eq "web"){
$content = get("http://raspberrypi:8083/fhem?cmd=list $sensorvorname$sensor $stattype&XHR=1");
} else {
$content = `/opt/fhem/fhem.pl 7072 "list $sensorvorname$sensor $stattype"`;
}
die "Couldn't get it!" unless defined $content;
chomp $content;
if ($content =~ /(\d+\.\d*)$/){
$sensor_temp = $1;
}
else {die}
$avgsensor{$fbdect} = $sensor_temp;
$avgfbdect{$fbdect} = $fbdect_temp;
my $tune = $sensor_temp - $fbdect_temp;
$tune = sprintf('%.1f', $tune);
my $clicks = $tune / .5; # Jeder Klick = 0,5°C
$clicks = sprintf('%.0f', $clicks);
$clicks{$fbdect} = $clicks;
push @tdata, ([$fbdect,$sensor_temp,$fbdect_temp,$tune,$clicks]);
}
$tb->load(@tdata);
print $tb;

if ($testdrive == 1){print "\nTestmodus\n"}
else {print "\nDie ist kein Test\n"}
#print "Press any key to continue...\n";
#my $temp = <STDIN>;

my $url           = "http://fritz.box/";
my $firefox       = Firefox::Marionette->new(visible => 0,script => 180000);
my $timeouts = $firefox->timeouts();
print "Page Load Timeouts is " . $timeouts->page_load() . " ms\n";
print "Script Timeouts is " . $timeouts->script() . " ms\n";
print "Implicit Timeouts is " . $timeouts->implicit() . " ms\n";

$firefox->go($url);

#Einloggen
my $element = $firefox->find_name('uiPass');
$firefox->clear($element);
$firefox->type($element, $password);
$firefox->find_id('submitLoginBtn')->click();

#Smart Home Geräteverwaltung Menü öffnen
$firefox->find_id('sh_menu')->click();
$firefox->find_id('sh_dev')->click();

#Warten bis die buttons für die Geräte geladen sind
$firefox->await(sub {$firefox->find_class('v-btn v-btn--icon v-btn--small')});

#Anzahl Geräte zählen
my $buttoncount;
foreach my $element ($firefox->find_class('v-btn v-btn--icon v-btn--small')) {
$buttoncount++;
}
$buttoncount--;

#Jedes Gerät einzeln anklicken und bearbeiten
for (my $y=0; $y <= $buttoncount; $y++){

#Warten bis die buttons für die Geräte geladen sind
$firefox->await(sub {$firefox->find_class('v-btn v-btn--icon v-btn--small')});

my @buttons;
foreach my $element ($firefox->find_class('v-btn v-btn--icon v-btn--small')) {
push @buttons, $element;
}
$buttons[$y]->click();
print "\nOeffne FBDECT Geraet $y von $buttoncount...\n";

#Warten bis die Geräteseite geladen ist bzw. Gerätename erscheint, Namen dann auslesen
$firefox->await(sub {$firefox->find_name('ule_device_name')});
my $device = $firefox->find_name('ule_device_name')->property('value');

print "FBDECT $device geoeffnet werde $clicks{$device} clicks ausfuehren\n";

$firefox->await(sub {$firefox->find_id('uiNumDisplay:Roomtemp')});

my $element = $firefox->find_tag("body");
my $text = $element->text;
#die $text;
my $fbdect_temp;
if ($text =~ /Am Heizk.rper gemessen(\d+,\d*)/s)
{
$fbdect_temp = $1;
$fbdect_temp =~ s/,/\./;
} else {
die "FEHLER: Konnte \"Am Heizkörper gemessen\" nicht finden";
}

print "FBDECT Durchschnittstemperatur im stat Zeitaum: $avgfbdect{$device}\n";
print "Sensor Durchschnittstemperatur im stat Zeitaum: $avgsensor{$device}\n";
#print "Aktueller Wert aus FB am Heizkoerper gemessen: $fbdect_temp\n";

# Hier schauen wir uns die am Raumtemp. vor Änderungen an zwecks Debugging
my $ctemp = $firefox->find_id('uiNumDisplay:Roomtemp')->property('innerHTML');
print "Aktueller Wert aus FB Tatsaechliche Raumtemperatur: $ctemp\n";

# Wenn man nicht nach unten scrollt, sind die OK / ABBRECHEN Knöpfe verdeckt und können nicht geklickt werden
$firefox->async_script("window.scrollTo(0,document.body.scrollHeight);");
# Scrollen dauert manchmal einen kleinen Moment
sleep 1;
# Nochmal scrollen nur zur Sicherheit
$firefox->async_script("window.scrollTo(0,document.body.scrollHeight);");
sleep 1;

my $id;
if ($clicks{$device} == 0){
# Bei diesem Gerät ist der Offset schon OK eingestellt also Abbruch
$firefox->find_name('cancel')->click();
print "Click cancel\n";
} else {
if ($clicks{$device} < 0){
# "-" clicks um die Raumtemp zu verringern
$id = "uiNumDown:Roomtemp"
} else {
# "+" clicks um die Raumtemp zu erhöhen
$id = "uiNumUp:Roomtemp"
}
# Jetzt wird geklickt auf "-" oder "+" ($id)
for (my $x=1; $x <= abs($clicks{$device}); $x++){
$firefox->find_id("$id")->click();
print "Click $x\n";
# Debugging: Hier sieht man ob der Wert für Raumtemp auch wirklich geändert wurde
my $ctemp = $firefox->find_id('uiNumDisplay:Roomtemp')->property('innerHTML');
$ctemp =~ s/,/\./;
if (abs($ctemp - $fbdect_temp) >= 5){die "Grosse Temperaturdiff. FBECT/RAUMSENSOR. Hier stimmt was nicht."}
print "Aktueller Wert aus FB Tatsaechliche Raumtemperatur: $ctemp\n";
}
if ($testdrive == 1){
$firefox->find_name('cancel')->click();
print "FAKE Click OK (click cancel)\n";
} else {
# OK anklicken und den 15 Minuten Hinweis bestätigen
$firefox->find_id('uiApply')->click();
$firefox->accept_alert;
print "Click OK\n";
}
}
}

EDIT: Kleine Korrektur im Code 13.04.
EDIT: Debugging Ausgaben auf der Konsole besser verständlich gemacht 18.04.
« Letzte Änderung: 18 April 2021, 10:38:29 von Randybobandy »

Offline JoWiemann

  • Tester
  • Hero Member
  • ****
  • Beiträge: 3189
Antw:Offset Einstellung Fritz Dect 301
« Antwort #4 am: 20 April 2021, 14:13:36 »
Hallo,

ich habe keine Dect-Devices für meine FritzBox. Aber, würdest Du mal im Chrome/Edge die Entwicklertools (F12) aktivieren und auf den Reiter Netzwerk klicken. Wenn Du dann einen Wert änderst,bekommst Du dann in der Tabelle unter Name data.lua angezeigt. Mit klicken auf data.lua wird dann der Inhalt angezeigt. Wenn Du ganz nach unten scrollst wird der abgesetzte Befehl sichtbar.

Falls das alles zutrifft könnte man die Temp. Änderungen auch über das 72_FRITZBOX.pm machen.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Offline Randybobandy

  • New Member
  • *
  • Beiträge: 10
Antw:Offset Einstellung Fritz Dect 301
« Antwort #5 am: 21 April 2021, 14:51:54 »
Danke für den Tipp. Hier ein Beispiel der Ausgabe, wenn ich den Offset ändere. Also müsste es gehen oder? Dann hab ich mir die Mühe mit Marionette ja komplett umsonst gemacht.
1
sid: 123456789asgfafgasdf
lang: de
device: 16
view:
back_to_page: sh_dev
ule_device_name: Bad
Heiztemp: 19
Absenktemp: 17
graphState: 1
Holiday1StartDay: 21
Holiday1StartMonth: 4
Holiday1StartHour: 15
Holiday1EndDay: 5
Holiday1EndMonth: 5
Holiday1EndHour: 15
Holiday1Enabled: 0
Holiday1ID: 1
Holiday2StartDay: 21
Holiday2StartMonth: 4
Holiday2StartHour: 15
Holiday2EndDay: 5
Holiday2EndMonth: 5
Holiday2EndHour: 15
Holiday2Enabled: 0
Holiday2ID: 2
Holiday3StartDay: 21
Holiday3StartMonth: 4
Holiday3StartHour: 15
Holiday3EndDay: 5
Holiday3EndMonth: 5
Holiday3EndHour: 15
Holiday3Enabled: 0
Holiday3ID: 3
Holiday4StartDay: 21
Holiday4StartMonth: 4
Holiday4StartHour: 15
Holiday4EndDay: 5
Holiday4EndMonth: 5
Holiday4EndHour: 15
Holiday4Enabled: 0
Holiday4ID: 4
HolidayEnabledCount: 0
SummerStartDay: 1
SummerStartMonth: 5
SummerEndDay: 1
SummerEndMonth: 9
SummerEnabled: 0
WindowOpenTrigger: 4
WindowOpenTimer: 10
tempsensor: own
Roomtemp: 18.5
ExtTempsensorID: tochoose
Offset: -0.5
enabled: on
mailto:
apply:
oldpage: /net/home_auto_hkr_edit.lua

Offline JoWiemann

  • Tester
  • Hero Member
  • ****
  • Beiträge: 3189
Antw:Offset Einstellung Fritz Dect 301
« Antwort #6 am: 21 April 2021, 15:29:08 »
Versuch mach ...

Spiel doch mal die 72_FRITZBOX.pm von hier: https://forum.fhem.de/index.php/topic,118150.0.html ein.

Was mich irritiert ist die 1 vor sid:

Ansonsten musst Du jetzt etwas experimentieren.

Unter get findest Du den Befehl luaData. Die Eingabe formatierst Du nun aus der Rückmeldung wie folgt:

- der : wird durch Leerzeichen ersetzt
- der Zeilenumbruch wird durch Leerzeichen ersetzt
- ein fehlender Wert hinter dem Doppelpunkt wird durch nop gefüllt
- die sid Zeile wird nicht benötigt, da die sid durch das FritzBox Modul generiert wird

Bei Deiner Ausgabe würde sich folgendes Ergeben:
lang de device 16 view nop back_to_page sh_dev ule_device_name Bad Heiztemp 19 Absenktemp 17 graphState 1 Holiday1StartDay 21 Holiday1StartMonth 4 Holiday1StartHour 15 Holiday1EndDay 5 Holiday1EndMonth 5 Holiday1EndHour 15 Holiday1Enabled 0 Holiday1ID 1 Holiday2StartDay 21 Holiday2StartMonth 4 Holiday2StartHour 15 Holiday2EndDay 5 Holiday2EndMonth 5 Holiday2EndHour 15 Holiday2Enabled 0 Holiday2ID 2 Holiday3StartDay 21 Holiday3StartMonth 4 Holiday3StartHour 15 Holiday3EndDay 5 Holiday3EndMonth 5 Holiday3EndHour 15 Holiday3Enabled 0 Holiday3ID 3 Holiday4StartDay 21 Holiday4StartMonth 4 Holiday4StartHour 15 Holiday4EndDay 5 Holiday4EndMonth 5 Holiday4EndHour 15 Holiday4Enabled 0 Holiday4ID 4 HolidayEnabledCount 0 SummerStartDay 1 SummerStartMonth 5 SummerEndDay 1 SummerEndMonth 9 SummerEnabled 0 WindowOpenTrigger 4 WindowOpenTimer 10 tempsensor own Roomtemp 18.5 ExtTempsensorID tochoose Offset -0.5 enabled on mailto nop apply nop oldpage /net/home_auto_hkr_edit.lua

Leider gibt es Seiten, da muss man alle Parameter bei Änderungen mitgeben. Dann gibt es Seiten, da reicht es, wenn man die veränderten Parameter mitgibt.

Also einfach mal probieren.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM