woensdag 11 mei 2022
  13 Replies
  708 Visits
Ik wil een programma maken om een elektra boiler met 2 elementen van 800 Watt in te schakelen als er voldoende stroom door mijn zonnepanelen wordt opgewekt.
De Youless energiemeter geeft het actuele vermogen (verbruik -/- opgewekt) weer, als er meer wordt opgewekt dan gebruikt is deze waarde negatief.
Ik heb het stukje code waar in ik het actuele vermogen (nu nog handmatig ingevoerd) afzet tegen het vermogen van de boiler en op basis daarvan de boiler wel of niet inschakel (2 stappen) al klaar en het lijkt er op dat dat werkt.
Het enige wat ik niet voor elkaar krijg ( dat komt door mijn beperkte programmeer kennis) is het inlezen van het actuele vermogen uit de Youless in een variabele.
Ter info mijn youless is beveiligd met een wachtwoord.
Ik heb al heel veel gespeurd op internet en gegevens uit de youless inlezen en in een bestand zetten is wel te vinden maar een enkele waarde in een variabele zetten is me nog niet gelukt.
Wie kan en wil me helpen ???
1 maand geleden
·
#22321
"Ik heb al heel veel gespeurd op internet en gegevens uit de youless inlezen en in een bestand zetten is wel te vinden"
"Ik heb het stukje code waar in ik het actuele vermogen (nu nog handmatig ingevoerd) afzet tegen het vermogen van de boiler en op basis daarvan de boiler wel of niet inschakel (2 stappen) al klaar en het lijkt er op dat dat werkt."

Wat is nu het probleem nog?? U hebt gegevens in een bestand. U wilt weten hoeveel energie de boiler op een bepaald moment gebruikt. Staat die informatie in dat bestand? Zo nee, wat staat er dan in dat bestand?
1 maand geleden
·
#22326
Het probleem is dat ik van ui Python nog helemaal niets heb kunnen uitlezen.
Ik weet daarvoor onvoldoende van Python, wel heb ik het stuk code om de waardes te vergelijken en de boiler al of niet in te schakelen gebouwd en dat werkt.
Wat nog ontbreekt is een stukje code dat via een intern IP adres verbinding maakt met de Youless en het huidige energie verbruik ophaalt en in een variabele stopt.
Het huidige energie verbruik kan zowel positief, je gebuikt dan energie uit het net, als negatief, je levert dan energie aan het net, zijn.
Ik weet dat als je vanuit een browser het ip adres + /a (b.v. 192.168.1.xx/a) wegstuurt er een dump uit de Youless komt in Json waar meer informatie in zit maar de waarde PWR is daar wel uit te filteren.
Ik weet alleen niet hoe ik dat vanuit Python moet doen.

Ik zou erg blij zijn al u me daarmee kunt helpen.
1 maand geleden
·
#22330
U schreef:
"Ik heb al heel veel gespeurd op internet en gegevens uit de youless inlezen en in een bestand zetten is wel te vinden..."
U schreef:
"Wat nog ontbreekt is een stukje code dat via een intern IP adres verbinding maakt met de Youless en het huidige energie verbruik ophaalt en in een variabele stopt."

Ik begrijp het probleem nog niet helemaal.
1 maand geleden
·
#22331
Wat zie je met dit script?:

#!/usr/bin/python3

import struct
import urllib.request

try:
url="http://url.van.youless"
page=urllib.request.urlopen(url)
data=page.read().decode("utf-8")
print(data)
except Exception as e:
print(e)



(Wel even de juiste url gebruiken)
1 maand geleden
·
#22332
Aan Daan de Man

