59_Twilight.pm - Funktioniert seit dem 3.1.19 nicht mehr - Yahoo API Umstellung

Begonnen von JoWiemann, 04 Januar 2019, 09:25:53

Vorheriges Thema - Nächstes Thema

CoolTux

Ich habe mir noch mal das Modul angeschaut. Was die Verarbeitung von Wetterdaten an geht. Ohne externe Quelle brauch das Modul von Yahoo lediglich den Conditioncode um eine Faktorberechnung durch zu führen.
Darauf basiert dann
WEATHER_CORRECTION
WEATHER_HORIZON

Wenn man das extWeatherDevice nimmt dann brauch er nichts anseres berechnen sondern kann gleich diesen Wert nehmen.

Beides resultiert am ende in twilight_weather
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

acaliebe

Zitat von: CoolTux am 07 Januar 2019, 23:24:38
Ich habe mir noch mal das Modul angeschaut. Was die Verarbeitung von Wetterdaten an geht. Ohne externe Quelle brauch das Modul von Yahoo lediglich den Conditioncode um eine Faktorberechnung durch zu führen.
Darauf basiert dann
WEATHER_CORRECTION
WEATHER_HORIZON

Wenn man das extWeatherDevice nimmt dann brauch er nichts anseres berechnen sondern kann gleich diesen Wert nehmen.

Beides resultiert am ende in twilight_weather

Wenn ich das richtig verstehe fließt das aber nicht in die Zeitberechnung (für ss_weather/sr_weather) mit ein, sondern wirft nur das event "twilight_weather" (und setzt natürlich dessen Attribut). 

...
$twilight_weather = $twilight - int(0.007 * ($extWeatherHorizont ** 2)); ## SCM: 100% clouds => 30% light (rough estimation)
...
readingsBulkUpdate ($hash,  "twilight",              $twilight    );
readingsBulkUpdate ($hash,  "twilight_weather",      $twilight_weather    );
...


oder hab ich jetzt einen kompletten Denkfehler?


EDIT:

Wäre nicht als Quick&Dirty Lösung für das Dämmerungsensor-Timersetzen folgender kleiner Eingriff ok:

Beispiel:
Zitat von: 'telnet localhost 7072'fhem> list MyTwilight CONDITION
MyTwilight               1

fhem> list MyTwilight ss_weather
MyTwilight           2019-01-08 01:53:34    14:39:37

fhem> set MyTwilight condition 9
fhem> list MyTwilight ss_weather
MyTwilight           2019-01-08 01:54:31    15:05:25

