ID.nl logo
Programmeren in Python met ChatGPT - Deel 5
© Limitless Visions - stock.adobe.com
Huis

Programmeren in Python met ChatGPT - Deel 5

In de vorige delen van de workshopreeks over de OpenAI-API hebben we teksten samengevat, vertaald en er informatie uit gehaald. Dat bleef telkens beperkt tot één vraag en één antwoord. In dit laatste deel gaan we een stap verder: je gaat in je eigen Python-programma’s volwaardige conversaties voeren met het taalmodel van ChatGPT.

In dit laatste deel laten we zien dat je in Python een conversatie met ChatGPT kunt voeren.

  • We breiden de basiscode uit met 'messages'
  • We creëren een spelpersonage

Lees ook: Babbelen met bijdehante bots: er is meer dan ChatGPT

Code downloaden In dit deel worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Het bestand, gptcode-dl5.txt is beschikbaar via deze webpagina.

Je weet ondertussen hoe je in je Python-programma’s een vraag aan ChatGPT stelt via de OpenAI-API. We hebben dit in de vorige vier delen van deze workshopreeks geïllustreerd met talloze toepassingen. Maar onze programma’s hadden daarbij telkens dezelfde structuur: je stelt een vraag (de prompt), je krijgt een antwoord (de completion) en dan stopt de interactie.

Als je al eens van ChatGPT gebruikgemaakt hebt op de OpenAI-website, weet je dat je er ook volledige conversaties mee kunt voeren. Die mogelijkheid gaan we nu ook in onze eigen Python-programma’s inbouwen. In plaats van een klassieke, beperkte interface met invoer in een vast patroon, creëer je zo een conversationele interface. 

Basiscode

In de vorige delen van deze reeks maakten we altijd gebruik van een basisfunctie get_completion waaraan we een gebruikersprompt en eventueel een systeemprompt gaven, met optioneel ook een model. Die functie stuurde de prompt(s) door aan de OpenAI-API en gaf het antwoord terug.

Om een conversatie te voeren, moet het taalmodel toegang tot de hele context hebben, met de vorige boodschappen die het taalmodel en jij hebben uitgewisseld. Daarom maken we in dit deel een nieuwe hulpfunctie: get_completion_from_messages. Daaraan geef je de hele geschiedenis van boodschappen door. Onze basiscode ziet er dan als volgt uit:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Klik daarom in Visual Studio Code op File / New File en kies Python File. Plaats daarin de voorgaande Python-code. De API-sleutel moet je zelf aanmaken in je account bij OpenAI, net zoals in de vorige delen van deze workshopreeks.

Google Nest Mini

Een apparaat dat ook luistert naar wat jij te zeggen hebt

Rollen

Waaruit bestaan die boodschappen nu? Het argument messages dat we aan de functie get_completion_from_messages moeten doorgeven, is een lijst van Python-dictionary’s, een datastructuur die sleutels en waardes heeft. Elke dictionary in de lijst messages heeft twee sleutels: "role" en "content". De eerste beschrijft de rol van de boodschap in de conversatie en de tweede de inhoud (de tekst).

De OpenAI-API kent drie rollen: system, user en assistant. Een boodschap met de rol system beschrijft een systeemprompt. Zoals we in de vorige delen uitlegden, geeft een systeemprompt algemene instructies aan het taalmodel. Een boodschap met de rol user beschrijft een vraag van de gebruiker. En een boodschap met de rol assistant beschrijft een antwoord van het taalmodel.

Een conversatie met de OpenAI-API kan er dan in Python als volgt uitzien in de vorm van boodschappen met een rol en inhoud:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Voeg deze lijst aan je code toe. Daarna kun je aan de OpenAI-API vragen om de conversatie in deze boodschappen voort te zetten:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Sla dit bestand in Visual Studio Code op met Ctrl+S en geef het een naam. Klik dan op Terminal / New Terminal, waarna er onder je code een nieuw deelvenster opent met een opdrachtprompt. Klik rechts bovenaan op het afspeelknopje (het driehoekje met de tooltip Run Python File als je erboven blijft hangen). Als alles goed gaat, krijg je nu in de terminal een antwoord als “Voor het geval dat de cloud gaat regenen!”.