Kennelijk ben ik dan niet duidelijk genoeg geweest.
Het komt op het volgende neer.
Ik wil 2 elektrische verwarmingselementen van 800 watt elk (een elektra boiler) aansturen met een Raspberry.
Dat aan sturen moet gebeuren op basis van opgewekte energie met zonnepanelen.
Om te bepalen of er opgewekte energie is gebruik ik een Youless energie meter die is aangesloten op een slimme meter en een KWh meter die de energie die de zonnepanelen op weken meet.
De Youless berekend uit de aangeboden gegevens (slimme meter en de KWh meter van de zonnepanelen) onder andere de hoeveelheid energie die uit het net word onttrokken of juist wordt terug geleverd (Youless noemt dat PWR)
Is die waarde positief dan onttrek je energie uit het net, is de waarde negatief dan lever je stroom aan het net.
Om er voor te zorgen dat de boiler alleen in bedrijf komt als er voldoende energie wordt opgewekt ( de PWR waarde moet meer dan -800 zijn b.v. -825) heb ik in Python een stukje code geschreven die de waarde PWR kan vergelijken met 800 (het vermogen van een boiler element), is de waarde PWR -825 dan wordt een element ingeschakeld, de PWR waarde zal dan zakken tot -25 omdat er 800 Watt van de opgewekte energie wordt gebruikt voor de boiler.
Wordt er veel energie opgewekt en terug geleverd, de PWR waarde is b.v. -1700 dan zal na inschakeling van 1 element (-1700 - 800) nog 900 watt over zijn (PWR is dan -900).
Het Python programma controleert na inschakelen van het eerst element opnieuw de PWR waarde en als er nog steeds voldoende energie wordt opgewekt (in het genoemde rekenvoorbeeld -900) dan zal het 2e element worden ingeschakeld.
De genoemde controle zit in een loop en wordt elke 2 of 3 minuten herhaald zodat er doorlopend controle is op de opgewekte energie, zo gauw de PWR waarde positief dreigt te worden wordt een element uitgeschakeld en eventueel ook het 2e.
tot zover heb ik alles klaar en het lijkt te werken alleen voer ik nu nog steeds een PWR waarde met de hand in, het is me nog niet gelukt om die waarde uit te Youless in te lezen.
Bijkomend probleem is dat mijn Youless met een wachtwoord werkt, voor dat de PWR waarde kan worden ingelezen moet eerst het wachtwoord naar de Youless worden gestuurd.
Ik heb wel al ergens een stukje code gekregen dat van uit de commande promt van de Raspberry werkt, zie hieronder.
Ook ben ik erachter dat de Youless met een cookie werkt.
Bij de code hieronder kan eenmaal het wachtwoord verstuurd worden, de cookie wordt dan in een tekst file opgeslagen en kan de hele dag gebruikt worden.
Om middernacht wordt hij gewist en moet er opnieuw een wachtwoord verstuurd worden.

curl -s -c cookies.txt 192.168.1.xx/L?w=hetwachtwoord (hetwachtwoord = het wacht woord van de Youless)
curl -s -b cookies.txt 192.168.1.xx/a?f=j (het IP adres moet worden aangepast aan het IP adres van de Youless)

het antwoord van de Youless is dan een Json string.