Folgende Änderung an 59_Twilight.pm wäre nötig (!! quick and dirty. bitte nicht genau hinsehen - hab mir die Mathe von unten geklaut!! ):
Einsetzen vor "sub Twilight_Get($@)"
################################################################################
sub Twilight_Set($@) {
my ($hash, @a) = @_;

if ( $a[1] eq "condition" ) {
if ( ( $a[2] > -1 ) && ( $a[2] < 11 ) ) {
#my @faktor_cond_code = (10,10,10,10, 9, 7, 7, 7, 7, 7,
# 7, 5, 5, 5, 5, 7, 7, 5, 5, 5,
# 7, 5, 5, 5, 5, 5, 2, 4, 4, 2,
# 2, 0, 0, 0, 0, 5, 0, 8, 8, 8,
# 6, 8, 6, 5, 2, 5, 6, 6, 0, 0,
# 0);
$hash->{CONDITION} = ( 10 - $a[2] );
Log3 $hash, 1, "[$hash->{NAME}] Set (Sun-)Condition to [" . $hash->{CONDITION} . "] (Cloud-)Condition was = [" . $a[2] . "] and calculate Correction";
#$hash->{WEATHER_CORRECTION} = $faktor_cond_code[ $hash->{CONDITION} ] / 25 * 20; # Ändere "CORRECTION" über Korrekturtabelle @faktor_cond_code (original stuff)
$hash->{WEATHER_CORRECTION} = $hash->{CONDITION} / 25 * 20;
$hash->{WEATHER_HORIZON}    = $hash->{WEATHER_CORRECTION} + $hash->{INDOOR_HORIZON};
my $doy         = strftime("%j",localtime);
my $declination =  0.4095*sin(0.016906*($doy-80.086));
if($hash->{WEATHER_HORIZON} > (89-$hash->{LATITUDE}+$declination) ){
$hash->{WEATHER_HORIZON} =  89-$hash->{LATITUDE}+$declination;
}
Twilight_TwilightTimes($hash,"weather","");
Log3 $hash, 1, "[$hash->{NAME}] Force Recalculate after Condition changed.";
myRemoveInternalTimer       ("sunpos", $hash);
myInternalTimer             ("sunpos", time()+1,  "Twilight_sunpos", $hash, 0);
Log3 $hash, 1, "[$hash->{NAME}] SunPos-Update timer set to 1 second";
if ( $hash->{WEATHER} ne "" ) {
Log3 $hash, 1, "[$hash->{NAME}] WARNING: You have WebWeatherUpdates turned on. This makes no sense and will overwrite your Setting next automatic update. Please set the 4th field (apikey) empty at the object-definition in fhem.cfg";
}
} else {
Log3 $hash, 1, "[$hash->{NAME}] FEHLER: (set twilight condition ) Akzeptiert nur (Cloud-)Conditions zwischen 0 und 10 !";
}
} elsif (( $a[1] eq "update" ) || ( $a[1] eq "sunpos" ) || ( $a[1] eq "recalc" )) {
Twilight_TwilightTimes($hash,"weather","");
Log3 $hash, 1, "[$hash->{NAME}] Force Recalculate Condition";
myRemoveInternalTimer       ("sunpos", $hash);
myInternalTimer             ("sunpos", time()+1,  "Twilight_sunpos", $hash, 0);
Log3 $hash, 1, "[$hash->{NAME}] SunPos-Update timer set to 1 second";
} elsif ( $a[1] eq "webupdate" ) {
Log3 $hash, 1, "[$hash->{NAME}] Force Web-Update";
myRemoveInternalTimer("weather",$hash);
myInternalTimer    ("weather", (time()+1), "Twilight_WeatherTimerUpdate", $hash, 0);
Log3 $hash, 1, "[$hash->{NAME}] Web-Update timer set to 1 second";
} elsif ( ( $a[1] eq "?" ) or ( $a[1] eq "help" ) ) {
my $helptext = "[".$hash->{NAME}."-Set Hilfe]" . "Falls ein Daemmerungssensor anstatt OpenWeatherMap genutzt wird, kann man den aktuellen Bewoelkungswert setzen:\n\n";
$helptext .= "set ". $hash->{NAME} . " condition [0-10]   \n - Setzt die relativ gemessene Bewoelkung von 0 bis 10 - Hierbei sollte das Webupdate deaktiviert sein.\n" ;
$helptext .= "set ". $hash->{NAME} . " webupdate          \n - Fordert Twilight auf neue Wetterdaten von OpenWeatherMap zu holen\n" ;
$helptext .= "set ". $hash->{NAME} . " update             \n - Fordert Twilight auf alle Werte neu zu berechnen (wird beim setzen einer condition und alle 5 Minuten automatisch gemacht\n";
return("$helptext");
}

return();
}


Ein paar Zeilen vorher muss ...
# Consumer
  $hash->{DefFn}   = "Twilight_Define";
  $hash->{UndefFn} = "Twilight_Undef";
  $hash->{GetFn}   = "Twilight_Get"; 
  $hash->{AttrList}= "$readingFnAttributes " ."useExtWeather";
  return undef;

... um das SET erweitert werden auf:
# Consumer
  $hash->{DefFn}   = "Twilight_Define";
  $hash->{UndefFn} = "Twilight_Undef";
  $hash->{GetFn}   = "Twilight_Get";
  $hash->{SetFn}   = "Twilight_Set";
  $hash->{AttrList}= "$readingFnAttributes " ."useExtWeather";
  return undef;