Met deze kennis over de rollen weet je nu ook waarom er in de laatste regel van de functie get_completion_from_messages (en de functie get_completion die we in de eerdere workshops gebruikten) response.choices[0].message["content"] staat. Het stukje message["content"] geeft de tekst van het antwoord van het taalmodel terug. Als je message["role"] in die functie zou tonen, zou je "assistant" te zien krijgen.

Aan ChatGPT is geen originele komiek verloren gegaan.

Wat onthoudt de chatbot?

Je hebt gezien dat elke conversatie die je met het taalmodel voert, bestaat uit een lijst van boodschappen. Het taalmodel houdt rekening met alle informatie die in deze boodschappen te vinden is. Vertel je bijvoorbeeld in één boodschap je naam, dan kun je daar in een van de boodschappen erna naar vragen en kan het taalmodel daar perfect op antwoorden. Vervang de lijst messages uit het vorige voorbeeld maar eens door deze lijst en voer het programma uit:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

De conversatie is eenvoudig. Het taalmodel krijgt de instructie dat het een vriendelijke chatbot is. Daarna stelt de gebruiker zich voor en vraagt het taalmodel wat het kan doen. De gebruiker vraagt dan wat zijn naam is.

Als je dit programma uitvoert, zul je zien dat het taalmodel de naam heeft onthouden. Je krijgt dan immers een antwoord als: “Je naam is Koen. Dat heb je net verteld! Is er nog iets specifieks waar je meer over wilt weten?”

In een andere conversatie waarin je je naam niet vertelt, zal de chatmodel niet op de vraag kunnen antwoorden wat je naam is. Deze conversatie bijvoorbeeld:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Dan krijg je als antwoord iets als: “Sorry, maar ik ben een chatbot en heb geen toegang tot persoonlijke informatie. Ik ken je naam niet.”

Het is belangrijk om te weten dat elke conversatie die je met het taalmodel voert volledig losstaat van de andere. Dat je eerder je naam verteld hebt in de andere conversatie, is geen informatie die in de nieuwe conversatie beschikbaar is. Het taalmodel kent alleen de algemene informatie waarop het is getraind en de lijst met boodschappen die je eraan doorgeeft. 

Conversaties voeren

Hierboven hebben we de boodschappen in de programmacode gezet. Maar we willen de gebruiker zelf invoer laten geven. Hoe doen we dat? Met nog een extra hulpfunctie, die de lijst met boodschappen opbouwt en telkens nieuwe invoer vraagt en de uitvoer toont. Dat doen we door de basiscode uit te breiden met:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Als je dit programma uitvoert, kun je een vraag intypen en met een druk op Enter doorsturen. De functie converse voegt je vraag als prompt toe aan de lijst met boodschappen in de variabele context. Ook het antwoord van het taalmodel voegt de functie aan de lijst toe en dat antwoord wordt getoond. We blijven in een oneindige lus (met while True) de functie oproepen, waarbij de context telkens wordt uitgebreid met je vraag en het antwoord. Daardoor onthoudt het taalmodel de voorgaande boodschappen en kunnen we een echte conversatie voeren.

Het taalmodel onthoudt zaken die je in eerdere boodschappen hebt verteld.

Conversationele interface

We hebben nu in wezen een eenvoudige interface voor ChatGPT gebouwd in een terminalvenster. Maar we willen hier een conversationele interface van maken om op een gebruiksvriendelijke manier invoer voor een groter programma te verkrijgen. Als voorbeeld nemen we een computerspel, waarbij je in het begin je spelpersonage moet ontwerpen.

Pak een momentje van ontspanning

Met je favoriete spelpersonage

Een spelpersonage bestaat uit enkele eigenschappen, zoals naam, vaardigheid, uitrusting en ras. Het spel zou je dat allemaal in een formulier kunnen laten invullen, maar waarom niet in een conversatie? Dat gaan we in de rest van dit artikel programmeren. Als eerste stap moeten we dus een uitgebreide systeemprompt creëren die de conversatie kadert:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Ja, de systeemprompt moet echt zo lang zijn. Als we niet expliciet zeggen wat de chatbot wel en niet mag doen, krijgen we uiteindelijk niet wat we willen: een JSON-string met de eigenschappen van het personage. 

