[36_Senec.pm] FHEM module zur Integration eines SENEC Speicher und MeinSenec

Begonnen von carlos, 12 November 2021, 15:22:44

Vorheriges Thema - Nächstes Thema

HGButte

Zitat von: cnkru am 19 Oktober 2025, 07:56:02Hallo Hubert und Uwe,

ich habe die neue Version V2.20.2 neben meiner 2. stufigen Python-Variante installiert
und bin auf folgendes Problem gestoßen.
Ich habe freeze-Einträge mit hohen Werten im System (siehe Bild).
Das Intervall der V2.20.2 beträgt jetzt 2,5 Stunden - vorher jede Stunde dann waren es noch mehr freeze Einträge.
Ich weiß, das der API-Aufruf manchmal 3 bis 4 Sekunden dauert - je nach Laune ....
Gibt es eine Idee die Abfragen - asynchron oder im Hintergrund - zu starten?
1 - 2025-10-15_[Log]: s:20:35:57 e:20:36:06 f:9.22 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-16_[Log]: s:01:27:37 e:01:27:45 f:8.553 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-16_[Log]: s:03:35:00 e:03:35:03 f:3.156 d:tmr-at_Exec(at_zwave_fix)

1 - 2025-10-16_[Log]: s:06:19:17 e:06:19:25 f:8.622 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-16_[Log]: s:11:10:57 e:11:11:05 f:8.53 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-16_[Log]: s:16:02:37 e:16:02:45 f:8.948 d:tmr-SYSMON_Update(sysmon) tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-16_[Log]: s:20:54:17 e:20:54:25 f:8.558 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-17_[Log]: s:01:45:57 e:01:46:05 f:8.306 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-17 _[Log]: s:03:35:00 e:03:35:03 f:3.142 d:tmr-ZWave_wakeupTimer(Thermostat_WZ) tmr-at_Exec(at_zwave_fix)

1 - 2025-10-17_[Log]: s:06:37:37 e:06:37:46 f:9.57 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-17_[Log]: s:11:29:17 e: 11:29:25 f:8.795 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-17_[Log]: s:16:20:57 e: 16:21:05 f:8.501 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-17_[Logl: s:21:12:37 e:21:12:45 f:8.594 d:tmr-ZWave_wakeup Timer(Thermostat_Bad) tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-18_[Log]: s:02:04:17 e:02:04:25 f:8.331 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-18_[Log]: s:06:55:57 e:06:56:05 f:8.477 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-18_[Log]: s:11:47:37 e:11:47:45 f:8.369 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-18_[Log]: s:16:39:17 e: 16:39:26 f:9.273 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-18_[Log]: s:21:30:57 e:21:31:05 f:8.404 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-19_[Log]: s:02:22:37 e:02:22:45 f:8.53 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

1 - 2025-10-19_[L0g]: s:07:14:17 e:07:14:25 f:8.539 d:tmr-FHEM::Senec::periodicCallLocal(N/A)

LG
C.K.

Das Problem habe ich. Daher habe ich das Senec Modul vor einiger Zeit auf einen separaten FHEM umgezogen wo das nicht stört.

@Hubert schaust du dir das an?
Ansonsten würde ich mir das demnächst mal anschauen.

carlos

Also ich habe die Abfragen alle mit HttpUtils_NonblockingGet implementiert, außer dem initial connect.
Von daher kann ich nicht beurteilen woher die freezes kommen.
Da sind ja auch noch andere mit dabei, von daher tippe ich mal auf ein Netzwerk Problem.
Aber das läßt sich so aus der Ferne nicht analysieren.
Ich denke nicht das das am modul liegt.

Gruß

Hubert
FHEM svn auf Intel NUC mit proxmox, 3 Raspberry Pi, signalduino, nanoCUL,  toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

HGButte

2025.11.04 05:41:43.628 1: PERL WARNING: Use of uninitialized value $loginUrl in index at ./FHEM/36_Senec.pm line 2230.
2025.11.04 05:41:43.630 1: PERL WARNING: Use of uninitialized value $loginUrl in substr at ./FHEM/36_Senec.pm line 2238.
2025.11.04 05:42:44.251 2: Senec::Cloud - Token refresh failed: 503 Service Temporarily Unavailable
2025.11.04 05:42:44.254 1: [FHEM::Senec::getSenecApiToken] no token present
2025.11.04 05:42:44.281 1: [FHEM::Senec::getSenecApiToken] no token present
2025.11.04 05:42:44.288 1: PERL WARNING: Use of uninitialized value $FHEM::Senec::data in concatenation (.) or string at ./FHEM/36_Senec.pm line 3061.
2025.11.04 05:42:44.290 2: [FHEM::Senec::SenecApi_getMeasurementsV2] No TOKEN from API connect:  -
2025.11.04 05:42:44.304 1: [FHEM::Senec::getSenecApiToken] no token present
2025.11.04 05:42:44.311 2: [FHEM::Senec::SenecApi_getMeasurementsV2] No TOKEN from API connect:  -
2025.11.04 05:42:44.316 1: [FHEM::Senec::getSenecApiToken] no token present
2025.11.04 05:42:44.323 2: [FHEM::Senec::SenecApi_getMeasurementsV2] No TOKEN from API connect:  -
2025.11.04 05:43:48.648 1: [FHEM::Senec::getSenecApiToken] no token present


Mir ist gerade aufgefallen dass bei mir seit 04.11. Token Probleme aufgetreten sind und somit keine Daten von der Senec Api kommen.

Ein Neustart des FHEM hat bei mir erstmal geholfen.

Ich werde mir das mal anschauen.

Uwe Ernst

Hallo HGButte
Das gleiche Problem hatte ich vor ca. 2 Wochen nach einem längeren Internetausfall für mehrere Stunden. Fhem Neustart hat alles wieder zum Laufen gebracht.
Sonst keine Probleme.

HGButte

V2.20.4

Muss mich immer noch ein wenig in das Perl Thema einarbeiten...
Habe jetzt das Fehlerhandling beim Verbindungsaufbau und Refreshen des Tokens nochmal überarbeitet.


curiosus

Hallo,

ich habe nach längerer Abstinenz kürzlich begonnen, dieses Model wieder einzusetzen.
Nachdem ich zwei Wallboxen habe, hatte früher für mich selbst den Code entsprechend abgewandelt, um auch die Daten der zweiten Wallbox anzuzeigen. Das ist bekanntermaßen problembehaftet und rächt sich natürlich, sobald eine neue Version zum Einsatz gebracht werden soll.
Ist den in Zukunft daran gedacht, eine weitere Wallbox im Modul zu implementieren?

Daneben habe ich ein weiteres Problem, denn ich würde gerne dieses Modul auch dazu verwenden via API die Wallbox zu aktivieren/deaktivieren (Stromtarif mit vergünstigter Lademöglichkeit zwischen 00:00 und 06:00 Uhr). Eine manuelle Schaltung via App ist natürlich maximal die zweitbeste Lösung. Wenn ich das richtig sehe, wird im Modul angeboten, dies über

set <device> wallboxConfiguration LOCKED
zu erreichen (nebenbei ist auch fraglich, ob dieser setter ein toggle ist, der an- und abschalten kann).
Das funktioniert aber leider nicht und ich erhalte als Fehlermeldung

2025-11-14 16:45:55 Senec senecAPI wallboxConfiguration LOCKED
2025-11-14 16:45:55 Senec senecAPI ERROR: invalid status code: 400
2025-11-14 16:45:55 Senec senecAPI lastUpdateAPI: 2025-11-14 16:45:55
2025-11-14 16:45:55 Senec senecAPI stateAPI: wallbox call failed

Vielleicht habe ich da etwas falsch gemacht und ein kleiner Stups in die richtige Richtung würde mir vielleicht weiterhelfen...

Schon mal vorab vielen Dank dafür!

Grüße
Klaus
NUC | Fronthem/Smartvisu | Nextcloud | DBLog | Grafana | div. HM Akt-/Sensoren | ESP8266/32 | 1-Wire | Shelly | WH1000 | PWM-PWMR | Xiaomi | MQTT | CarConnectivity-MQTT | Luftsensor.info | Alexa | iRobots | Zigbee | HUE | SENEC Bat+Wallbox | Zoneminder | Fritz!/Box/Fon/Repeater

HGButte

Hallo Klaus,

Ich bediene mich gerne bei den Kollegen von Home Assistant.

Scheinbar ist die API in der Richtung jetzt etwas anders.

        self.APP_WALLBOX_SEARCH     = APP_WALLBOX_BASE_URL + "/v1/systems/wallboxes/search"
        self.APP_SET_WALLBOX_LOCK   = APP_WALLBOX_BASE_URL + "/v1/systems/{master_plant_id}/wallboxes/{wb_id}/locked/{lc_lock_state}"
        self.APP_SET_WALLBOX_FC     = APP_WALLBOX_BASE_URL + "/v1/systems/{master_plant_id}/wallboxes/{wb_id}/settings/fast-charge"
        self.APP_SET_WALLBOX_SC     = APP_WALLBOX_BASE_URL + "/v1/systems/{master_plant_id}/wallboxes/{wb_id}/settings/solar-charge"

In der Method "app_set_wallbox_mode" wird es interessant.

Der Wallbox relevante Block beginnt hier und geht bis hier

Ich habe keine Senec Wallbox, bzw. noch überhaupt keine Wallbox daher kann ich mit den Konfigurationen noch nicht viel anfangen.

In unserem Senec Modul müsste man die Methode "sub SenecApi_postWallbox" umbauen.

Ich habe mal was für dich zum testen gebastelt:


sub SenecApi_postWallbox {
  my ($hash, $mode) = @_;
  my $name     = $hash->{NAME};
  my $sub_name = (caller(0))[3];
  Log3 $name, 4,"[$sub_name] Enter postWallbox";
 
  my $senec_wallboxid =  ReadingsVal($name, "System_wallboxIds_1",0);
 
  if($senec_wallboxid == 0) {
  Log3 $name, 4,"[$sub_name] Set wallbox mode: $mode failed, because there is no wallbox";
  return;
  }
     
  my $senec_anlage =  ReadingsVal($name, "System_id",0);
  SenecApi_getSystems($hash) if(!defined $senec_anlage );

  # $senec_wallboxid =~ s/^\s+//;
  Log3 $name, 4,"[$sub_name] senec_wallboxids:  $senec_wallboxid";
 
  $SENEC_API_WALLBOX_URL =~ s/SENEC_ANLAGE/$senec_anlage/;
  $SENEC_API_WALLBOX_URL =~ s/WALLBOXID/$senec_wallboxid/;
 
  my $prop = "";
  my $method = "POST";
  my $url = $SENEC_API_WALLBOX_URL;
 
  if ($mode eq "fastest") {
$url = $url . "/settings/fast-charge";
     $prop = '{"allowIntercharge": true}';
     Log3 $name, 4,"[$sub_name] Set wallbox mode: $prop";
  } elsif ($mode eq "PVon") {
$url = $url . "/settings/solar-charge";
     $prop = '{"compatibilityMode": true}';
     Log3 $name, 4,"[$sub_name] Set wallbox mode: $prop";
  } elsif ($mode eq "PVoff") {
$url = $url . "/settings/solar-charge";
     $prop = '{"compatibilityMode": false}';
     Log3 $name, 4,"[$sub_name] Set wallbox mode: $prop";
  } elsif ($mode eq "LOCKED") {
$method = "GET";
     $url = $url . "/locked/true";
     Log3 $name, 4,"[$sub_name] Set wallbox mode: LOCKED";
  } elsif ($mode eq "UNLOCKED") {
$method = "GET";
     $url = $url . "/locked/false";
     Log3 $name, 4,"[$sub_name] Set wallbox mode: UNLOCKED"; 
  } else {
     Log3 $name, 4,"[$sub_name] Set wallbox mode invalid mode: $mode";
  }   

  my $senec_token = getSenecApiToken($hash);
 
  if (!defined $senec_token) {
    my $msg = "No TOKEN from API connect";
    my $state = "API call failed NO TOKEN available";
    Log3 $name, 2,"[$sub_name] $msg";
   
    setStateAPI($hash, $msg, $state);
    return;
  }

  Log3 $name, 4,"[$sub_name] URL:  $url METHOD: $method PROP: $prop";     
   
  my $param = {
    url        => $url,
    timeout    => 120,
    noshutdown => 0,
    data       => $prop,
    hash       => $hash,               
    method     => $method,
    command    => "wallbox",
    header     => { "authorization" => "Bearer $senec_token",
                    "User-Agent" => "Mozilla/1.22",
                    "Content-Type" => "application/json",
                    "Accept" => "application/json" },
    callback   => \&SenecApi_postWallboxCallback                           
  };

  HttpUtils_NonblockingGet($param);   
}


Ersetze obige Methode mal in deinem Modul mit dem Schnipsel.

  if ( ReadingsNum($name, "Feature_car",0) == 1 || $hash->{SENEC_WALLBOXIDS} == 1 ) {
     $setlist .= "wallboxConfiguration:fastest,PVon,PVoff,LOCKED,UNLOCKED ";
  }

Desweiteren habe ich bei diesem Teil noch "UNLOCKED"  angehängt.

LOCKED, UNLOCKED und FASTEST müssten gehen.
Ich bekomme allerdings HTTP 400 zurück. Vielleicht klappt das ja bei dir.

Bei "PVon" und "PVoff" werden im Home Assistant Modul noch weitere Properties in den API call kopiert. Das habe ich nicht gemacht.
Ich denke diese Properties hat unser aktuelles Modul noch gar nicht gelesen und gespeichert. Habe aber ehrlich gesagt auch nicht geschaut.

curiosus

Hallo HGButte,

zunächst mal vielen Dank, dass du dir die Zeit nimmst dich dieser Thematik anzunehmen.

Nach Änderung des entsprechenden Codes gem. deiner Vorgabe, steht nun die Option UNLOCKED auch zur Verfügung. Aber es ist leider das eingetreten, was ich eigentlich schon erwartet hatte:

2025-11-14 21:19:52 Senec senecAPI wallboxConfiguration UNLOCKED
2025-11-14 21:19:53 Senec senecAPI ERROR: [b]invalid status code: 400[/b]
2025-11-14 21:19:53 Senec senecAPI lastUpdateAPI: 2025-11-14 21:19:53
2025-11-14 21:19:53 Senec senecAPI stateAPI: wallbox call failed

Ich bekomme ebenso status code: 400, wie auch vorher beim LOCKED Befehl (siehe meine vorherige Anfrage).

Der Server ist der Meinung, dass der Client eine fehlerhafte Anfrage stellt (bad request).
NUC | Fronthem/Smartvisu | Nextcloud | DBLog | Grafana | div. HM Akt-/Sensoren | ESP8266/32 | 1-Wire | Shelly | WH1000 | PWM-PWMR | Xiaomi | MQTT | CarConnectivity-MQTT | Luftsensor.info | Alexa | iRobots | Zigbee | HUE | SENEC Bat+Wallbox | Zoneminder | Fritz!/Box/Fon/Repeater