{"cnt":" 1421,626","pwr":162,"lvl":0,"dev":"","det":"","con":"","sts":"","cs0":" 7006,191","ps0":56,"raw":0d

Hier is de PWR waarde 162, er wordt dus 162 Watt uit het net gebruikt.
Wat me tot nu toe niet gelukt is, is de code die hierboven staat en dus van uit de commande promt wordt ingevoerd zo aan te passen dat hij ook in het Python programma werkt.
De reden is dat ik onvoldoende kennis van Python heb, als ik de Json string in het Python programma kan inlezen en in een variabele (b.v. PWR) dan kan ik me met de rest redden want dat is al voor 99% klaar.

Groet, Gerrit
1 maand geleden
·
#22334
Deadbeef,

Ik heb de code uitgevoerd maar krijg de volgende melding

<urlopen error [Errno 111] Connection refused>

Kan dat komen omdat de Youless met een wachtwoord werkt.??


Van Youless heb ik inmiddels een stukje code gekregen dat vanuit de commando promt van de Raspberry kan worden uitgevoerd.
het antwoord van de Youless is dan een Json string.
Bij het versturen van het wachtwoord geeft de Youless een Cookie die in onderstaande code in een tekst file wordt opgeslagen.

curl -s -c cookies.txt 192.168.1.xx/L?w=hetwachtwoord
curl -s -b cookies.txt 192.168.1.xx/a?f=j

{"cnt":" 1421,626","pwr":162,"lvl":0,"dev":"","det":"","con":"","sts":"","cs0":" 7006,191","ps0":56,"raw":0d}

Misschien is dit om te bouwen naar Python, het zou dan wellicht met PyCurl moeten werken.
De Json string moet dan in een variabele komen te staan

Al vast dank voor je reactie.
1 maand geleden
·
#22335
Ik heb je json-string iets ingekort.


import json

data=" {\"cnt\":\" 1421,626\",\"pwr\":162,\"lvl\":0,\"dev\":\"\",\"det\":\"\",\"con\":\"\",\"sts\":\"\",\"cs0\":\" 7006,191\",\"ps0\":56}"

d=json.loads(data)
print(d["pwr"])


json.loads maakt een dictionary, met de key pwr krijg je je gewenste waarde.
1 maand geleden
·
#22336
Probleem blijft nog steeds dat ik de string alleen kan inlezen via de commando promt van de Raspberry, het moet dus van uit een Python programma
1 maand geleden
·
#22337
Aan de curl-commando's te zien lijkt het er op[1] dat je met de eerste aanroep je authoriseert (met je password), daar een cookie bij terugkrijgt, en met de tweede aanroep dat cookie gebruikt om de data daadwerkelijk op te halen. Hoe je dat je Python doet kan ik niet direct oplepelen.

Misschien kun hier ook met je vraag terecht:
Online Python sessie donderdagavond 19 mei

[1] Ik ken curl niet goed genoeg om iets met zekerheid te zeggen.
1 maand geleden
·
#22338
Dank in ieder geval voor je reactie en hulp. wellicht is de online Python sessie een idee
1 maand geleden
·
#22341
Gelukkig ken ik Curl wel vrij goed en heb ik wat met JSON gestoeid. Helaas ken ik geen Python en heb ik meer met C gestoeid (daar is Curl ook in geschreven).

Als ik u goed begrepen heb, dan krijgt u keurig van die Youless een JSON string terug, waar de gevraagde PWR waarde gewoon leesbaar letterlijk in staat.
Ik snap dus nog steeds niet wat het probleem dan kan zijn.


Wat PyCurl is weet ik ook niet, maar het klinkt alsof het daarmee een fluitje van een Eurocent is. Er moet ook wel een JSON library voor Python te vinden zijn...
1 maand geleden
·
#22350
Ik heb tijdens de online Python sessie niet het antwoord gekregen maar wel zoveel informatie dat ik het probleem inmiddels heb opgelost.
De module requests heeft een functie cookies.get_dict(), hiermee kan de cookies in een variabele worden opgeslagen.
Met onderstaande code werkt het en wordt de waarde die ik wil hebben opgeslagen in pwr.
Ik werk met 3 variabelen url = het ip adres van de Youless
opvr_cookies = het wachtwoord van de Youless
opvr_geg = het commando om de gegevens die ik wil hebben uit de Youless te lezen, dit is een json string.

Dit is de code;

# opvragen van de cookies, cookies worden opgeslagen in session.cookoes.get_dict().
response = session.get(url + opvr_cookies) # url = IPadres opvr_cookies = het wachtwoord
# opvragen data, cookies wordt mee gestuurd.
data = requests.get(url + opvr_data, cookies = (session.cookies.get_dict()) ) # url = IPadres opvr_data = he commando om de data uit de Youless te lezen, met
# (session.cookies.get_dict()) wordt de cookies mee gestuurd.
pwr =json.loads(data.text) # omzetten json string in type 'dict' (dictionary).
pwr = pwr["pwr"] # filteren pwr waarde uit de dictionary.

Dank in ieder geval voor de geboden hulp.

NB pycurl is curl voor python.
1 maand geleden
·
#22351
Ik heb tijdens de online Python sessie niet het antwoord gekregen maar wel zoveel informatie dat ik het probleem inmiddels heb opgelost.


Mooi!
  • Pagina :
  • 1
Er zijn nog geen reacties op dit bericht.
Reageer als een van de eersten op dit bericht!
Nog geen HCC-gebruikersaccount aangemaakt? Klik dan hier.

Inloggen