Doet je programma niet wat het moet doen? Zodra je een taalmodel in je programma integreert, ben je afhankelijk van de grillen van het taalmodel. Het is een zwarte doos, waarvan je niet weet hoe het exact werkt en wat het doet. Dat contrasteert heel sterk met de ijzeren logica van een programmeertaal als Python. Het is dus goed mogelijk dat het programma van dit artikel niet doet wat je wilt, omdat je een net iets andere invoer geeft dan verwacht of omdat OpenAI ondertussen zijn taalmodel een update heeft gegeven die zich anders gedraagt. Je zult dus waarschijnlijk continu je programma moeten testen en de systeemprompt moeten finetunen, zodat het gewenste gedrag behouden blijft. Dat is het nadeel van de flexibiliteit van een taalmodel in je programma’s te integreren.

JSON

Een groot deel van onze systeemprompt bestaat uit instructies om de uiteindelijke keuzes van de gebruiker in de vorm van JSON (JavaScript Object Notation) te geven. Waarom is dat zo belangrijk? Omdat we de rest van ons programma alleen met gestructureerde gegevens kunnen laten omgaan, niet met tekst.

Dus als de gebruiker in een conversatie met onze assistent een speler met de naam Born heeft gekozen, die een orkenschurk is met een boog, dan moet ons programma dit uiteindelijk in de volgende vorm kunnen inlezen:

Converseren naar een doel

Het doel van onze conversatie is dus dat we uiteindelijk een JSON-string als hierboven krijgen, zodat het programma verder kan en we het spel kunnen spelen. We kunnen onze conversatie dus laten stoppen wanneer de uitvoer van de assistent een geldige JSON-string is.

Om JSON in Python te gebruiken, importeer je eerst de gelijknamige bibliotheek helemaal in het begin van het programma:

import json

Daarna komt onze basiscode en de systeemprompt met de uitgebreide instructies van hierboven, en daarna creëren we de volgende functie converse:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Deze functie vraagt dus invoer van de gebruiker, voegt die aan de context toe en stelt de vraag aan de OpenAI-API. Het antwoord van de assistent voegen we aan de context toe.

Daarna probeert de functie om het antwoord van de assistent als een JSON-object in te laden. Lukt dat, dan geeft de functie dit JSON-object terug. Lukt dat niet, dan geeft Python de foutmelding json.decoder.JSONDecodeError terug en reageren we daarop door gewoon het antwoord van de assistent te tonen. Het is dan immers niet het laatste antwoord met de gestructureerde data in JSON-vorm, maar een vraag. In dat geval geeft de functie None terug, omdat de data nog niet volledig zijn.

Gestructureerde data

Hoe maken we nu van die functie converse gebruik? Dat doen we met de volgende code:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

We initialiseren eerst de variabele properties door ze de waarde None te geven. Dan tonen we de eerste boodschap van de assistent, waarin we de gebruiker naar de naam van het spelpersonage vragen.

Daarna roepen we de hele tijd de functie converse met de context aan, zolang de waarde die deze functie teruggeeft None is. Zoals we in die functie gezien hebben, geeft ze een JSON-string terug als de assistent JSON-data teruggeeft en anders None. Als de assistent de instructies correct volgt (zie het kader “Doet je programma niet wat het moet doen?”), stopt de conversatie dus wanneer de data volledig zijn.

Op dat moment wordt de code na het while-blok uitgevoerd. We kunnen nu de eigenschappen van het spelpersonage op een gestructureerde manier uit het JSON-object properties halen. We tonen ze hier één voor één. Uiteraard zou je nog wat controles moeten uitvoeren, zodat er geen ongeldige waardes in staan wanneer het taalmodel niet goed werkt. Maar dat is een oefening voor de lezer!

Onze spelassistent weet dat we met ‘human’ een mens bedoelen en met ‘staf’ een toverstaf, maar negeert in dit geval ons verbod om begeleidende tekst bij de JSON-string te geven.

Lees ook:

▼ Volgende artikel
Waar voor je geld: 5 stoomreinigers voor vloeren voor minder dan 125 euro
© ID.nl
Huis

Waar voor je geld: 5 stoomreinigers voor vloeren voor minder dan 125 euro

In de rubriek Waar voor je geld gaan we een aantal keer per week op zoek naar handige producten met een mooie prijs. Dit keer kijken we naar stoomreinigers voor vloeren. Die zijn er in vele soorten en maten, zowel voor houten en gladde vloeren en voor tapijt. Wij vonden vijf stoomreinigers voor minder dan 125 euro, geschikt voor uiteenlopende vloeren.