und ca bei Zeile 430 muss in ...
sub Twilight_CreateHttpParameterAndGetData($$) {
  my ($myHash, $mode) = @_;
  my $hash = myGetHashIndirekt($myHash, (caller(0))[3]);
  return if (!defined($hash));

  my $location = $hash->{WEATHER};
  my $verbose  = AttrVal($hash->{NAME}, "verbose", 3 );

... noch ein return eingefügt werden:
sub Twilight_CreateHttpParameterAndGetData($$) {
  my ($myHash, $mode) = @_;
  my $hash = myGetHashIndirekt($myHash, (caller(0))[3]);
  return if (!defined($hash));

  return if ( $hash->{WEATHER} eq "" );

  my $location = $hash->{WEATHER};
  my $verbose  = AttrVal($hash->{NAME}, "verbose", 3 );



in der fhem.cfg könnte man nun folgendes tun:

define MyTwilight Twilight 50.300001 11.9000001 3
Die Objekt Definition OHNE 4. Parameter schreiben (das verhindert das Laden der Webseite - welche uns die Werte ja wieder verändern würde)

define TwilightSensor dummy
define TwilightSensor_notify_reading notify TwilightSensor:reading { fhem("set MyTwilight condition " . ReadingsVal("TwilightSensor","reading","5") ) ;; }

Als Reading Event Relais

Wenn nun also ein Dämmerungssensor sowas in der Art übergibt:
setreading TwilightSensor reading 9
... dann würde ss_weather und sr_weather komplett mit angepasst und als Timer neu gesetzt. (Vorsicht: Zuordnungen sind nur 0-10, nicht 0-100)


ist jetzt leider etwas ungetestet. Aber eventuell hilft es ja irgendwem.

acaliebe

Ok, Die aktuell (für Openweathermap) gepatchte Datei:

https://www.dropbox.com/s/t67fmv81ta2an2h/59_Twilight.pm?dl=0

Die Datei nach fhem/FHEM/59_Twilight.pm speichern.

* für das WebUpdate benötigt man einen API-Key von OpenWeatherMap https://home.openweathermap.org/users/sign_up und https://home.openweathermap.org/api_keys
* geht auch ohne WebUpdate, benötigt dann aber (mindestens einmalig) den aktuellen Dämmerungswert
* Aktuell nur Wolkenwert berücksichtigt (Kein Schnee/Hagel/Tornado)
* WolkenWert (Dämmerungswert) von 0-10 ... wird intern als Helligkeitswert invertiert gespeichert.
* Webupdate alle 20 Minuten
* set TwilightObjekt condition 4   - übergibt eine Manuelle condition (0-10)
* set TwilightObjekt webupdate   - aktualisiert sofort  (geschieht automatisch alle 20 minuten)
* set TwilightObjekt sunpos         - errechnet die aktuelle sonnenposition (geschieht automatisch alle 5 minuten)


Beispiel fhem.cfg MIT webupdate:
define MyTwilight Twilight 50.0000000 11.0000000 3 INSERTAPIKEYHERE123456

define TwilightLightOff at *{twilight("MyTwilight","sr_weather","07:00","09:00")} { Log 1, "Hier schaltet irgendwas frühestens 07:00 spätestens 09:00 aus" ;; }
define TwilightLightOn at *{twilight("MyTwilight","ss_weather","16:00","20:00")} { Log 1, "Hier schaltet irgendwas frühestens 16:00 spätestens 20:00 ein" ;; }


Beispiel fhem.cfg OHNE webupdate mit automatisierten oder imaginären Dämmerungswerten:
define MyTwilight Twilight 50.0000000 11.0000000 3

define TwilightSensor dummy
define TwilightSensor_notify_reading notify TwilightSensor:reading { Log 1, "Twilight-Sensor changed Value to " . ReadingsVal("TwilightSensor","reading","5") ;; fhem("set MyTwilight condition" . ReadingsVal("TwilightSensor","reading","5") ) ;; }

define TwilightLightOff at *{twilight("MyTwilight","sr_weather","07:00","09:00")} { Log 1, "Hier schaltet irgendwas frühestens 07:00 spätestens 09:00 aus" ;; }
define TwilightLightOn at *{twilight("MyTwilight","ss_weather","16:00","20:00")} { Log 1, "Hier schaltet irgendwas frühestens 16:00 spätestens 20:00 ein" ;; }

Ein Dämmerungswert (zwischen 0 und 10 ) kann dann übergeben werden (von Hand oder per Aktor) mit z.b.:
setreading TwilightSensor reading 2
... oder direkt ohne Sensor-Umweg ...
set MyTwilight condition 2


Ich möchte darauf hinweisen, das dies nur eine vorrübergehende (gepatchte) Lösung ist. (und hoffe das sie überhaupt funktioniert ;) )

eisman

Hi,

nur mal so eine frage,

wenn man da etwas ändert, wäre es nicht gut die Geo Daten (longitude,latitude) aus global zunehmen

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

acaliebe

Zitat von: eisman am 08 Januar 2019, 14:50:25
Hi,

nur mal so eine frage,

wenn man da etwas ändert, wäre es nicht gut die Geo Daten (longitude,latitude) aus global zunehmen

gruss

Du müsstest in 59_Twilight.pm (ca Zeile 130) den Absatz ersetzen durch:
  my $latitude;
  my $longitude;
  my $name      = $a[0];
  if ( ($a[2] eq "global" ) && ( $attr{global}{latitude} ne "" ) ) {
$latitude = $attr{global}{latitude};
    if($latitude >  90){$latitude =  90;}
    if($latitude < -90){$latitude = -90;}
Log3 $hash, 1, "Automatic using Global Latitude from Fhem [" . $latitude ."]";
  } elsif ($a[2] =~ /^[\+-]*[0-9]*\.*[0-9]*$/ && $a[2] !~ /^[\. ]*$/ ) {
     $latitude  = $a[2];
    if($latitude >  90){$latitude =  90;}
    if($latitude < -90){$latitude = -90;}
}else{
     return "Argument Latitude is not a valid number [" . $a[2] . "]";
  }

  if ( ( $a[3] eq "global" ) && ( $attr{global}{longitude} ne "" ) ) {
     $longitude  = $attr{global}{longitude};
    if($longitude >  180){$longitude =  180;}
    if($longitude < -180){$longitude = -180;} 
Log3 $hash, 1, "Automatic using Global Latitude from Fhem [" . $longitude ."]";
  } elsif ($a[3] =~ /^[\+-]*[0-9]*\.*[0-9]*$/ && $a[3] !~ /^[\. ]*$/ ) {
     $longitude  = $a[3];
    if($longitude >  180){$longitude =  180;}
    if($longitude < -180){$longitude = -180;}
}else{
     return "Argument Longitude is not a valid number [" . $a[3] . "]";
  }


dann kannst du das objekt folgendermaßen definieren:
define MyTwilight Twilight global global 9 APIKEY

... anders geht es auf die schnelle leider nicht, da die Optionen durchnummeriert sind.

CoolTux

Sicherlich meinst Du es nur gut, aber können wir das bitte lassen. Wer soll bitte Deinen kleinen Code supporten, die User werden fragen wenn was nicht geht und du bist dann irgendwann weg.
Es sind bereits die richtigen Leute dabei Abhilfe zu schaffen, das dauert aber nun mal etwas.
Twilight arbeitet ganz normal auch ohne Yahoo. Habt bitte Geduld.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

rabehd

Zitat von: eisman am 08 Januar 2019, 14:50:25
Hi,

nur mal so eine frage,

wenn man da etwas ändert, wäre es nicht gut die Geo Daten (longitude,latitude) aus global zunehmen

gruss

Ja, wenn im Device keine angegeben.
Nein, weil ich die Zeiten von anderen Orten auch brauche -> Aquarium!
Auch funktionierende Lösungen kann man hinterfragen.


eisman

Zitat von: CoolTux am 08 Januar 2019, 15:21:58
Sicherlich meinst Du es nur gut, aber können wir das bitte lassen. Wer soll bitte Deinen kleinen Code supporten, die User werden fragen wenn was nicht geht und du bist dann irgendwann weg.
Es sind bereits die richtigen Leute dabei Abhilfe zu schaffen, das dauert aber nun mal etwas.
Twilight arbeitet ganz normal auch ohne Yahoo. Habt bitte Geduld.

es war eigentlich nur eine Idee, es wie bei Astro zumachen, und kein muss,
es werden je einige Sachen in FHEM vereinheitlicht (Batterie usw.) und es wäre dazu, ja ein guter Zeitpunkt.
wenn nicht, ist es ja auch nicht so schlimme. Da das Problem mit Yahoo ja schon das 2. mal auftritt und
andere Anbieter nachziehen, habe ich mich entschieden die meisten Daten über eigene Sensoren zu erfassen.
einzige was noch bleibt ist die Vorschau. die ich teilweise über DWD abdecke....

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian, Homematic,ZigBee         / 1X Raspberry, ConBee / 5x ESP
1x FHEM Debian,MQTT                               / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

heikoh81

Zitat von: CoolTux am 08 Januar 2019, 15:21:58
Twilight arbeitet ganz normal auch ohne Yahoo. Habt bitte Geduld.

Ich verwende twilight ausschließlich offline für die astronomische Berechnung von sunset und sunrise aus den Geo-Koordinaten.
Ich benötige keine Berücksichtigung von Bewölkung, da ich die IST-Helligkeit ohnehin aus den Homematic-Bewegungsmeldern nutze.

Wie bekomme ich denn die Fehlermeldungen weg, die seit der Abschaltung von yahoo mein log fluten?
Oder anders gefragt: kann man twilight in einen Offline-Modus schalten?

2019.01.07 00:11:01 3: [myTwilight] got no weather info from yahoo. Error code: gethostbyname query.yahooapis.com failed
2019.01.07 00:11:01 3: [myTwilight] 12 attempt(s) needed got NO valid weather data from yahoo


Viele Grüße,
Heiko

Christoph Morrison

Zitat von: heikoh81 am 08 Januar 2019, 21:24:45
Oder anders gefragt: kann man twilight in einen Offline-Modus schalten?

Eigentlich sollte es reichen keine Yahoo-ID anzugeben. Hast du denn eine angegeben?

yersinia

@heikoh81: du kannst temporär (solange bis die YahooAPI sache durch ist) das attribut verbose auf 2 setzen, dann verschwinden die Log Einträge.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

heikoh81

Danke für eure Antworten.
attr verbose 2 habe ich gesetzt - wenn der Log nicht mehr gefüllt wird, für mich ok.

Ich habe keine Yahoo API angegeben, weil ich das eigentlich nie wollte und gebraucht habe (nur offline-Astro-Daten).
Seit ein paar Jahren steuert der Helligkeitswert meine Beleuchtung, aber die Astro-Zeiten setze ich noch für die Rolläden etc. ein.

Christoph Morrison

#43
Zitat von: heikoh81 am 09 Januar 2019, 21:27:21
Ich habe keine Yahoo API angegeben, weil ich das eigentlich nie wollte und gebraucht habe (nur offline-Astro-Daten).
Seit ein paar Jahren steuert der Helligkeitswert meine Beleuchtung, aber die Astro-Zeiten setze ich noch für die Rolläden etc. ein.

Interessant. Dann sollte Twilight nämlich auch keinen Anfragen bei Yahoo machen / keine entsprechenden Logs erzeugen. Hab's mal als Bug aufgenommen.

Kannst du mir ein List vom Device geben?

mi.ke

Moin,

ich hatte mich gerade gewundert, warum mein Twilight ohne Probleme noch funktioniert.

Ich hatte meine erste historische fhem Installation auf einem RPi1. Dieser klebt seit 5-6 Jahren im Büro unter dem Schreibtisch und dient ausschließlich zum sammeln von Umweltdaten via HTTPMOD (zum Teil sogar aus dem Videotext).
Verbunden über fhem2fhem versorgt er brav, zuverlässig und schon ewig (seit 2016) nicht mehr aktuallisiert seinen Dienst.

Die Umstellung auf API hat er wohl auch verpasst, deshalb läuft noch eine alte Twilight-Version:
59_Twilight.pm            12153 2016-09-12 22:01:24Z dietmar63

Die macht allerdings immernoch was sie soll . . .

Bug oder feature?

Cheers
mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara