Easee binding

The binding tries to parse the data retrieved from easse API. In your case “4.0” is retrieved for channel “state#dynamicChargerCurrent”. The binding should try to convert it into a double value. I also do not understand the issue.

EDIT: Found the issue. Will apply a fix.

1 Like

Hi Alex,

I charge two different EVs with the Easee charging station. Is it possible to retrieve the charging sessions per car (different authorization tags) in OpenHAB?

Kind regards,

Hi all

Recently I have experienced trouble of charger not allways starts charging when power dynamicchargercurrent gets set to >6, I do not think I made any changes in my code but one never know. Currently on 3.3 version.

I’ve been in touch wit Easse and the say the issue might be thirdparty integration, but the still try to help me solwe the problem.

Heres my rules just in case.

var lastIncTimer = now
var lastDecTimer = now
var loadInc = 6
var loadDec = 6

rule "EaseeBox Charging start/stop"

//Item EaseeBox_chargerOpMode changed
 Time cron "45 */2 * * * ?"


logInfo("Easee", "Cron based rule started")
logInfo("test", "Tidpunkt" +Evconnected.state)
if((CarChargerAllowed.state != OFF && evTarget.state == "Tomorrow" && spotPriceRange.state == "Tomorrow") || (CarChargerAllowed.state != OFF && evTarget.state == "Today") || (evTarget.state == "Now")){
  logInfo("Easee", "Ready to charge or completed step 0")
  if (EaseeBox_chargerOpMode.state as Number == 2 || EaseeBox_chargerOpMode.state as Number == 6){
    logInfo("Easee", "Ready to charge or completed step 1")

    if  (EaseeBox_output_current.state as Number !=6){ // && availableCurrent.state >=12.0 && now.minusMinutes(30).isAfter(timestampHigh)){
              logInfo("Easee", "Ready to charge or completed step 2")
              logInfo("Easee", "Ready to charge or completed step 3")
                logInfo("Easee", "Laddstatus 283 ==2 6A")

if ((EaseeBox_chargerOpMode.state as Number == 1 && Easee_DynamicCircuitCurrentsPhase123.state !="0;0;0") || (EaseeBox_chargerOpMode.state as Number == 4 && Easee_DynamicCircuitCurrentsPhase123.state !="0;0;0")){
              Easee_DynamicCircuitCurrentsPhase123.sendCommand ("0;0;0")
              logInfo("Easee", "Laddstatus 306 =1 0A")

//if(newDynamicCurrent.state != EaseeBox_dynamicChargingCurrentL1.state){
  //sendBroadcastNotification("Easee: Dynamic current doesn't match")
else (logInfo("Easee", "Cronregel avslutad utan åtgärd"))
if(evTarget.state != "Tomorrow"){
logInfo("Test", "Tomorrow == true")}
if(evTarget.state == "Now"){
logInfo("Test", "Now == true")}
if(evTarget.state == "Today"){
logInfo("Test", "Today == true")}

rule "Easee op mode docking"

Item EaseeBox_chargerOpMode changed from 1 to 2
//Evconnected.postUpdate(new DateTimeType)
//EvCarReady.postUpdate(new DateTimeType(now.with(LocalTime.MIDNIGHT).plusHours(30)))


rule "EaseeBox loadbalancing"


  Item EaseeBox_output_current changed  or Item gridloadmax changed     //Time cron "45 */1 * * * ?"  or Item gridloadmax changed  //"0 */1 * * * ?"
  //Item gridload changed //powergridCurrentConsumptionL1 changed or Item powergridCurrentConsumptionL2 changed or Item powergridCurrentConsumptionL3 changed

var oldDynamicCurrent = easeeMaxCurrent.state as Number
if(EaseeBox_chargerOpMode.state as Number==3){
logInfo("Easee", "eventbased rule started")
if (newDynamicCurrent.state==NULL){
logInfo("Easee","Set new variable")

if(oldDynamicCurrent >=7 && oldDynamicCurrent <=15){
loadDec = oldDynamicCurrent -1
loadInc = oldDynamicCurrent +1
//var loadDecx2 = (newDynamicCurrent.state) as Number -4

if(oldDynamicCurrent <=6){
loadDec = 0
loadInc = oldDynamicCurrent +1
//var loadDecx2 = (newDynamicCurrent.state) as Number -4
if(oldDynamicCurrent ==0){
loadDec = 0
loadInc = 6
//var loadDecx2 = (newDynamicCurrent.state) as Number -4

  if (availableCurrentCriticalTimestamp.state == NULL) {
  availableCurrentCriticalTimestamp.postUpdate(new DateTimeType())  
  if(availableCurrentLowTimestamp.state == NULL){
    availableCurrentLowTimestamp.postUpdate(new DateTimeType())
  if(availableCurrentMedTimestamp.state == NULL){
    availableCurrentMedTimestamp.postUpdate(new DateTimeType())

  if(availableCurrentHighTimestamp.state == NULL){
    availableCurrentHighTimestamp.postUpdate(new DateTimeType())
  if(currentOverloadTimestamp.state == NULL){
    currentOverloadTimestamp.postUpdate(new DateTimeType())
if(EaseeBox_chargerOpMode.state as Number != 1){

  // increase dynamic charging power
  var stringLoadInc = (loadInc + ";" + loadInc + ";" + loadInc)
  var stringLoadDec = (loadDec + ";" + loadDec + ";" + loadDec)
  logInfo("Easee", "Easee loadInc 3 phase: " + stringLoadInc)
  logInfo("Easee", "Easee loadDec 3 phase: " + stringLoadDec )


val timestampCritical = (availableCurrentCriticalTimestamp.state as DateTimeType).getZonedDateTime()
 val timestampLow = (availableCurrentLowTimestamp.state as DateTimeType).getZonedDateTime()
 val timestampMed = (availableCurrentMedTimestamp.state as DateTimeType).getZonedDateTime()
 val timestampHigh = (availableCurrentHighTimestamp.state as DateTimeType).getZonedDateTime()
  //Easee_DynamicCircuitCurrentsPhase123.sendCommand ("10;10;10")
  //Easee_DynamicCircuitCurrentsPhase123.sendCommand (loadInc + ";" + loadInc + ";" + loadInc)
            if (EaseeBox_chargerOpMode.state as Number == 3){
             logInfo("EV charger", "Loadbalancing started")
             logInfo("EV charger", "Increase step 2 Timestamp high: "+timestampHigh+" Timestamp med: "+timestampMed+ "Last inc timer: " +lastIncTimer)
            if (availableCurrentHighProxy.state ==ON && easeeMaxCurrent.state >= loadDec && now.minusMinutes(5).isAfter(lastIncTimer) || availableCurrentMedProxy.state ==ON && easeeMaxCurrent.state >= loadDec  && now.minusMinutes(5).isAfter(lastIncTimer)) { //(powergridCurrentConsumptionL1.state <=0 && powergridCurrentConsumptionL1.state >=-5 || powergridCurrentConsumptionL2.state <=0 && powergridCurrentConsumptionL2.state >=-5 || powergridCurrentConsumptionL3.state <=0 && powergridCurrentConsumptionL3.state >=-5){
             logInfo("EV charger", "Increase step 2 Timestamp high: "+timestampHigh+" Timestamp med: "+timestampMed+ "Last inc timer: " +lastIncTimer)
                 if (now.minusMinutes(30).isAfter(timestampHigh) || now.minusMinutes(30).isAfter(timestampMed)){
                //if (availableCurrent.state >=8.4 && easeeMaxCurrent.state >= loadDec && now.minusMinutes(5).isAfter(lastIncTimer) || availableCurrent.state >=8.4 && easeeMaxCurrent.state >= loadDec  && lastIncTimer == NULL) { //(powergridCurrentConsumptionL1.state <=0 && powergridCurrentConsumptionL1.state >=-5 || powergridCurrentConsumptionL2.state <=0 && powergridCurrentConsumptionL2.state >=-5 || powergridCurrentConsumptionL3.state <=0 && powergridCurrentConsumptionL3.state >=-5){
                logInfo("EV charger", "Increase step 3")
               if (newDynamicCurrent.state >=0 && newDynamicCurrent.state <=16){
                Easee_DynamicCircuitCurrentsPhase123.sendCommand (loadInc + ";" + loadInc + ";" + loadInc)
                //EaseeBox_dynamicChargingCurrentL1.sendCommand (loadInc)
                //EaseeBox_dynamicChargingCurrentL2.sendCommand (loadInc)
                //EaseeBox_dynamicChargingCurrentL3.sendCommand (loadInc)             
                logInfo("Easee", "Tillgänglig ström ökad till: "+loadInc+" Amp")
                lastIncTimer = now

// sänk laddningsström
if (availableCurrentLowProxy.state ==ON && now.minusSeconds(90).isAfter(lastDecTimer) || availableCurrentCriticalProxy.state ==ON && now.minusSeconds(90).isAfter(lastDecTimer)){  // if (powergridCurrentConsumptionL1.state <=-6 || powergridCurrentConsumptionL2.state <=-6 || powergridCurrentConsumptionL3.state <=-6){
  if (now.minusSeconds(60).isAfter(timestampCritical) || now.minusMinutes(10).isAfter(timestampLow)){
      logInfo ("EV charger", "decend step 2")
       //if (availableCurrent.state <3.5 && now.minusSeconds(90).isAfter(lastDecTimer) || availableCurrent.state <3.5 && lastDecTimer == NULL){  // if (powergridCurrentConsumptionL1.state <=-6 || powergridCurrentConsumptionL2.state <=-6 || powergridCurrentConsumptionL3.state <=-6){
        logInfo ("EV charger", "decend step 3")
        if (newDynamicCurrent.state <=17 && newDynamicCurrent.state >=1){
              //easeeRequestBody = '{"dynamicCircuitCurrentP1":'+loadDec+',"dynamicCircuitCurrentP2":'+loadDec+',"dynamicCircuitCurrentP3":'+loadDec+'}'
            logInfo("Easee", "Tillgänglig ström sänkt till: "+loadDec+" Amp")
           Easee_DynamicCircuitCurrentsPhase123.sendCommand (loadDec + ";" + loadDec + ";" + loadDec)
            //EaseeBox_dynamicChargingCurrentL1.sendCommand (loadDec)
            //EaseeBox_dynamicChargingCurrentL2.sendCommand (loadDec)
            //EaseeBox_dynamicChargingCurrentL3.sendCommand (loadDec)
              lastDecTimer = now
              logInfo("Easee", "Loadbalancing performed but not charging")      

Hi again a little uppdate, I just saw that I was on 3.4 version and that my previos channel dissapeard among channels.

Amazing it works sometimes, but wich channel should I use now for loadbalancing


old item config that doesn’t have a channel any more where I used to sedn for example 10;10;10 for 10 amps on each phase.

String Easee_DynamicCircuitCurrentsPhase123 "Dynamisk laddström" {channel="easee:mastercharger:55d540b590:12345:dynamic_current#setDynamicCurrents"}

Update again

It seems like the channel exist but not showing in UI

String Easee_DynamicCircuitCurrentsPhase123 "Dynamisk laddström" {channel="easee:mastercharger:55d540b590:12345:dynamic_current#setDynamicCurrents"}

For me it looks like this:

Maybe you should uninstall the binding and reinstall it. I also had the situation in the past where parts of an old version got mixed up with the current version and thus channels were missing.


This should be the correct channel name in the final version of the binding.

I will consider this but currently I do not have any time to work on further features.

Good job with this binding :slight_smile:
Any reason why you made this validation rule '(0|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32)

I want to use 2 and 4…

I’m not sure if you could use 2 and I think that Easee wallbox stops charging if you set it less than 6A, not really sure on this one.

Today i figured it out, I did reinstall binding and but what I really think was the solution was to delete my old mastercharger and create a new one. Now I have all new channels name.

You are right, I did some testing with the easse API, It’s stops charging below 6 amp.
Thanks, for your support

Very cool binding, in a short amount of time I managed to make my car charge only on solar power because of this binding (which Tibber cannot in their app) together with another very well working binding (Fronius).

Confirming long response times (about two minutes) for changes to take effect. I get the impression that this is because of Easee, not the binding itself (I have set 20 seconds for it). It is basically the same with the Tibber app, very slow to update.

There is one thing I don’t understand however, maybe someone can nudge me in the right direction. The channel state#smartCharging can show if Smart Charging is enabled or not but it is read only. Therefore I use the channel commands#genericCommand which works very well with the command smart_charging to switch it ON. However, to switch it off, Easee uses the Settings and not a command per se:

When I do it through their curl on their website it works fine (smart_charging:false).

But what I cannot figure out is how to do this with the genericCommand channel. smart_charging:false does not work.

Anyone who understand this better than I do that have some sort of suggestion…? It would be nice to get this part working as well but of course I will survive without. But it is fun to try :slight_smile:

Hi all, would like to get some suggestion here.
I noticed Easee binding doesn’t seem to work anymore for me, I can see the following log entries and the Thing and items are all online, but states are not updated anymore:

2023-04-19 10:01:11.459 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing ‘easee:site:home’ changed from UNKNOWN: waiting for web api login to ONLINE: Access Token Refreshed/Validated
2023-04-19 10:01:46.252 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing ‘easee:mastercharger:home:EaseeCharger’ changed from UNKNOWN: waiting for bridge to go online to ONLINE

The username and pwd look correct to me, not sure how to troubleshoot the issue? Any suggestion is appreciated!

Switching smartCharging off is not yet implemented in the binding. The API is a little bit weird / inconsistent.

This output does not show any problem. If status is online your credentials should be correct.
Do you run the official binding version or any snapshot you installed manually? You could try to delete a recreate things I have observed similar behaviour before that resulted in broken things after the binding was updated to a new version.
Another option is to enable debug logging.

Thank you! Looks like something was wrong with EaseeHome cloud/server. It started to work again this morning, no error in log. There seems to be a local protocol between the app and the charger as when the binding was not update yesterday, the app continues to work w/o issue.

Yes, I figured that too. And it is not very well written. I do agree. Inconsistent and extremely slow.
Thanks for your answer, I do appreciate it!

I checked the binding, adding wrote Support for smartCharging should be just 2 lines of XML configuration the API endpoint is already implented. I will add this.

Oh, very cool, thank you :slight_smile: You are the best :+1:

the implemented fix will make the channel state#smartCharging writable which is the most convenient way to change the value.