Philips OneUp 3000 series XV3101/01

Bij de Philips OneUp 3000 series XV3101/01 krijg jij een elektrische dweil voor vloeren. Dit apparaat is ontworpen als lichte vloerreiniger; het weegt ongeveer 1,75 kg en heeft een slanke steel van 1,42 m. De brede dweilkop van 35 cm en lengte van 12 cm maken het mogelijk om snel grotere oppervlakken te behandelen. In de verpakking worden een dweilpad, een laadkabel en een fles reinigingsmiddel meegeleverd, waardoor jij meteen kunt starten. De pads zijn bedoeld om vuil van harde vloeren op te nemen; er zit geen stofzuigfunctie in het apparaat. Het water‑ en reinigingsmiddel wordt via een geïntegreerd reservoir op de pad verdeeld, zodat jij geen emmer hoeft te gebruiken. De elektrische aandrijving zorgt ervoor dat de pad voor‑ en achteruit beweegt; hierdoor hoef jij minder kracht te zetten bij het dweilen. Doordat het om een elektrisch systeem gaat, is er een netsnoer nodig tijdens het reinigen. Je kunt zelf doseren hoeveel reinigingsmiddel op de pad terecht komt; dit is handig voor verschillende ondergronden. Het apparaat bevat geen kruimelzuiger of stoomfunctie en is uitsluitend bedoeld voor natte reiniging van vloeren. Het compacte formaat maakt het eenvoudig op te bergen wanneer jij klaar bent met schoonmaken.

Op zoek naar alle stoomreinigers? Kijk dan hier!

BLACK + DECKER BHSM15FX08‑QS

Met de BHSM15FX08‑QS krijg je een stoomreiniger die bedoeld is voor harde vloeren en tapijt. In de steel zit een waterreservoir van 50 cl en via de afneembare dweilplaat kun jij eenvoudig laminaat of tegelvloeren aanpakken. Het apparaat werkt met netstroom (230 V) en verbruikt 1500 W. Dankzij de instelbare stoomverdeling pas jij de hoeveelheid stoom aan de ondergrond aan De snoerlengte van 6 m zorgt voor bewegingsvrijheid zonder steeds van stopcontact te wisselen. Voor kleine ruimtes is er koord‑opslag zodat het snoer niet in de weg zit. Je hoeft niet te werken met accu’s; het apparaat heeft geen oplaadfunctie en is niet draadloos. Een warm‑up van ongeveer 20 seconden laat jou snel beginnen. Omdat de stoomreiniger niet continu navulbaar is, moet jij het reservoir eerst laten afkoelen voordat je opnieuw water bijvult. Dit model weegt ruim drie kilogram en is niet inklapbaar; voor wandmontage zijn geen voorzieningen. Door de dweilfunctie met microvezeldoek kun jij het water en stoom over de vloer verdelen zonder dat er water opzuigt wordt; vloeistoffen opzuigen kan het apparaat namelijk niet

Reviewscores op Kieskeurig.nl

Op Kieskeurig.nl kunnen consumenten reviews schrijven over producten. Elke review moet voldoen aan kwaliteitscriteria: de reviewer moet aangeven of het product gekocht, gekregen of getest is, er mag geen misleidende taal in staan en de inhoud moet betrouwbaar zijn. Zo worden nep- of spamreacties tegengegaan. Bij de beoordeling zie je niet alleen het gemiddelde cijfer, maar ook hoeveel reviews er zijn. Zo krijg je meteen een indruk of de score op basis van één enkele review is of op basis van veel gebruikerservaringen. Kijk ook eens op www.review.nl welke producten jij zelf allemaal kunt testen!

BLACK + DECKER BHSM168D‑QS inclusief accessoires

