Versie 3.2.1 is zojuist vrijgegeven.
Deze versie lost het probleem op waardoor XOM doelvermogen niet kon worden ingesteld.
@Marcel_Janssen Kun je svp testen en bevestigen?
Versie 3.2.1 is zojuist vrijgegeven.
Deze versie lost het probleem op waardoor XOM doelvermogen niet kon worden ingesteld.
@Marcel_Janssen Kun je svp testen en bevestigen?
Yes het werkt nu perfect. Hiermee wordt de Sessy’s ontzien van leegtrekken tijdens laden EV wel heel eenvoudig, zonder dat de Sessy’s in een andere Modus gezet hoeven te worden. Vandaag testen.
Heel erg bedankt @Gruijter
Euh… nou, Sessy moet wel in Sessy XoM mode staan, anders werkt het niet (cq zou het niet moeten werken)
Nope. Sessy’s staan hier helemaal buiten. De Sessy_P1 regelt gewoon dat je de NOM = 0 op NOM = Laadvermogen zet. De Sessy’s passen zich hier dan keurig op aan. Ik heb onderstaande gemaakt:
Getest en werkt perfect. Ook bij veranderende vermogens van de lader. Sessy’s staan in ECO.
Ik vraag het ff na bij Sessy. Dat grid offset ook werkt in ECO modus is nieuw voor mij ![]()
Edit: weer wat geleerd: Hoe werkt de Eco-modus? - Sessy thuisbatterij
Ik heb een Sessy thuisbatterij en een homey. Ik ben bezig geweest om te kijken hoe ik de Sessy’s (ik heb er twee) zo efficient mogelijk kan inzetten. In deze thread geef ik weer wat ik gedaan heb, misschien is het voor iemand inspiratie of ook handig.
Eerste challenge:
Als er zon is moet Sessy iets anders doen als wanneer dat niet zo is. In de zomer is de NOM modus prima, met 10Kwh kom ik de nacht praktisch door en hoef ik niet veel te doen.
In de winter is dat anders, dan wil ik graag dat Sessy gaat laden als de prijzen laag zijn, maar pas ontladen als de prijzen hoog zijn. Dat moet ook alleen maar gebeuren als het prijsverschil meer dan X% is (ik hanteer 20) want anders verlies ik meer aan stroom dan ik verdien aan het prijsverschil.
Hoe bepaal ik of Sessy in die zomer of winter modus moet werken.
Ik heb een vijftal nummerieke variabelen gemaakt: Elektra_dag1 tot en met Elektra_dag5. Die gebruik ik om elke dag de zonne-opbrengst van mijn Solaredge set in te stoppen. Vervolgens bereken ik het gemiddelde van die 5 dagen uit.
Vervolgens heb ik een tweetal variabelen die aangeven hoe hoog de gemiddelde opbrengst over vijf dagen moet zijn om naar zomermodus te gaan, en hoe laag om naar wintermodus te gaan:
Ok. Nu heb ik mijn sessy op deze manier zonder tussenkomst in wintermodus. Nu wil ik dat hij gaat laden/ontladen op de momenten dat dat iets oplevert. De standaard apps geven de mogelijkheid om dat te doen via “de X goedkoopste” en “de X duurste” uren, ik wilde proberen er iets meer mee te doen.
Ik heb een script gevibecode dat het volgende doet:
/**
* HomeyScript – Dynamische uurstrategie (maximale k, som-variant)
* Kijkt altijd naar de prijzen van MORGEN.
*
* Variabelen:
* - Dynprice_00 t/m Dynprice_23 (string: "Charge", "Discharge", "Hold")
* - Sessy_ontlaad_drempel (percentage, numeriek)
* - ontladen_error (boolean)
*/
const TOKEN = 'VUL HIER JE TIBBER API CODE IN';
const query = `
{
viewer {
homes {
currentSubscription {
priceInfo {
tomorrow {
startsAt
total
}
}
}
}
}
}`;
async function main() {
const vars = await Homey.logic.getVariables();
async function setVar(name, value) {
const v = Object.values(vars).find(x => x.name === name);
if (!v) throw new Error(`Variabele '${name}' niet gevonden`);
await Homey.logic.updateVariable({ id: v.id, variable: { value } });
}
async function fail(reason) {
for (let h = 0; h < 24; h++) {
await setVar(`Dynprice_${String(h).padStart(2, '0')}`, "Hold");
}
await setVar("ontladen_error", true);
return `❌ Fout: ${reason}`;
}
// --- Tibber ophalen ---
let res;
try {
res = await fetch("https://api.tibber.com/v1-beta/gql", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + TOKEN
},
body: JSON.stringify({ query })
});
} catch (e) {
return fail("Netwerkfout bij ophalen Tibber");
}
const json = await res.json();
const raw = json?.data?.viewer?.homes?.[0]?.currentSubscription?.priceInfo?.tomorrow;
if (!Array.isArray(raw) || raw.length !== 24) {
return fail(`Tibber gaf ${raw?.length ?? "null"} prijsregels voor morgen i.p.v. 24`);
}
// --- Prijzen + uurindex ---
const hours = raw.map((p, idx) => ({
hour: idx,
price: parseFloat(p.total)
}));
if (hours.some(x => isNaN(x.price))) {
return fail("Onleesbare prijsdata ontvangen");
}
// --- Drempel inlezen ---
const drempelVar = Object.values(vars).find(v => v.name === "Sessy_ontlaad_drempel");
let threshold = 20;
if (drempelVar) {
const v = parseFloat(drempelVar.value);
if (!isNaN(v)) threshold = v;
}
// --- Sorteren op prijs (laag → hoog) ---
const sorted = [...hours].sort((a, b) => a.price - b.price);
// --- Maximale k bepalen op basis van SOM-diff ---
let optimalK = 0;
const debugLines = [];
for (let k = 1; k <= 12; k++) {
const lowest = sorted.slice(0, k);
const highest = sorted.slice(24 - k);
const sumLow = lowest.reduce((a, x) => a + x.price, 0);
const sumHigh = highest.reduce((a, x) => a + x.price, 0);
if (sumLow === 0) continue;
const diff = ((sumHigh - sumLow) / sumLow) * 100;
debugLines.push(
`k=${k}: sumLow=${sumLow.toFixed(4)}, sumHigh=${sumHigh.toFixed(4)}, diff=${diff.toFixed(2)}%`
);
if (diff >= threshold) {
optimalK = k; // steeds de grootste k bewaren die nog voldoet
}
}
if (optimalK === 0) {
for (let h = 0; h < 24; h++) {
await setVar(`Dynprice_${String(h).padStart(2, '0')}`, "Hold");
}
await setVar("ontladen_error", false);
return `ℹ️ Geen strategie voor morgen (verschil < ${threshold}%). Alles HOLD.\n` +
debugLines.join('\n');
}
// --- Sets van uren bepalen ---
const lowSet = new Set(sorted.slice(0, optimalK).map(x => x.hour));
const highSet = new Set(sorted.slice(24 - optimalK).map(x => x.hour));
for (let h = 0; h < 24; h++) {
const varName = `Dynprice_${String(h).padStart(2, '0')}`;
let val = "Hold";
if (lowSet.has(h)) val = "Charge";
if (highSet.has(h)) val = "Discharge";
await setVar(varName, val);
}
await setVar("ontladen_error", false);
return `✅ Strategie voor morgen: k=${optimalK}, drempel=${threshold}%.\n` +
debugLines.join('\n');
}
return main();
/**
* HomeyScript – Bepaalt de actie voor de thuisbatterij op basis van Dynprice_XX
* Zet:
* - Sessy_Action
* - Sessy_Action_Note
*
* Tijdzone-offset via logica-variabele TimezoneOffsetHours (1 = winter, 2 = zomer)
*/
async function main() {
const vars = await Homey.logic.getVariables();
function getVar(name) {
return Object.values(vars).find(v => v.name === name);
}
async function setVar(name, value) {
const v = getVar(name);
if (!v) throw new Error(`Variabele '${name}' niet gevonden`);
await Homey.logic.updateVariable({ id: v.id, variable: { value } });
}
// ---- Tijdzone uit variabele ----
const tzVar = getVar("TimezoneOffsetHours");
const tz = Number(tzVar?.value ?? 1); // default CET
// ---- Tijd-diagnose ----
const now = new Date();
const utcHour = now.getUTCHours();
const localHour = (utcHour + tz + 24) % 24;
const hour = String(Math.floor(localHour)).padStart(2, "0");
const timeStr = now.toString(); // HomeyScript's eigen tijd (UTC)
// Variabele van het uur ophalen
const dynName = `Dynprice_${hour}`;
const dynVar = getVar(dynName);
let noteText;
if (!dynVar) {
noteText =
`❌ ${dynName} niet gevonden → Actie: Hold ` +
`| UTC-uur=${utcHour} | Lokale-uur=${hour} | Tijd=${timeStr}`;
await setVar("Sessy_Action", "Hold");
await setVar("Sessy_Action_Note", noteText);
return noteText;
}
const status = (dynVar.value || "").trim();
const allowed = ["Charge", "Discharge", "Hold"];
if (allowed.includes(status)) {
noteText =
`⏱️ Uur ${hour}: ${dynName} = ${status} ` +
`| UTC-uur=${utcHour} | Lokale-uur=${hour} | Tijd=${timeStr}`;
await setVar("Sessy_Action", status);
await setVar("Sessy_Action_Note", noteText);
return noteText;
}
// Onverwachte waarde → veiligheid
noteText =
`⚠️ Uur ${hour}: onverwachte waarde "${status}" in ${dynName} → Hold ` +
`| UTC-uur=${utcHour} | Lokale-uur=${hour} | Tijd=${timeStr}`;
await setVar("Sessy_Action", "Hold");
await setVar("Sessy_Action_Note", noteText);
return noteText;
}
return main();
Het homeyscript dat ieder uur draait vult ook een variable “Sessy_Action_Note” met wat hij in dat uur gedaan heeft, ik had dat eigenlijk gemaakt om te kunnen zien of het met de tijdzones nu goed ging, dat werkt nu, maar ik laat het erin omdat het mooi laat zien wat het script bepaald heeft.
Ik bewaak met een standaard flow of die variabele gewijzigd wordt (dat is ieder uur zo), en op het moment dat dat gebeurt wordt de inhoud van die variabele in de timeline getoond:
Het is eigenlijk nog iets complexer, ik heb ook nog flows draaien die de fasebelasting in de gaten houden en bij overbelasting de batterij laten ontladen… Die voeg ik hier niet toe omdat in de nieuwe release van Sessy een functie zit die dat veel beter kan, dan sloop ik dat er bij mij ook weer uit.
Misschien kan iemand er iets mee !
Als ik iets wil doen dat het meest lijkt op “ wel zonnestroom opslaan, maar niets teruggeven “ , zou ik dan Sessy in NOM modus kunnen zetten maar maximaal vermogen op 1 watt zetten ?
Hallo ik wou even een fout melden / vervelende situatie melden waar ik verder niks aan kan doen. Ik schakel altijd tussen Nom en Idle. Dag en nacht stroom. Maar als ik dongel updates krijg in homey gaat de accu automatisch op Api modus staan. Hier komt hij niet meer van af omdat ik hier niet op schakelde. Nu heb ik een extra regel ingebouwd die elke morgen checkt waar de accu op staat. Mocht hij niet goed staan zet hij hem een minuut later op de goede modus.
Heb je gekeken of in de settings ‘Forceer Homey besturingsmodus’ wel uitstaat?
Ja die stond aan aan. Nu heb ik net getest om hem uit te zetten. “Forceer…..” En vanuit de flows kon homey de modussen nog gewoon veranderen. Van idle naar nom. Nu zette ik het weer aan “Forceer…..” en de accu spring gelijk op Home automation Api zonder flow te starten.
Zo heb ik het nu lopen:
Dat homey in Api blijft hangen komt dat ik die compare erin heb zitten. Ik vind het onzinnig als accu idle staat om hem weer naar idle te schakelen en ik weet ook niet goed hoe hij daar op reageerd. Volgens mij maakt het niks uit?…..
Dus die moet je uit hebben staan
. Dan doet de flow het toch goed?
Tja?… maar dan weet ik nog niet waarom hij op Api springt automatisch?…. Ik vermoed zelf door die meldingen van de dongel updates…. Kan ik die ook uitzetten. Kan zijn als “Forceer…..” uitzet hetzelfde blijft doen met die Api.
Omdat Homey dan de controle forceert (= api modus)
Oke nou zou eens testen?…. maar vind het een beetje gek als de updates komen dat die gelijk een opdracht mee krijgen om het op Api te zetten…
Ik heb een vraag over de status ECO en hoe het laden te stoppen indien de Sessy 100% vol is. Wat is het probleem: In de stand ECO worden de Sessy’s via de portal aangestuurd om te laden met x kW gedurende y uren. Indien 5 uur is ingesteld en binnen 2 uur is de batterij volgeladen, dan blijft de Sessy in de “LADEN” status staan, waardoor dus NOM op de meter niet werkt en er dus stroom van het net wordt gehaald. Wat ik zou willen maken met een flow is indien de Sessy is volgeladen het “LADEN” in ECO modus stopt en weer de Sessy In ECO-NOM modus gaat. Ik heb even gekeken naar de kaarten maar kan niet vinden wat de status van de Sessy tijdens het laden en hoe de Sessy weer in ECO-NOM te zetten. Graag jullie tips.
p.s. Ik ben van plan om de ECO na te gaan bootsen met Homey, dus dit is even een tussenstap.
Dat lijkt me goede feedback om aan Sessy zelf mee te geven. Heb je al contact met ze gehad hierover?
Je kan alle data/statussen die de Homey app laat zien gebruiken in flows. Als er geen dedicated flowcards zijn gebruik dan logic cards.
Bedankt voor je reactie. Hier is geen oplossing voor vrees ik. Laden via ECO wordt vanuit de Sessy portal aangestuurd en of daarbij de SOC van de Sessy’s in meegenomen kan worden betwijfel ik. Ik heb het al op Tweakers gemeld waar Twan ook meeleest.
Voor de Homey ga ik eens wat statussen uitlezen gedurende ECO laden. Wordt vervolgd.