Offset Einstellung Fritz Dect 301

Begonnen von Pocki90, 22 Januar 2019, 15:59:44

Vorheriges Thema - Nächstes Thema

Pocki90

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

rudolfkoenig

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.

Pocki90

Vielen Dank für die Antwort. Dann muss ich es jetzt erstmal anders lösen und hoffen, das AVM irgendwann seine API erweitert.

Randybobandy

#3
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.

JoWiemann

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

Randybobandy

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

JoWiemann

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

tobi1049

Hallo,

ich habe mich in den letzten Tagen auch mal mit diesem Thema beschäftigt und einen Weg gefunden, der Fritzbox die notwendigen Parameter für einen get luaData Aufruf zur Änderung des Offsets zu entlocken. Mit zwei get luaData Aufrufen und parsen der Antworten erhalte ich nun folgenden String:

xhr 1 device 17 view nop back_to_page /smarthome/devices.lua ule_device_name Wohnzimmer(#2) hkr_adaptheat 1 Heiztemp 20,0 Absenktemp 16,0 graphState nop timer_item_0 0800;1;64 timer_item_1 2300;0;64 timer_item_2 0600;1;1 timer_item_3 2200;0;1 timer_item_4 0600;1;2 timer_item_5 2200;0;2 timer_item_6 0600;1;4 timer_item_7 2200;0;4 timer_item_8 0600;1;8 timer_item_9 2200;0;8 timer_item_10 0600;1;16 timer_item_11 2200;0;16 timer_item_12 0800;1;32 timer_item_13 2300;0;32 Holiday1StartDay 31 Holiday1StartMonth 12 Holiday1StartHour 17 Holiday1EndDay 14 Holiday1EndMonth 01 Holiday1EndHour 17 Holiday1Enabled 0 Holiday1ID 1 Holiday2StartDay 31 Holiday2StartMonth 12 Holiday2StartHour 17 Holiday2EndDay 14 Holiday2EndMonth 01 Holiday2EndHour 17 Holiday2Enabled 0 Holiday2ID 2 Holiday3StartDay 31 Holiday3StartMonth 12 Holiday3StartHour 17 Holiday3EndDay 14 Holiday3EndMonth 01 Holiday3EndHour 17 Holiday3Enabled 0 Holiday3ID 3 Holiday4StartDay 31 Holiday4StartMonth 12 Holiday4StartHour 17 Holiday4EndDay 14 Holiday4EndMonth 01 Holiday4EndHour 17 Holiday4Enabled 0 Holiday4ID 4 HolidayEnabledCount 0 SummerStartDay 15 SummerStartMonth 05 SummerEndDay 15 SummerEndMonth 09 SummerEnabled 1 WindowOpenTrigger 12 WindowOpenTimer 10 tempsensor own Roomtemp 19 ExtTempsensorID tochoose Offset -4.0 enabled on mailto nop apply nop lang de page home_auto_hkr_edit
Jetzt gibt es aber ein Problem:
Gebe ich den obigen String als Paramter über die Eingabemaske des Fritzbox-Moduls für den get luaData Befehl ein, funktioniert es wie gewünscht, aber nicht, wenn der Befehl über die Kommandozeile oder aus einer Perl-Routine mittels fhem("...") aufgerufen wird.
Im Fehlerfall wird der Parameterstring offenbar nach timer_item_0 0800 abgeschnitten.

Gibt es irgendeinen Unterschied zwischen den Aufrufen über die Eingabemaske und dem über die Kommandozeile?

JoWiemann

Zitat von: tobi1049 am 01 Januar 2024, 11:47:32Hallo,

ich habe mich in den letzten Tagen auch mal mit diesem Thema beschäftigt und einen Weg gefunden, der Fritzbox die notwendigen Parameter für einen get luaData Aufruf zur Änderung des Offsets zu entlocken. Mit zwei get luaData Aufrufen und parsen der Antworten erhalte ich nun folgenden String:

xhr 1 device 17 view nop back_to_page /smarthome/devices.lua ule_device_name Wohnzimmer(#2) hkr_adaptheat 1 Heiztemp 20,0 Absenktemp 16,0 graphState nop timer_item_0 0800;1;64 timer_item_1 2300;0;64 timer_item_2 0600;1;1 timer_item_3 2200;0;1 timer_item_4 0600;1;2 timer_item_5 2200;0;2 timer_item_6 0600;1;4 timer_item_7 2200;0;4 timer_item_8 0600;1;8 timer_item_9 2200;0;8 timer_item_10 0600;1;16 timer_item_11 2200;0;16 timer_item_12 0800;1;32 timer_item_13 2300;0;32 Holiday1StartDay 31 Holiday1StartMonth 12 Holiday1StartHour 17 Holiday1EndDay 14 Holiday1EndMonth 01 Holiday1EndHour 17 Holiday1Enabled 0 Holiday1ID 1 Holiday2StartDay 31 Holiday2StartMonth 12 Holiday2StartHour 17 Holiday2EndDay 14 Holiday2EndMonth 01 Holiday2EndHour 17 Holiday2Enabled 0 Holiday2ID 2 Holiday3StartDay 31 Holiday3StartMonth 12 Holiday3StartHour 17 Holiday3EndDay 14 Holiday3EndMonth 01 Holiday3EndHour 17 Holiday3Enabled 0 Holiday3ID 3 Holiday4StartDay 31 Holiday4StartMonth 12 Holiday4StartHour 17 Holiday4EndDay 14 Holiday4EndMonth 01 Holiday4EndHour 17 Holiday4Enabled 0 Holiday4ID 4 HolidayEnabledCount 0 SummerStartDay 15 SummerStartMonth 05 SummerEndDay 15 SummerEndMonth 09 SummerEnabled 1 WindowOpenTrigger 12 WindowOpenTimer 10 tempsensor own Roomtemp 19 ExtTempsensorID tochoose Offset -4.0 enabled on mailto nop apply nop lang de page home_auto_hkr_edit
Jetzt gibt es aber ein Problem:
Gebe ich den obigen String als Paramter über die Eingabemaske des Fritzbox-Moduls für den get luaData Befehl ein, funktioniert es wie gewünscht, aber nicht, wenn der Befehl über die Kommandozeile oder aus einer Perl-Routine mittels fhem("...") aufgerufen wird.
Im Fehlerfall wird der Parameterstring offenbar nach timer_item_0 0800 abgeschnitten.

Gibt es irgendeinen Unterschied zwischen den Aufrufen über die Eingabemaske und dem über die Kommandozeile?


Hallo,

poste doch bitte einmal Deine Aufrufe.

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

JoWiemann

Zitat von: tobi1049 am 01 Januar 2024, 11:47:32Hallo,

ich habe mich in den letzten Tagen auch mal mit diesem Thema beschäftigt und einen Weg gefunden, der Fritzbox die notwendigen Parameter für einen get luaData Aufruf zur Änderung des Offsets zu entlocken. Mit zwei get luaData Aufrufen und parsen der Antworten erhalte ich nun folgenden String:

xhr 1 device 17 view nop back_to_page /smarthome/devices.lua ule_device_name Wohnzimmer(#2) hkr_adaptheat 1 Heiztemp 20,0 Absenktemp 16,0 graphState nop timer_item_0 0800;1;64 timer_item_1 2300;0;64 timer_item_2 0600;1;1 timer_item_3 2200;0;1 timer_item_4 0600;1;2 timer_item_5 2200;0;2 timer_item_6 0600;1;4 timer_item_7 2200;0;4 timer_item_8 0600;1;8 timer_item_9 2200;0;8 timer_item_10 0600;1;16 timer_item_11 2200;0;16 timer_item_12 0800;1;32 timer_item_13 2300;0;32 Holiday1StartDay 31 Holiday1StartMonth 12 Holiday1StartHour 17 Holiday1EndDay 14 Holiday1EndMonth 01 Holiday1EndHour 17 Holiday1Enabled 0 Holiday1ID 1 Holiday2StartDay 31 Holiday2StartMonth 12 Holiday2StartHour 17 Holiday2EndDay 14 Holiday2EndMonth 01 Holiday2EndHour 17 Holiday2Enabled 0 Holiday2ID 2 Holiday3StartDay 31 Holiday3StartMonth 12 Holiday3StartHour 17 Holiday3EndDay 14 Holiday3EndMonth 01 Holiday3EndHour 17 Holiday3Enabled 0 Holiday3ID 3 Holiday4StartDay 31 Holiday4StartMonth 12 Holiday4StartHour 17 Holiday4EndDay 14 Holiday4EndMonth 01 Holiday4EndHour 17 Holiday4Enabled 0 Holiday4ID 4 HolidayEnabledCount 0 SummerStartDay 15 SummerStartMonth 05 SummerEndDay 15 SummerEndMonth 09 SummerEnabled 1 WindowOpenTrigger 12 WindowOpenTimer 10 tempsensor own Roomtemp 19 ExtTempsensorID tochoose Offset -4.0 enabled on mailto nop apply nop lang de page home_auto_hkr_edit
Jetzt gibt es aber ein Problem:
Gebe ich den obigen String als Paramter über die Eingabemaske des Fritzbox-Moduls für den get luaData Befehl ein, funktioniert es wie gewünscht, aber nicht, wenn der Befehl über die Kommandozeile oder aus einer Perl-Routine mittels fhem("...") aufgerufen wird.
Im Fehlerfall wird der Parameterstring offenbar nach timer_item_0 0800 abgeschnitten.

Gibt es irgendeinen Unterschied zwischen den Aufrufen über die Eingabemaske und dem über die Kommandozeile?


Hallo,

wie rufst Du fhem(...) auf. Mit "", also fhem("get ...") oder mit '', also fhem('get ...')? Bei "" finden ggf Zeichenersetzungen statt. Probier also bitte einmal fhem('get ...').

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

tobi1049

#10
Ich habe beide Varianten probiert, leider kein Unterschied.

Eigentliches Ziel ist es, durch ein NOTIFY folgende Funktion auzurufen:

sub setFBDECToffset($$$)
{
  my ($devName,$FBdev,$newOffset) = @_;
  my $ret = 0;
  my $actOffset;

  ($actOffset) = (ReadingsVal($devName,"tempadjust",0) =~ /([+-?][0-9.]*)/);
  ($newOffset) = ($newOffset =~ /([+-?][0-9.]*)/);    # remove any text

  if( $actOffset != $newOffset ) {
    my $devID = ReadingsVal($devName,"ID",0);

    if( $devID != 0 ) {
      my $arguments = getFBDECTsettings($devID, $FBdev);

      # set newOffset in arguments
      $arguments =~ s/(Offset) ([+-?][0-9.]*)/$1 $newOffset/gm;

      # write newOffset to device
      #$ret = fhem("get $FBdev luaData $arguments");            # Variante mit "
      $ret = fhem('get ' . $FBdev . ' luaData ' . $arguments);  # Variante mit '
    }
  }

  return $ret;
}


Getestet habe ich die Funktion über einen Aufruf in der Kommandozeile:
{ setFBDECToffset("FBDECT_301_Wohnzimmer","meineFritzBox","-5.0 C") }Darauf kam folgende Antwort:
Result of data = 'xhr' => '1'
'device' => '$devID'
'view' => ''
'back_to_page' => '/smarthome/devices.lua'
'ule_device_name' => 'Wohnzimmer(#2)'
'hkr_adaptheat' => '1'
'Heiztemp' => '20,0'
'Absenktemp' => '16,0'
'graphState' => ''
'timer_item_0' => '0800'

----------------------------------------------------------------------
$VAR1 = {
          'pid' => 'overview',
          'data' => { ...
             
                    },
          'time' => [],
          'timeTillLogout' => '1200',
          'sid' => 'ff19651af3add3de'
        };

Unknown command 1, try help.
Unknown command 64, try help.
Unknown command 64, try help.
Unknown command 1, try help.
Unknown command 1, try help.
Unknown command 1, try help.
Unknown command 1, try help.
Unknown command 2, try help.
Unknown command 2, try help.
Unknown command 1, try help.
Unknown command 4, try help.
Unknown command 4, try help.
Unknown command 1, try help.
Unknown command 8, try help.
Unknown command 8, try help.
Unknown command 1, try help.
Unknown command 16, try help.
Unknown command 16, try help.
Unknown command 1, try help.
Unknown command 32, try help.
Unknown command 32, try help.


Weil das nicht funktionierte, habe ich den direkten Aufruf über die Kommandozeile probiert um auszuschließen, dass es möglicherweise mit der Funktion getFBDECTsettings() zu tun hat, die mir die Parameter liefert:
{ fhem("get meineFritzBox luaData xhr 1 device 17 view nop back_to_page /smarthome/devices.lua ule_device_name Wohnzimmer(#2) hkr_adaptheat 1 Heiztemp 20,0 Absenktemp 16,0 graphState nop timer_item_0 0800;1;64 timer_item_1 2300;0;64 timer_item_2 0600;1;1 timer_item_3 2200;0;1 timer_item_4 0600;1;2 timer_item_5 2200;0;2 timer_item_6 0600;1;4 timer_item_7 2200;0;4 timer_item_8 0600;1;8 timer_item_9 2200;0;8 timer_item_10 0600;1;16 timer_item_11 2200;0;16 timer_item_12 0800;1;32 timer_item_13 2300;0;32 Holiday1StartDay 31 Holiday1StartMonth 12 Holiday1StartHour 17 Holiday1EndDay 14 Holiday1EndMonth 01 Holiday1EndHour 17 Holiday1Enabled 0 Holiday1ID 1 Holiday2StartDay 31 Holiday2StartMonth 12 Holiday2StartHour 17 Holiday2EndDay 14 Holiday2EndMonth 01 Holiday2EndHour 17 Holiday2Enabled 0 Holiday2ID 2 Holiday3StartDay 31 Holiday3StartMonth 12 Holiday3StartHour 17 Holiday3EndDay 14 Holiday3EndMonth 01 Holiday3EndHour 17 Holiday3Enabled 0 Holiday3ID 3 Holiday4StartDay 31 Holiday4StartMonth 12 Holiday4StartHour 17 Holiday4EndDay 14 Holiday4EndMonth 01 Holiday4EndHour 17 Holiday4Enabled 0 Holiday4ID 4 HolidayEnabledCount 0 SummerStartDay 15 SummerStartMonth 05 SummerEndDay 15 SummerEndMonth 09 SummerEnabled 1 WindowOpenTrigger 12 WindowOpenTimer 10 tempsensor own Roomtemp 19 ExtTempsensorID tochoose Offset -4.0 enabled on mailto nop apply nop lang de page home_auto_hkr_edit") }
Auch hier macht es keinen Unterschied, ob " oder ' verwendent wird.


JoWiemann

Hallo,

da ich selber kein Smarthome Equipment von AVM habe ist es schwierig Dir hier weiter zu helfen, da ich Deine Versuche nicht nachstellen kann. Ein kurzes suchen für einen DECT 301 zeigt mir nur Treffer, die mir für einen Test zu teuer sind.

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

tobi1049

Zitat von: JoWiemann am 01 Januar 2024, 20:00:46Hallo,

da ich selber kein Smarthome Equipment von AVM habe ist es schwierig Dir hier weiter zu helfen, da ich Deine Versuche nicht nachstellen kann. Ein kurzes suchen für einen DECT 301 zeigt mir nur Treffer, die mir für einen Test zu teuer sind.

Grüße Jörg

Kein Problem.
Ich vermute, dass es irgendeine Kleinigkeit ist.
Das Problem ist offenbar das ';' in den timer_item_x Parameter. Ersetze ich es durch ein anderes z.B. ','  oder '%3B' wird die Anfrage komplett übertragen, nur quittiert die Fritzbox dann nicht das apply, sondern liefert das HTML für die Einstellungsseite.
Ich werde noch etwas weiter tüfteln...

Danke für deine Mühe bis hierher.




JoWiemann

Zitat von: tobi1049 am 01 Januar 2024, 20:51:59Kein Problem.
Ich vermute, dass es irgendeine Kleinigkeit ist.
Das Problem ist offenbar das ';' in den timer_item_x Parameter. Ersetze ich es durch ein anderes z.B. ','  oder '%3B' wird die Anfrage komplett übertragen, nur quittiert die Fritzbox dann nicht das apply, sondern liefert das HTML für die Einstellungsseite.
Ich werde noch etwas weiter tüfteln...

Danke für deine Mühe bis hierher.

Guten Morgen,

hast Du schon mal einen \ vor dem ; versucht?

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

tobi1049

Zitat von: JoWiemann am 02 Januar 2024, 07:24:04hast Du schon mal einen \ vor dem ; versucht?

Ja, dann gibt es folgende Antwort:
Result of data = 'xhr' => '1'
'device' => '$devID'
'view' => ''
'back_to_page' => '/smarthome/devices.lua'
'ule_device_name' => 'Wohnzimmer(#2)'
'hkr_adaptheat' => '1'
'Heiztemp' => '20,0'
'Absenktemp' => '16,0'
'graphState' => ''
'timer_item_0' => '0800\'

----------------------------------------------------------------------
$VAR1 = {
          'pid' => 'overview',
          'data' => { ...
             
                    },
          'time' => [],
          'timeTillLogout' => '1200',
          'sid' => 'ff19651af3add3de'
        };

Unknown command 1\, try help.
Unknown command 64, try help.
Unknown command 0\, try help.
Unknown command 64, try help.
Unknown command 1\, try help.
Unknown command 1, try help.
Unknown command 0\, try help.
Unknown command 1, try help.
Unknown command 1\, try help.
Unknown command 2, try help.
Unknown command 0\, try help.
Unknown command 2, try help.
Unknown command 1\, try help.
Unknown command 4, try help.
Unknown command 0\, try help.
Unknown command 4, try help.
Unknown command 1\, try help.
Unknown command 8, try help.
Unknown command 0\, try help.
Unknown command 8, try help.
Unknown command 1\, try help.
Unknown command 16, try help.
Unknown command 0\, try help.
Unknown command 16, try help.
Unknown command 1\, try help.
Unknown command 32, try help.
Unknown command 0\, try help.
Unknown command 32, try help.

Aber auf diese Frage habe ich jetzt eine Antwort:
Zitat von: tobi1049 am 01 Januar 2024, 11:47:32Gibt es irgendeinen Unterschied zwischen den Aufrufen über die Eingabemaske und dem über die Kommandozeile?
Über die Eingabemaske erfolgt der get luaData Aufruf über einen HTTP-Request. In diesem Fall ist dann der Parameterstring komplett uri_encoded, doch bringt mich das nicht wirklich weiter.
Im Modul 72_FRITZBOX.pm kommt der Parameterstring nämlich wieder uri_decoded in der Funktion FRITZBOX_Get an.