De BHSM168D‑QS is een stoommop met meerdere accessoires waarmee jij harde vloeren en tapijten kunt reinigen. Een vermogen van 1600 W verwarmt water in ongeveer 20 seconden tot stoom. Het apparaat is niet draadloos; via een snoer van 6 m heb jij bereik zonder veel van stopcontact te wisselen. De stoomkracht is traploos regelbaar en de stoomverdeling is instelbaar, waardoor jij per vloer de juiste hoeveelheid stoom kiest. Handige details zijn het aan‑uit‑schakelaartje aan de handgreep en het koord‑opbergvak. De waterindicator laat zien hoe vol het 50 cl reservoir is en het apparaat kan tijdens het reinigen continu worden bijgevuld. Een afneembaar waterreservoir maakt vullen en schoonmaken eenvoudiger. De stoommop is niet inklapbaar en heeft geen automatische snoeroprol, maar bij de accessoires zitten microvezeldoeken, een tapijtglijder en opzetstukken voor ramen of voegen. De stoomreiniger beschikt niet over een kinderslot, maar er is wel een aan‑uit‑schakelaar en veiligheidsschakelaar. Het model gebruikt netstroom en is niet oplaadbaar

BLACK + DECKER FSMH13E5 2‑in‑1 stoomreiniger

De FSMH13E5 combineert een stoommop en handstomer in één apparaat. Jij reinigt harde vloeren met een snoerlengte van 4,8 m en een waterreservoir van 50 cl. Het 1300 W verwarmingselement produceert stoom en dankzij de regelbare stoomkracht pas jij het niveau aan. Er zit een instelbare stoomverdeling zodat je de stoom gericht kunt afgeven. De stomer heeft een waterniveau‑indicator en een aan‑uit‑schakelaar, maar geen automatische snoeroprol of kinderslot. Handig is de koord‑opslagruimte zodat het snoer niet op de vloer slingert. Het waterreservoir kan worden afgenomen; daardoor vul jij het onder de kraan en klik je het daarna weer vast. Omdat de reiniger niet draadloos en niet oplaadbaar is, gebruik jij hem altijd met netstroom. De specificaties noemen een gebruiksduur van circa 15 minuten per volle watertank. Het apparaat heeft geen inklapbaar handvat en geen continu navulbaar systeem. Volgens de productinformatie is het een 2‑in‑1 stoomreiniger die zowel vlakke vloeren als moeilijk bereikbare plekken kan behandelen.

Kärcher SC 2 EasyFix Cylinder Steam Cleaner – 1500 W

De Kärcher SC 2 EasyFix Cylinder Steam Cleaner is een cilinder‑stoomreiniger die speciaal gemaakt is voor harde vloeren. Met een vermogen van 1500 W en een maximale stoomdruk van 3 bar wordt water binnen zes minuten omgezet in stoom. Jij gebruikt een waterreservoir van 1 liter; er zijn geen accu’s, dus de reiniger werkt via het lichtnet. De cilinderconstructie heeft een lengte van 38 cm, een breedte van 25,4 cm en een hoogte van 26 cm. Met een gewicht van 2,9 kg is hij relatief licht en daardoor gemakkelijk te verplaatsen. Het snoer van 4 m en een lange slang geven jou bewegingsvrijheid. Het apparaat beschikt niet over een zuigfunctie en kan geen vloeistoffen opzuigen; je gebruikt hem uitsluitend voor stoomreiniging. De warm‑up van 6 minuten betekent dat jij even moet wachten voordat de eerste stoom beschikbaar is. Het model is niet oplaadbaar, maar door het grote reservoir kun jij langere tijd achter elkaar stomen. Een verwijderbare microvezeldoek bevestig je via het EasyFix‑kliksysteem aan de vloerzuigmond. De stoomsterkte is niet regelbaar, waardoor je de hoeveelheid stoom niet kunt aanpassen. Bij het apparaat worden verschillende mondstukken meegeleverd voor bijvoorbeeld voegen of een vloeroppervlak.

▼ Volgende artikel
Black Friday 2025 met ZinVolt: hét moment om slim te starten met energieopslag
Energie

Black Friday 2025 met ZinVolt: hét moment om slim te starten met energieopslag

Black Friday is dit jaar méér dan een dag vol gadgets en grote schermen. Voor wie zonnepanelen heeft en slimmer wil omgaan met eigen energie, is het hét moment om een thuisbatterij te overwegen. Zeker nu de ZinVolt Power tijdelijk met 15 procent korting verkrijgbaar is. In dit artikel lees je hoe de energieregels richting 2027 veranderen en wat een plug & play-thuisbatterij voor je kan betekenen.

Partnerbijdrage - in samenwerking met ZinVolt

