[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

HGButte

Mir sind noch ein paar Sachen aufgefallen:

UNLOCKED ist prinzipiell unnötig, da das wohl durch die anderen Modi gesetzt wird.

Anstatt

$method = "GET";
braucht es aber

$method = "PATCH";
bei LOCKED und UNLOCKED


Warum Fastcharge und LOCKED ansonsten 400 liefern ist mir nicht klar.
Vielleicht ist die Anlagen ID eine andere als bei den anderen Calls.

Das habe ich noch gefunden zur Erläuterung

HGButte

Also an der Anlagen ID kann es wohl nicht liegen.

Habe jetzt noch einige Sachen durchgespielt aber da ich keine Wallbox habe, komme ich hier leider nicht weiter.

Hast du bei dir Readings 'System_wallboxIds_1' oder welche die mit 'Wallbox_api_' beginnen?

Wenn ich bei mir z.B.
GET https://senec-app-wallbox-proxy.prod.senec.dev/v1/systems/SENEC_ANLAGE/wallboxes/WALLBOXID'abfrage ( WALLBOXID habe ich mal auf '1' gesetzt) erhalte ich einen 401 NOT AUTHORIZED.

Bei setzen von LOCKED:
PATCH https://senec-app-wallbox-proxy.prod.senec.dev/v1/systems/SENEC_ANLAGE/wallboxes/WALLBOXID/locked/true'kommt wie bei dir 400.

curiosus

Meine Antwort hat leider etwas gedauert, denn ich hatte zwischendurch das echte Gefühl die Büchse der Pandora geöffnet zu haben. Aus all den gemachten Versuchen resultierten plötzlich fatale Szenarien, wie beispielsweise Batterie wollte nicht mehr entladen, Wallbox hatte angeblich keine Spannung mehr usw. Alle Änderungen unterliegen ja einer zeitlichen Verzögerung (5min), bis alles von der Cloud lokal durchgereicht wird. Ich will gar nicht detailliert beschreiben was da alles abgelaufen ist, nur soviel, dass es wirklich viel Zeit gekostet hat.

Nun aber zum eigentlichen Thema, ich kann jetzt tatsächlich von fhem heraus die Wallbox(0) aus- und einschalten. Das geschieht einzig mittels LOCKED und UNLOCKED.

  } elsif ($mode eq "LOCKED") {
         $method = "PATCH";
         $url = $url . "/locked/true";
         Log3 $name, 4,"[$sub_name] Set wallbox mode: LOCKED";
  } elsif ($mode eq "UNLOCKED") {
         $method = "PATCH";
         $url = $url . "/locked/false";
         Log3 $name, 4,"[$sub_name] Set wallbox mode: UNLOCKED";

Das UNLOCKED prinzipiell unnötig ist und durch andere Modi gesetzt wird kann ich nur verneinen, denn es führte mich zu den genannten Horror Szenarien.

ZitatHast du bei dir Readings 'System_wallboxIds_1' oder welche die mit 'Wallbox_api_' beginnen?

Ich habe folgendes anzubieten:

System_wallboxIds_1    1     
System_wallboxIds_2    2

und darüber hinaus auch

Wallbox_api_chargingCurrents_configuredChargingCurrent 6
Wallbox_api_chargingCurrents_currentApparentChargingPowerInKw 0
Wallbox_api_chargingCurrents_minPossibleCharging 6
Wallbox_api_chargingMode_allowIntercharge true
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_1 MON
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_2 TUE
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_3 WED
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_4 THU
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_5 FRI
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_6 SAT
Wallbox_api_chargingMode_comfortChargeSettings_activeWeekDays_7 SUN
Wallbox_api_chargingMode_comfortChargeSettings_allowIntercharge false
Wallbox_api_chargingMode_comfortChargeSettings_chargingPeriodFromGridInH 0
Wallbox_api_chargingMode_comfortChargeSettings_compatibilityMode false
Wallbox_api_chargingMode_comfortChargeSettings_configuredChargingCurrent 0
Wallbox_api_chargingMode_comfortChargeSettings_priceLimitInCtPerKwh 0
Wallbox_api_chargingMode_comfortChargeSettings_useDynamicTariffs false
Wallbox_api_chargingMode_compatibilityMode true
Wallbox_api_chargingMode_fastChargingSettings_allowIntercharge true
Wallbox_api_chargingMode_solarOptimizeSettings_compatibilityMode true
Wallbox_api_chargingMode_solarOptimizeSettings_minChargingCurrentInA 6
Wallbox_api_chargingMode_type SOLAR
Wallbox_api_chargingPowerStats_numberOfPhasesUsed 0
Wallbox_api_chargingPowerStats_phase1_max 3.685
Wallbox_api_chargingPowerStats_phase1_min 1.38
Wallbox_api_chargingPowerStats_phase2_max 7.369
Wallbox_api_chargingPowerStats_phase2_min 2.76
Wallbox_api_chargingPowerStats_phase3_max 11.054
Wallbox_api_chargingPowerStats_phase3_min 4.14
Wallbox_api_controllerId S294*****************
Wallbox_api_disconnected false
Wallbox_api_id 1
Wallbox_api_isInterchargeAvailable true
Wallbox_api_isSolarChargingAvailable true
Wallbox_api_name Wallbox 1
Wallbox_api_prohibitUsage true
Wallbox_api_state_electricVehicleConnected true
Wallbox_api_state_hasError false
Wallbox_api_state_isCharging false
Wallbox_api_state_statusCode EV_PERMISSION_TO_CHARGE
Wallbox_api_state_temperatureInCelsius 14.118
Wallbox_api_type         V123
   
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