74 999 läst · 397 svar
75k läst
397 svar
Prata med IVT 490
=====================ivtlogger.py=======================
import serial #pip3 install pyserial
# https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3-4/
import csv
INFLUXDB_TOKEN="ixSkaffaEgetTokenPåInfluxdbLKJQWELRKJQWLERJKQWLERJQWLKERJ=="
import influxdb_client, os, time
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
token = INFLUXDB_TOKEN
org = "per@lengquist.se"
url = "https://westeurope-1.azure.cloud2.influxdata.com"
client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)
bucket="ivt"
write_api = client.write_api(write_options=SYNCHRONOUS)
field_names=['To radiators GT1','Outdoor GT2','Tap water top GT3-1','Warm water mid GT3-2','Warm water bottom GT3-3','field6','Hot gas GT6','field8','Pressure guard defrost','High pressure','Low pressure','Vacation state on','Compressor active','Schunt Opening SV1','Schunt Closing SV1','Radiator pump P1','Fan','Alarm','Extern P2','LLT GT1','LL GT1','Target Radiator out GT1','UL GT1','LL GT3:2','ULT GT3:2','UL GT3:2','LL GT3:3','BV GT3:3','SV3 BV Foerskj','Effekt ink vit VV behov','Tillskotstimer VV behov','Tappv prio','Elpatron varme','Tillskott rad','Elpatron extra vv','Default SV2 Open']
with open('ivtdata.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(field_names)
ser = serial.Serial ("/dev/ttyS0", 9600) #Use raspi-config to enable serial and disable serial console.
# https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3-4/
while True:
received_data = ser.readline()
print(received_data)
s = received_data.decode('ascii')
#print(s)
values=[]
for x in s.split(';'):
values.append(int(x.strip()))
#print (values)
writer.writerow(values)
f.flush()
write_api.write(bucket=bucket, org=org, record=[
Point("Heating").field("heating", values[1]/10),
Point("Outdoor").field("outdoor", values[2]/10),
Point("Compressor").field("compressor", values[7]/10),
Point("Compresson On").field("comp_on", values[13]),
Point("SV1 Open").field("sv1_open", values[14]),
Point("SV1 Close").field("sv1_close", values[15]),
Point("DesiredHeating").field("desired_heating", values[22]/10)])
write_api.write(bucket=bucket, org=org, record=[
Point("Heatpump").field("Sekvensnr", values[0]),
Point("Heatpump").field("To radiators GT1", values[1]),
Point("Heatpump").field("Outdoor GT2", values[2]),
Point("Heatpump").field("Tap water top GT3-1", values[3]),
Point("Heatpump").field("Warm water mid GT3-2", values[4]),
Point("Heatpump").field("Warm water bottom GT3-3", values[5]),
Point("Heatpump").field("field6", values[6]),
Point("Heatpump").field("Hot gas GT6", values[7]),
Point("Heatpump").field("field8", values[8]),
Point("Heatpump").field("Pressure guard defrost", values[9]),
Point("Heatpump").field("High pressure", values[10]),
Point("Heatpump").field("Low pressure", values[11]),
Point("Heatpump").field("Vacation state on", values[12]),
Point("Heatpump").field("Compressor active", values[13]),
Point("Heatpump").field("Shunt Opening SV1", values[14]),
Point("Heatpump").field("Shunt Closing SV1", values[15]),
Point("Heatpump").field("Radiator pump P1", values[16]),
Point("Heatpump").field("Fan", values[17]),
Point("Heatpump").field("Alarm", values[18]),
Point("Heatpump").field("Extern P2", values[19]),
Point("Heatpump").field("LLT GT1", values[20]),
Point("Heatpump").field("LL GT1", values[21]),
Point("Heatpump").field("Target Radiator out GT1", values[22]),
Point("Heatpump").field("UL GT1", values[23]),
Point("Heatpump").field("LL GT3:2", values[24]),
Point("Heatpump").field("ULT GT3:2", values[25]),
Point("Heatpump").field("UL GT3:2", values[26]),
Point("Heatpump").field("LL GT3:3", values[27]),
Point("Heatpump").field("BV GT3:3", values[28]),
Point("Heatpump").field("SV3 BV Foerskj", values[29]),
Point("Heatpump").field("Effekt ink vit VV behov", values[30]),
Point("Heatpump").field("Tillskotstimer VV behov", values[31]),
Point("Heatpump").field("Tappv prio", values[32]),
Point("Heatpump").field("Elpatron varme", values[33]),
Point("Heatpump").field("Tillskott rad", values[34]),
Point("Heatpump").field("Elpatron extra vv", values[35]),
Point("Heatpump").field("Default SV2 Open", values[36]) ])
print("Posted!")
======================ivtlogger.service================================
[Unit]
Description=Read IVT log data over UART and post to InfluxDB
After=network.target
[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/ivt_logger.py
Restart=always
WorkingDirectory=/home/pi/
[Install]
WantedBy=multi-user.target
## located in /lib/systemd/system/ivt_logger.service
import serial #pip3 install pyserial
# https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3-4/
import csv
INFLUXDB_TOKEN="ixSkaffaEgetTokenPåInfluxdbLKJQWELRKJQWLERJKQWLERJQWLKERJ=="
import influxdb_client, os, time
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
token = INFLUXDB_TOKEN
org = "per@lengquist.se"
url = "https://westeurope-1.azure.cloud2.influxdata.com"
client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)
bucket="ivt"
write_api = client.write_api(write_options=SYNCHRONOUS)
field_names=['To radiators GT1','Outdoor GT2','Tap water top GT3-1','Warm water mid GT3-2','Warm water bottom GT3-3','field6','Hot gas GT6','field8','Pressure guard defrost','High pressure','Low pressure','Vacation state on','Compressor active','Schunt Opening SV1','Schunt Closing SV1','Radiator pump P1','Fan','Alarm','Extern P2','LLT GT1','LL GT1','Target Radiator out GT1','UL GT1','LL GT3:2','ULT GT3:2','UL GT3:2','LL GT3:3','BV GT3:3','SV3 BV Foerskj','Effekt ink vit VV behov','Tillskotstimer VV behov','Tappv prio','Elpatron varme','Tillskott rad','Elpatron extra vv','Default SV2 Open']
with open('ivtdata.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(field_names)
ser = serial.Serial ("/dev/ttyS0", 9600) #Use raspi-config to enable serial and disable serial console.
# https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3-4/
while True:
received_data = ser.readline()
print(received_data)
s = received_data.decode('ascii')
#print(s)
values=[]
for x in s.split(';'):
values.append(int(x.strip()))
#print (values)
writer.writerow(values)
f.flush()
write_api.write(bucket=bucket, org=org, record=[
Point("Heating").field("heating", values[1]/10),
Point("Outdoor").field("outdoor", values[2]/10),
Point("Compressor").field("compressor", values[7]/10),
Point("Compresson On").field("comp_on", values[13]),
Point("SV1 Open").field("sv1_open", values[14]),
Point("SV1 Close").field("sv1_close", values[15]),
Point("DesiredHeating").field("desired_heating", values[22]/10)])
write_api.write(bucket=bucket, org=org, record=[
Point("Heatpump").field("Sekvensnr", values[0]),
Point("Heatpump").field("To radiators GT1", values[1]),
Point("Heatpump").field("Outdoor GT2", values[2]),
Point("Heatpump").field("Tap water top GT3-1", values[3]),
Point("Heatpump").field("Warm water mid GT3-2", values[4]),
Point("Heatpump").field("Warm water bottom GT3-3", values[5]),
Point("Heatpump").field("field6", values[6]),
Point("Heatpump").field("Hot gas GT6", values[7]),
Point("Heatpump").field("field8", values[8]),
Point("Heatpump").field("Pressure guard defrost", values[9]),
Point("Heatpump").field("High pressure", values[10]),
Point("Heatpump").field("Low pressure", values[11]),
Point("Heatpump").field("Vacation state on", values[12]),
Point("Heatpump").field("Compressor active", values[13]),
Point("Heatpump").field("Shunt Opening SV1", values[14]),
Point("Heatpump").field("Shunt Closing SV1", values[15]),
Point("Heatpump").field("Radiator pump P1", values[16]),
Point("Heatpump").field("Fan", values[17]),
Point("Heatpump").field("Alarm", values[18]),
Point("Heatpump").field("Extern P2", values[19]),
Point("Heatpump").field("LLT GT1", values[20]),
Point("Heatpump").field("LL GT1", values[21]),
Point("Heatpump").field("Target Radiator out GT1", values[22]),
Point("Heatpump").field("UL GT1", values[23]),
Point("Heatpump").field("LL GT3:2", values[24]),
Point("Heatpump").field("ULT GT3:2", values[25]),
Point("Heatpump").field("UL GT3:2", values[26]),
Point("Heatpump").field("LL GT3:3", values[27]),
Point("Heatpump").field("BV GT3:3", values[28]),
Point("Heatpump").field("SV3 BV Foerskj", values[29]),
Point("Heatpump").field("Effekt ink vit VV behov", values[30]),
Point("Heatpump").field("Tillskotstimer VV behov", values[31]),
Point("Heatpump").field("Tappv prio", values[32]),
Point("Heatpump").field("Elpatron varme", values[33]),
Point("Heatpump").field("Tillskott rad", values[34]),
Point("Heatpump").field("Elpatron extra vv", values[35]),
Point("Heatpump").field("Default SV2 Open", values[36]) ])
print("Posted!")
======================ivtlogger.service================================
[Unit]
Description=Read IVT log data over UART and post to InfluxDB
After=network.target
[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/ivt_logger.py
Restart=always
WorkingDirectory=/home/pi/
[Install]
WantedBy=multi-user.target
## located in /lib/systemd/system/ivt_logger.service
Redigerat:
Jag behövde konvertera spänningsnivåerna för den seriella kommunikationen mellan värmepumpens kontrollerkort och Raspberryins GPIO-ingång. Löste det med en transistor och två resistorer.
Minns inte exakt hur jag kopplade, men prata med någon som kan lite om transistorer och seriella protokoll (tex skillnad mellan RS-232 och UART). Det var inte avancerat.
Här är lite blandade anteckningar jag gjorde när jag konfigurerade raspberryn och skrev koden:
https://manpages.debian.org/testing/systemd/systemd.service.5.en.html
journalctl -u ivt_logger
sudo service ivt_logger restart
pip install pyserial
sudo pip3 install pyserial
sudo pip3 install wiringpi
pip3 install influxdb-client
nohup python3 serial_readline.py > nohup2.out &
export INFLUXDB_TOKEN=ixqSkaffaEnEgenTokenPåInfluxdbLKJWROIWUEROIUAWDFIAWECCJOQWEEFIJ==
sudo service ivt_logger restart
https://blog.usedbytes.com/2019/11/run-at-startup-without-rc.local/
https://github.com/raspberrypi/docu...22fb56b30e4d62c5ccba24/linux/usage/systemd.md
Minns inte exakt hur jag kopplade, men prata med någon som kan lite om transistorer och seriella protokoll (tex skillnad mellan RS-232 och UART). Det var inte avancerat.
Här är lite blandade anteckningar jag gjorde när jag konfigurerade raspberryn och skrev koden:
https://manpages.debian.org/testing/systemd/systemd.service.5.en.html
journalctl -u ivt_logger
sudo service ivt_logger restart
pip install pyserial
sudo pip3 install pyserial
sudo pip3 install wiringpi
pip3 install influxdb-client
nohup python3 serial_readline.py > nohup2.out &
export INFLUXDB_TOKEN=ixqSkaffaEnEgenTokenPåInfluxdbLKJWROIWUEROIUAWDFIAWECCJOQWEEFIJ==
sudo service ivt_logger restart
https://blog.usedbytes.com/2019/11/run-at-startup-without-rc.local/
https://github.com/raspberrypi/docu...22fb56b30e4d62c5ccba24/linux/usage/systemd.md
Om du sparar data på SD-kortet så kommer det inte att överleva längre än något år. Jag har därför en ESP i min IVT (ren spänningsdelning från 5V till 3,3V). Sedan läser jag in all data till en Raspberry pi med SSD centralt istället. Och skaffar du dig en ESP på har du två saker att styra med reläer också:
- sommardrift (kortslutning av två skruvplintar). Undviker att dra igång värmen i onödan.
- gt 3:2 (tempsensor i tanken) som du kan växla mellan 65°C och verklig temperatur. Det är denna som styr när kompressorn går igång. Perfekt om man vill styra kompressorn till billiga timmar.
Läs mer om hur du gör detta tidigare i tråden...
- sommardrift (kortslutning av två skruvplintar). Undviker att dra igång värmen i onödan.
- gt 3:2 (tempsensor i tanken) som du kan växla mellan 65°C och verklig temperatur. Det är denna som styr när kompressorn går igång. Perfekt om man vill styra kompressorn till billiga timmar.
Läs mer om hur du gör detta tidigare i tråden...
Redigerat:
Om du syftar på min kod är det bara att ta bort raden:pacman42 skrev:
writer.writerow(values)
så sparas mätdata bara på Influxdb. Det är en molntjänst så då används SD-kortet minimalt.
Intressant att styra om tempsensorer för att få IVTn att dra mindre el när det är dyrt. Måste man inte styra om både GT3:2 och utomhussensorn, så att den tror att varken varmvatten eller värmevatten behövs? Jag ska leta upp den diskussionen tidigare i tråden, låter intressant.
För övrigt gissar jag att det som går att styra med en ESP32 även går att styra med en Raspberrrys GPIO. Jag gillar egentligen microcontrollers bättre än Raspberry, men en Rasp kändes lättare att använda när man ska anropa ett API över HTTP.
Värmen styrs via semesterläge, dvs kortslutning av två skruvplintar. Så man behöver inte styra utetemperaturen.
Det finns bra http-bibliotek till ESP också. Jag har dock en central hjärna på en Raspberry som styr hela huset. Jag gillar att ha dumma klienter
Det finns bra http-bibliotek till ESP också. Jag har dock en central hjärna på en Raspberry som styr hela huset. Jag gillar att ha dumma klienter
Vågade du gå vidare med den här lösningen? Min fläkt stod inställd på 150V. Testade både 180V och 230V manuellt genom att flytta kabeln men det blev ingen märkbar skillnad så för mig skulle det inte förbättra något att kunna styra hastigheten. Det kan ju vara värt för dig att testa manuellt först för att se om du märker någon skillnad, annars antar jag att fläkten i IVT 490 helt enkelt är för klen för att kunna forcera ventilationen rejält som man skulle vilja ibland.A ArttuP skrev:
Jag tänker ju tvärtom, dvs att jag ställer ned den när ingen är hemma och om det är tillräckligt torrt i badrummen.S Sp1nd3l skrev:Vågade du gå vidare med den här lösningen? Min fläkt stod inställd på 150V. Testade både 180V och 230V manuellt genom att flytta kabeln men det blev ingen märkbar skillnad så för mig skulle det inte förbättra något att kunna styra hastigheten. Det kan ju vara värt för dig att testa manuellt först för att se om du märker någon skillnad, annars antar jag att fläkten i IVT 490 helt enkelt är för klen för att kunna forcera ventilationen rejält som man skulle vilja ibland.
Produkter som diskuteras i tråden