Black Friday is al jaren het moment waarop mensen grote aankopen doen. Maar in 2025 verschuift de aandacht merkbaar: steeds meer huishoudens kijken niet naar tv’s of laptops, maar naar manieren om hun energierekening te verlagen. En dat heeft alles te maken met de salderingsregeling die in 2027 stopt, stijgende terugleverkosten en het groeiende besef dat je met een thuisbatterij veel van je eigen zonnestroom kunt vasthouden.

In die context introduceert ZinVolt dit jaar een aantrekkelijke Black Friday-deal: 15 procent korting op de ZinVolt Power, een draagbare thuisbatterij die je in één minuut installeert. Daarmee wordt de stap naar energieopslag niet alleen eenvoudiger, maar ook financieel een stuk aantrekkelijker.

Let op: deze aanbieding is geldig tot en met 1 december, dus wees er snel bij!

©ZinVolt

Waarom juist nú interessant?

Als je zonnepanelen hebt, weet je hoe grillig de energiemarkt geworden is. Overdag lever je vaak méér terug dan je zelf nodig hebt, terwijl je ’s avonds juist weer stroom moet inkopen tegen een hoger tarief. Tot eind 2026 kun je dat nog deels wegstrepen dankzij de salderingsregeling, maar die regeling loopt richting zijn einde. Vanaf 2027 krijg je alleen nog een beperkte vergoeding voor wat je terug het net in stuurt.

Dat betekent dat je steeds minder hebt aan 'gratis' teruglevering en steeds meer aan het zelf gebruiken van je eigen stroom. Een thuisbatterij maakt dat mogelijk. En als je die aanschaf toch al overwoog, dan is deze aanbieding met 15 procent korting natuurlijk het ideale moment om in te stappen.

Subsidies en regelingen in 2026

Een landelijke subsidie voor thuisbatterijen wordt in 2026 niet verwacht. Maar als je een thuisbatterij combineert met een dynamisch energiecontract, kun je de 21 procent btw terugvragen. Dat voordeel maakt de stap aanzienlijk interessanter. Daarnaast loont het om lokale regelingen te controleren: sommige gemeentes bieden namelijk tijdelijke ondersteuning.

©ZinVolt

ZinVolt Power: een kleine batterij met groot effect

De ZinVolt Power is anders dan de meeste thuisbatterijen. Traditionele systemen hebben bijvoorbeeld installatie in de meterkast nodig en kampen vaak met lange levertijd. De ZinVolt Power werkt echter volledig plug & play. Je steekt hem in het stopcontact, koppelt de P1-dongle aan je slimme meter en hij begint direct met laden. Binnen één minuut actief, zonder gereedschap of installateur. Bovendien heb je hem na bestelling de volgende dag al binnen!

Met een capaciteit van 1 kWh, uit te breiden tot 6 kWh via de losse ZinVolt Mates, kun je precies zo veel opslaan als past bij je huishouden. Overdag laad je op terwijl je zonnepanelen produceren, ’s avonds gebruik je diezelfde energie zelf. Daarnaast kan de Power via de drie ingebouwde stopcontacten als noodstroomvoorziening dienen; ideaal bij een storing of werkzaamheden aan het net.

Het grootste voordeel? Je hoeft niet meteen groot in te stappen. Je kunt klein beginnen en later rustig uitbreiden. En tijdens Black Friday pak je daarmee ook direct de laagste prijs van het jaar mee!

De ZinVolt Power in het kort

Plug & play: Sluit 'm aan via de P1-dongle, binnen één minuut actief

Uitbreidbaar: Vergroot de capaciteit tot 6 kWh met extra ZinVolt Mates

Slim laden: Laadt automatisch tijdens goedkope uren, levert stroom tijdens piekuren

Noodstroomfunctie: Drie ingebouwde stopcontacten houden je belangrijkste apparaten draaiend bij een storing

Draagbaar en stil: Geschikt voor thuis, camping of werkplaats

©ZinVolt


Persoonlijk advies van ZinVolt

Weet je nog niet precies wanneer voor jou het juiste moment is? Dan kun je bij ZinVolt vrijblijvend een gesprek inplannen. Samen kijk je naar je verbruik, zonnepanelen en toekomstplannen. Geen verkooppraat, gewoon duidelijkheid.

Meer weten?

Vraag hier vrijblijvend een adviesgesprek met ZinVolt aan!