
PellMon, pelletlogger med öppen källkod
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Mer bilder på hårdvara och ritningar önskas
.

Egor duplomat D1F 1978 Pellx 2001 7.0 Tigex25 Bulkföråd Termomatic ERA
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Fin montering! Liknar precis min gamla pellexskruv (men den var gul...), jag hade en liknande mikrobrytare på den med fjädern mot insexskruven, fast jag limmade fast den på motorhuset rätt och slätt...
För att få pelletförbrukningen behöver du bara aktivera PelletCalc:
[enabled_plugins]
# PelletCalc calculates feeder_time and power from feeder auger revolution count
p07 = PelletCalc
och ange varifrån den ska läsa in skruvvarven:
[plugin_PelletCalc]
# counter = item name to read feeder auger rev count from
counter = ds2460count
(eller vad du har döpt räknaren till i [plugin_OWFS])
...och lägga till feeder_time och feeder_capacity till [pollvalues] så de hamnar i databasen
PelletCalc ger också ett värde på momentaneffekten (power_kW) som kan loggas och ritas upp. Det är väl mera intressant om man kör modulerande effekt, men du skulle se i grafen när brännaren är igång.
Visst kan du använda Calculate plugin för att räkna ut solfångarnas effekt från till- och fråntemperatur (ungefär såhär: "temp_fran;GET;temp_till;GET;SUB;234.43234;MUL") om du antar att flödet är konstant.
Men då pumpen är avstängd så är ju flödet noll så du måste ha en ingång som kollar pumpen, då blir det såhär ungefär:
"0;temp_fran;GET;temp_till;GET;SUB;234.43234;MUL;pump_running;GET;IF"
Och effekten kan du sedan logga och rita en graf på.
Men jag antar att du vill ha effekten integrerad över tid för att få energiproduktionen, på samma sätt som pelletförbrukningen integreras över olika perioder och visas som stapeldiagram. Det är RRDtool som sköter integreringen över tidsperioden för att få pelletförbrukningen, och det är tyvärr ganska 'hårdkodat', dvs det finns nu inget sätt att rita ett stapeldiagram från andra data än (feeder_time*feeder_capacity) ur databasen. Men det låter som en alldeles utmärkt feature-request.
För att få pelletförbrukningen behöver du bara aktivera PelletCalc:
[enabled_plugins]
# PelletCalc calculates feeder_time and power from feeder auger revolution count
p07 = PelletCalc
och ange varifrån den ska läsa in skruvvarven:
[plugin_PelletCalc]
# counter = item name to read feeder auger rev count from
counter = ds2460count
(eller vad du har döpt räknaren till i [plugin_OWFS])
...och lägga till feeder_time och feeder_capacity till [pollvalues] så de hamnar i databasen
PelletCalc ger också ett värde på momentaneffekten (power_kW) som kan loggas och ritas upp. Det är väl mera intressant om man kör modulerande effekt, men du skulle se i grafen när brännaren är igång.
Visst kan du använda Calculate plugin för att räkna ut solfångarnas effekt från till- och fråntemperatur (ungefär såhär: "temp_fran;GET;temp_till;GET;SUB;234.43234;MUL") om du antar att flödet är konstant.
Men då pumpen är avstängd så är ju flödet noll så du måste ha en ingång som kollar pumpen, då blir det såhär ungefär:
"0;temp_fran;GET;temp_till;GET;SUB;234.43234;MUL;pump_running;GET;IF"
Och effekten kan du sedan logga och rita en graf på.
Men jag antar att du vill ha effekten integrerad över tid för att få energiproduktionen, på samma sätt som pelletförbrukningen integreras över olika perioder och visas som stapeldiagram. Det är RRDtool som sköter integreringen över tidsperioden för att få pelletförbrukningen, och det är tyvärr ganska 'hårdkodat', dvs det finns nu inget sätt att rita ett stapeldiagram från andra data än (feeder_time*feeder_capacity) ur databasen. Men det låter som en alldeles utmärkt feature-request.
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
rod02 skrev:Mer bilder på hårdvara och ritningar önskas.
Har inte så väldigt mycket spännande att ta kort på, de flesta givarna sitter bakom isolering eller liknande,tog ett kort på givaren som sitter på fallröret på pelletsbrännaren, som är kopplat till mail varning.
Får ett mail om det blir för varmt, helt enkelt. så att man kan åka hem och starta brandsläckaren


skriver lite sammanfattning av min anläggning, går även att hitta tidigare i tråden.
Jag använder alltså en usb master i grunden,
https://www.m.nu/adapter-usb-1wire-ds9490r-p-49.html
med ett antal givare:
https://www.m.nu/ds18s20-p-52.html
samt en 1/0 som är kopplad till microbrytaren på pelletsskruven.
https://www.m.nu/d2pc-2-io-med-skruvter ... p-256.html
nätet är kopplat med cat5 e kabel, i ett stjärnnät, alltså allt parallellkopplat, någon enstaka givare är kopplad med ekxk. Jag använder inga hubbar eller liknande utan jag litar på min lödkolv i detta läget. inga ledare är med andra ord skruvade eller tvinnade ihop utan lödade med efterföljande krympslangsbehandling.
Vad gäller ritning så är nästa mål att skapa en bild på hemsidan över hela anläggningen schematiskt uppritad. Varje temperaturgivare ska ha en egen ruta på sin placering och däri ska temperaturerna visas momentant/kontinuerligt.
tips mottages tacksamt hur jag ska få till det, inser att jag behöver lära mig javascript och koppla det till webservern med hjälp av någon form av websocket.
någon som vill dela med sig?
återigen, vilket grymt bra program pellmon är, och stort tack till upphovsmannen!!!
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
tappade graferna initialt men efter att jag lade in skruvvarv per 360 sekunder samt kapacitet i webben så började det rita så fint igen!!!
Senast redigerad av bosse123 den tor 06 feb, 2014 23:48, redigerad totalt 1 gånger.
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Vad gäller solfångarnas effekt så är ju en god början att kunna logga och rita en graf.
Då kan jag åtminstone visualisera effekten under samma tidsperiod som temperaturerna ritas, är det så du menar?
Och vad gäller gångtid så får jag fixa ett relä på pumpen till solfångarna och använda "andra sidan" för 1/0 signal till min andra kanal på min ds2460, det får bli helgens uppgift.
och så tänker du att det ska se ut såhär ungefär?
temp_fran = soltemp_fram
temp_till = soltemp_retur
pump_running = owfs3_path = uncached/12.EC0595000000/sensed.B
(och så någon if sats att om sensed.B är lika med 0 så är pump running)
calc1_calc = "0;$temp_fran;GET;$temp_till;GET;SUB;234.43234;MUL;$pump_running;GET;IF"
calc1_read = effekt_solpaneler
[pollvalues]
d20 = calc1_read
[graphcolors]
d20 = ******
och så kanske de är dags efter det att aktivera [scaling] och eller på annat vis få till watt i stället för grader
var lägger jag in min feature. request
?
Då kan jag åtminstone visualisera effekten under samma tidsperiod som temperaturerna ritas, är det så du menar?
Och vad gäller gångtid så får jag fixa ett relä på pumpen till solfångarna och använda "andra sidan" för 1/0 signal till min andra kanal på min ds2460, det får bli helgens uppgift.
och så tänker du att det ska se ut såhär ungefär?
temp_fran = soltemp_fram
temp_till = soltemp_retur
pump_running = owfs3_path = uncached/12.EC0595000000/sensed.B
(och så någon if sats att om sensed.B är lika med 0 så är pump running)
calc1_calc = "0;$temp_fran;GET;$temp_till;GET;SUB;234.43234;MUL;$pump_running;GET;IF"
calc1_read = effekt_solpaneler
[pollvalues]
d20 = calc1_read
[graphcolors]
d20 = ******
och så kanske de är dags efter det att aktivera [scaling] och eller på annat vis få till watt i stället för grader
var lägger jag in min feature. request

Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Ungefär så, men mera exakt:
[plugin_OWFS]
sdfsd_item = soltemp_fran
sdfsd_path = 10.67C6697351FF/temperature
dffsd_item = soltemp_retur
dffsd_path = 10.67C6697351FF/temperature
gdfs_item = pump_running
gdfs_path = 12.EC0595000000/sensed.B
[plugin_Calculate]
fdsa_calc = pump_running;GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
fdsa_read = effekt_solpaneler
[pollvalues]
d20 = effekt_solpaneler
[graphcolors]
d20 = ******
Skalningen fixas av den magiska konstanten i: "21.45;MUL", värdet på den kan variera...
Jag ska bena ut exekveringen av uttrycket så blir det säkert klarare hur det fungerar:
1:
stack=[]
calc=pump_running;GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
...'pump_running' är inte en operator, så pusha det till stacken
2:
stack=['pump_running']
calc=GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
...kör 'GET' kommandot = ta bort översta värdet från stacken, läs in data från en datapunkt med namnet som kom från stacken, pusha resultatet (1) tillbaka till stacken
3:
stack=[1]
calc=soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
'soltemp_fran' är inte en operator, så pusha det till stacken
4:
stack=[1, 'soltemp_fran']
calc=GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
... kör GET
5:
stack=[1, 70.6]
calc=soltemp_retur;GET;SUB;21.45;MUL;0;IF
6:
stack=[1, 70.6, 'soltemp_retur']
calc=GET;SUB;21.45;MUL;0;IF
7:
stack=[1, 70.6, 34.1]
calc=SUB;21.45;MUL;0;IF
... kör SUB kommandot = ta två värden från stacken, subtrahera dem, pusha resultatet tillbaka till stacken
8:
stack=[1, 36.5]
calc=21.45;MUL;0;IF
9:
stack=[1, 36.5, 21.45]
calc=MUL;0;IF
... kör MUL kommandot = ta två värden från stacken, multiplicera dem, pusha resultatet tillbaka till stacken
10:
stack=[1, 782.925]
calc=0;IF
11:
stack=[1, 782.925, 0]
calc=IF
... kör 'IF' kommandot = ta tre värden från stacken, om det tredje är '1', pusha tillbaka det andra värdet (782.925), annars pusha tillbaka det första värdet (0).
12:
stack=[782.925]
calc=
'calc' är tom, returnera värdet längs upp i stacken, alltså 782.925
De som använt en RPM miniräknare (reverse polish notation) känner nog igen sig. Jag hade blandat ihop ordningsföljden på parametrarna til 'IF' tidigare, nu tror jag det blev rätt...
[plugin_OWFS]
sdfsd_item = soltemp_fran
sdfsd_path = 10.67C6697351FF/temperature
dffsd_item = soltemp_retur
dffsd_path = 10.67C6697351FF/temperature
gdfs_item = pump_running
gdfs_path = 12.EC0595000000/sensed.B
[plugin_Calculate]
fdsa_calc = pump_running;GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
fdsa_read = effekt_solpaneler
[pollvalues]
d20 = effekt_solpaneler
[graphcolors]
d20 = ******
Skalningen fixas av den magiska konstanten i: "21.45;MUL", värdet på den kan variera...
Jag ska bena ut exekveringen av uttrycket så blir det säkert klarare hur det fungerar:
1:
stack=[]
calc=pump_running;GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
...'pump_running' är inte en operator, så pusha det till stacken
2:
stack=['pump_running']
calc=GET;soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
...kör 'GET' kommandot = ta bort översta värdet från stacken, läs in data från en datapunkt med namnet som kom från stacken, pusha resultatet (1) tillbaka till stacken
3:
stack=[1]
calc=soltemp_fran;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
'soltemp_fran' är inte en operator, så pusha det till stacken
4:
stack=[1, 'soltemp_fran']
calc=GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
... kör GET
5:
stack=[1, 70.6]
calc=soltemp_retur;GET;SUB;21.45;MUL;0;IF
6:
stack=[1, 70.6, 'soltemp_retur']
calc=GET;SUB;21.45;MUL;0;IF
7:
stack=[1, 70.6, 34.1]
calc=SUB;21.45;MUL;0;IF
... kör SUB kommandot = ta två värden från stacken, subtrahera dem, pusha resultatet tillbaka till stacken
8:
stack=[1, 36.5]
calc=21.45;MUL;0;IF
9:
stack=[1, 36.5, 21.45]
calc=MUL;0;IF
... kör MUL kommandot = ta två värden från stacken, multiplicera dem, pusha resultatet tillbaka till stacken
10:
stack=[1, 782.925]
calc=0;IF
11:
stack=[1, 782.925, 0]
calc=IF
... kör 'IF' kommandot = ta tre värden från stacken, om det tredje är '1', pusha tillbaka det andra värdet (782.925), annars pusha tillbaka det första värdet (0).
12:
stack=[782.925]
calc=
'calc' är tom, returnera värdet längs upp i stacken, alltså 782.925
De som använt en RPM miniräknare (reverse polish notation) känner nog igen sig. Jag hade blandat ihop ordningsföljden på parametrarna til 'IF' tidigare, nu tror jag det blev rätt...
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
edit igen:
såhär är status just nu, en bild säger ju mer än 1000 ord,

edit:
gjorde en tuffare reset, nu rullar det, se skärmdump. Det räknar också!!!!
men den vill inte rita grafer, den försöker alltså hämta ett värde som inte finns, får rota i det under söndagen,
försöker också "fylla i 0" i silo fill up time, för att få en tidstämpel, fungerade igår men inte idag...

Stiligt!!!
imponerande,
två nya givare monterade, en på respektive fram och retur solpaneler, en vanlig hederlig kontaktor fick lösa problemet med 1/0 signal för att signalera huruvida solpumpen är i drift eller inte.
fungerar felfritt.
Ger 0 på sensed.B vid drift.
körde dessvärre fast i gammal vanlig ordning, puh,
tog bort alla values.conf filer samt rrd.db filen, redigerade min pellmon.conf fil, enligt nedan.
det går dessvärre inte att starta pellmonsrv, däremot så går det att stoppa den efter att jag inte har kunnat starta den, borde ju inte heller att gå att stoppa något som inte är startat?
./debugsrv,sh ger
ERROR: /usr/local/var/lib/pellmon/rrd.db: conversion of 'error' to float not complete: tail 'error'
root@server1:~# service pellmonsrv status
* pellmonsrv is running
root@server1:~# service pellmonsrv stop
* Stopping pellmonsrv... start-stop-daemon: warning: failed to kill 1789: No such process
No process in pidfile '/var/run/pellmonsrv/pellmonsrv.py.pid' found running; none killed.
Program pellmonsrv.py, 1 process(es), refused to die.
[fail]
root@server1:~# killall pellmonsrv
pellmonsrv: ingen process hittades
root@server1:~# service pellmonsrv start
* Starting pellmonsrv... pidfile /var/run/pellmonsrv/pellmonsrv.py.pid already exist. Daemon already running?
[fail]
root@server1:~#
############################################################################################
[enabled_plugins]
# List all plugins to enable pxx = PluginName
# Enable the ScotteCom plugin to communicate with a NBE scotty/woody/biocomfort pellet burner
#p01 = ScotteCom
# CustomAlarms lets you define limits and actions for data items
p02 = CustomAlarms
# RaspberryGPIO works only on a raspberry pi
#p03 = RaspberryGPIO
# The calculate plugin lets you calculate your own data from existing data items
p04 = Calculate
# The OWFS plugin connects to a running owfs server on localhost:4304 to read onewire devices
p05 = OWFS
# The SiloLevel plugin adds parameters for silo fill up level and silo fill up date.
# When present PellmonWeb displays a graph with calculated silo level from fill up time to present time
p06 = SiloLevel
# PelletCalc calculates feeder_time and power from feeder auger revolution count
p07 = PelletCalc
# Testplugin is a plugin template that does nothing useful
#p99 = TestPlugin
############################################################################################
[plugin_ScotteCom]
# The settings in this section are passed to the ScotteCom plugin
# Serial port device name, eg. /dev/ttyUSB0
# Remove to run with dummy data for testing
serialport = /dev/ttyUSB0
# Chip version string or 'auto'
chipversion = auto
[plugin_TestPlugin]
# Items in sections named as "plugin_xxx" are passed to a plugin named "xxx"
# This plugin adds the items listed as dummy parameters
plugindata1 = 123
[plugin_CustomAlarms]
# Define an alarm by creating four parameters:
# xxx_item = item to read
# xxx_comparator = >|>=|<|<=|==|!=
# xxx_level = level to compare against
# xxx_status = item to hold the result of the comparision, 1=True, 0=False
# optional:
# xxx_enum = FalseText|TrueText
# example:
alarm1_item = panna
alarm1_comparator = >
alarm1_level = 90
alarm1_status = boiler_temp_supervision
alarm1_enum = OK|pannan kokar
alarm2_item = fallror_pellets
alarm2_comparator = >
alarm2_level = 55
alarm2_status = boiler_temp_supervision
alarm2_enum = OK|bakbrand i fallror
alarm3_item = solpaneler
alarm3_comparator = >
alarm3_level = 110
alarm3_status = boiler_temp_supervision
alarm3_enum = OK|solfangarna kokar
[plugin_Calculate]
# This plugin implements a simple stack engine.
# xxx_calc = operator|value;operator|value;...
# xxx_read = item name to read to execute the calculation and retrive the result
# 'value' pushes the value to the stack, 'operator' pops one or several values,
# executes a calculation on it/them and pushes the result back to the stack
# Operators can be: ADD, SUB, MUL, DIV, GET, SET, EXEC, >, <, ==, !=, IF, POP
# GET pops an item name, reads the value and pushes the value or 'error'
# SET pops an item name and a value, then writes the value to the item name and pushes the result 'ok' or 'error'. ex: 85;boiler_temp;SET
# IF pops three values, first the value to push back when False, then the value to push back when True,
# and then the value to evaluate. Ex: 0;123;456;IF will leave '456' on the stack, while 1;123;456 will
# leave '123' on the stack
# EXEC pops a calculate item name, gets its value, executes it and pushes the result
# POP discards one value from the stack
# example: get boiler temperature divided by two from an item named 'half_boiler_temp'
#calc1_calc = boiler_temp;GET;2;DIV
#calc1_read = half_boiler_temp
fdsa_calc = pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
fdsa_read = effekt_solpaneler
[plugin_OWFS]
# xxx_item = item name for the owfs sensor value
# xxx_path = [server:]path[:port], default server:port is localhost:4304
# optional:
# when the type is set to COUNTER the owfs path is polled cyclically and the item incremented on every 0->1 transition
# xxx_type = R|R/W|COUNTER, default is R
# xxx_latch = path, when using a ds2406 as input/counter, use this to make use of it's latch
# Data item name = owfs_path
# This two reads the value and type from the fake sensor available in the default owfs configuration
bottentekniktank_item = botten_tekniktank
bottentekniktank_path = 28.84E92F040000/temperature
mittentekniktank_item = mitten_tekniktank
mittentekniktank_path = 28.770795040000/temperature
toppentekniktank_item = toppen_tekniktank
toppentekniktank_path = 28.D2E82F040000/temperature
framledning_item = framledning
framledning_path = 28.80E92F040000/temperature
returledning_item = returledning
returledning_path = 28.41B42F040000/temperature
utemperatur_item = utemperatur
utemperatur_path = 28.86BD2F040000/temperature
innetemperatur_item = innetemperatur
innetemperatur_path = 28.51DB2F040000/temperature
vinkallare_item = vinkallare
vinkallare_path = 28.8BC32F040000/temperature
toppenslavtank_item = toppen_slavtank
toppenslavtank_path = 28.F4AC2F040000/temperature
bottenslavtank_item = botten_slavtank
bottenslavtank_path = 28.FEDE2F040000/temperature
panna_item = panna
panna_path = 28.22CB2F040000/temperature
solpaneler_item = solpaneler
solpaneler_path = 28.DAC22F040000/temperature
fallrorpellets_item = fallror_pellets
fallrorpellets_path = 28CB9995040000/temperature
sdfsd_item = soltemp_fram
sdfsd_path = 28.531195040000/temperature
dffsd_item = soltemp_retur
dffsd_path = 28.674495040000/temperature
gdfs_item = pump_running
gdfs_path = 12.EC0595000000/sensed.B
#use a ds2460 as counter with support for the input latch
owfs2_item = ds2460count
owfs2_path = uncached/12.EC0595000000/sensed.A
owfs2_type = COUNTER
owfs2_latch = uncached/12.EC0595000000/latch.A
[plugin_PelletCalc]
# counter = item name to read feeder auger rev count from
counter = ds2460count
############################################################################################
[conf]
# Full path to the rrd database, if it does not exist it is created
# Remove if you do not want data polling
database = /usr/local/var/lib/pellmon/rrd.db
# Full path to the optional persistent rrd database. It is copied
# over the database file at startup, and on shutdown the database
# is copied to the persistent_db file. Useful if the database
# is in a ramdisk
#persistent_db = /usr/local/var/lib/pellmon/nvrrd.db
# If persistent_db is in use the database is copied to
# persistent_db every db_store_interval seconds
db_store_interval = 7200
# Full path to the logfile
logfile = /usr/local/var/log/pellmon/pellmon.log
# logging level = info/debug
loglevel = info
# Port number for the webserver
port = 8081
# rrd database update interval in seconds
pollinterval = 30
[authentication]
# username = password, for webinterface
**** = ****
[rrd_ds_names]
# These are the datasource names used when creating the rrd database,
# "dxx = datasource name". The left value (dxx) is used to match the
# datasource names to the actual data to write to it, in the
# pollvalues section. The datasource names can be anything, but
# the defaults are the same as the data item names in the pollvalues section
# The rrd database is created with the datasources in the order they appear here.
# Delete or rename the rrd database file after adding/removing ds-names
# or use some other method to add the new ds-name to the existing rrd database
d01 = botten_tekniktank
d02 = mitten_tekniktank
d03 = toppen_tekniktank
d04 = framledning
d05 = utemperatur
d06 = returledning
d07 = innetemperatur
d08 = vinkallare
d09 = feeder_time
d10 = feeder_capacity
d11 = _logtick
d12 = toppen_slavtank
d13 = botten_slavtank
d14 = panna
d15 = solpaneler
d16 = fallror_pellets
d17 = soltemp_fram
d18 = soltemp_retur
d19 = _extra8
d20 = extra9
[rrd_ds_types]
# Optional rrd data source type definitions for the datasource names in the
# rrd_ds-names section. If no type is defined for a datasource name the
# default type is used, "DS:%s:GAUGE:%u:U:U", where %s is replaced with the
# datasource name and %u is replaced with 4*pollinterval
d09 = DS:%s:COUNTER:%u:U:U
d11 = DS:%s:COUNTER:%u:U:U
[pollvalues]
# Data values to write to the rrd database.
# "dxx = parameter/data name"
# The data names are read from the protocol plugins with the getItem method
# and written to the rrd database ds-name that has a matching "dxx".
# Data names starting with an underscore are handled by special cases in the code,
# eg. _logtick is updated whenever a protocol reports that an "event" has occured.
# In general underscored names are written as undefined, so they can be used to
# write "spare" ds-names in an rrd database, to avoid having to recreate the rrd
# when more sensors are added.
d01 = botten_tekniktank
d02 = mitten_tekniktank
d03 = toppen_tekniktank
d04 = framledning
d05 = utemperatur
d06 = returledning
d07 = innetemperatur
d08 = vinkallare
d09 = feeder_time
d10 = feeder_capacity
# Whenever something is written to the log, _logtick is also increased.
# It is used to draw a tickmark in the graph
d11 = _logtick
d12 = toppen_slavtank
d13 = botten_slavtank
d14 = panna
d15 = solpaneler
d16 = fallror_pellets
d17 = soltemp_fram
d18 = soltemp_retur
d19 = _extra8
d20 = effekt_solpaneler
[graphcolors]
# To add a ds-name from the rrd-database to the graph, set
# dxx = #hexcolorvalue
d01 = #FF0000
d02 = #00FF00
d03 = #0000FF
d04 = #CC9999
d05 = #FF05FF
d06 = #222222
d07 = #207F20
d08 = #2F2FFF
d12 = #CCFF00
d13 = #99FF00
d14 = #770000
d15 = #FF9933
d16 = #900300
d17 = #FF9933
d18 = #900300
d20 = #FF05FF
############################################################################################
[email]
# Uncomment and set these for email on mode/alarm status changes
# Uses TLS, this works for gmail:
server=smtp.gmail.com:587
username=*****
password=*****
from=****
to=****
subject=PellMon status
#Send email when any of these change
conditions=alarm
#conditions=alarm,mode,parameter
[scaling]
# add optional scaling to the plotlines before drawing the graph
# The right axis will scale to match the scaled data, when there are
# several different scales in use it will match the first selected
# line in the order they appear here
#the offset is first subracted and the result is divided by the divisor
#dxx = offset:divisor#

såhär är status just nu, en bild säger ju mer än 1000 ord,

edit:
gjorde en tuffare reset, nu rullar det, se skärmdump. Det räknar också!!!!
men den vill inte rita grafer, den försöker alltså hämta ett värde som inte finns, får rota i det under söndagen,
försöker också "fylla i 0" i silo fill up time, för att få en tidstämpel, fungerade igår men inte idag...

Stiligt!!!
imponerande,
två nya givare monterade, en på respektive fram och retur solpaneler, en vanlig hederlig kontaktor fick lösa problemet med 1/0 signal för att signalera huruvida solpumpen är i drift eller inte.
fungerar felfritt.
Ger 0 på sensed.B vid drift.
körde dessvärre fast i gammal vanlig ordning, puh,
tog bort alla values.conf filer samt rrd.db filen, redigerade min pellmon.conf fil, enligt nedan.
det går dessvärre inte att starta pellmonsrv, däremot så går det att stoppa den efter att jag inte har kunnat starta den, borde ju inte heller att gå att stoppa något som inte är startat?
./debugsrv,sh ger
ERROR: /usr/local/var/lib/pellmon/rrd.db: conversion of 'error' to float not complete: tail 'error'
root@server1:~# service pellmonsrv status
* pellmonsrv is running
root@server1:~# service pellmonsrv stop
* Stopping pellmonsrv... start-stop-daemon: warning: failed to kill 1789: No such process
No process in pidfile '/var/run/pellmonsrv/pellmonsrv.py.pid' found running; none killed.
Program pellmonsrv.py, 1 process(es), refused to die.
[fail]
root@server1:~# killall pellmonsrv
pellmonsrv: ingen process hittades
root@server1:~# service pellmonsrv start
* Starting pellmonsrv... pidfile /var/run/pellmonsrv/pellmonsrv.py.pid already exist. Daemon already running?
[fail]
root@server1:~#
############################################################################################
[enabled_plugins]
# List all plugins to enable pxx = PluginName
# Enable the ScotteCom plugin to communicate with a NBE scotty/woody/biocomfort pellet burner
#p01 = ScotteCom
# CustomAlarms lets you define limits and actions for data items
p02 = CustomAlarms
# RaspberryGPIO works only on a raspberry pi
#p03 = RaspberryGPIO
# The calculate plugin lets you calculate your own data from existing data items
p04 = Calculate
# The OWFS plugin connects to a running owfs server on localhost:4304 to read onewire devices
p05 = OWFS
# The SiloLevel plugin adds parameters for silo fill up level and silo fill up date.
# When present PellmonWeb displays a graph with calculated silo level from fill up time to present time
p06 = SiloLevel
# PelletCalc calculates feeder_time and power from feeder auger revolution count
p07 = PelletCalc
# Testplugin is a plugin template that does nothing useful
#p99 = TestPlugin
############################################################################################
[plugin_ScotteCom]
# The settings in this section are passed to the ScotteCom plugin
# Serial port device name, eg. /dev/ttyUSB0
# Remove to run with dummy data for testing
serialport = /dev/ttyUSB0
# Chip version string or 'auto'
chipversion = auto
[plugin_TestPlugin]
# Items in sections named as "plugin_xxx" are passed to a plugin named "xxx"
# This plugin adds the items listed as dummy parameters
plugindata1 = 123
[plugin_CustomAlarms]
# Define an alarm by creating four parameters:
# xxx_item = item to read
# xxx_comparator = >|>=|<|<=|==|!=
# xxx_level = level to compare against
# xxx_status = item to hold the result of the comparision, 1=True, 0=False
# optional:
# xxx_enum = FalseText|TrueText
# example:
alarm1_item = panna
alarm1_comparator = >
alarm1_level = 90
alarm1_status = boiler_temp_supervision
alarm1_enum = OK|pannan kokar
alarm2_item = fallror_pellets
alarm2_comparator = >
alarm2_level = 55
alarm2_status = boiler_temp_supervision
alarm2_enum = OK|bakbrand i fallror
alarm3_item = solpaneler
alarm3_comparator = >
alarm3_level = 110
alarm3_status = boiler_temp_supervision
alarm3_enum = OK|solfangarna kokar
[plugin_Calculate]
# This plugin implements a simple stack engine.
# xxx_calc = operator|value;operator|value;...
# xxx_read = item name to read to execute the calculation and retrive the result
# 'value' pushes the value to the stack, 'operator' pops one or several values,
# executes a calculation on it/them and pushes the result back to the stack
# Operators can be: ADD, SUB, MUL, DIV, GET, SET, EXEC, >, <, ==, !=, IF, POP
# GET pops an item name, reads the value and pushes the value or 'error'
# SET pops an item name and a value, then writes the value to the item name and pushes the result 'ok' or 'error'. ex: 85;boiler_temp;SET
# IF pops three values, first the value to push back when False, then the value to push back when True,
# and then the value to evaluate. Ex: 0;123;456;IF will leave '456' on the stack, while 1;123;456 will
# leave '123' on the stack
# EXEC pops a calculate item name, gets its value, executes it and pushes the result
# POP discards one value from the stack
# example: get boiler temperature divided by two from an item named 'half_boiler_temp'
#calc1_calc = boiler_temp;GET;2;DIV
#calc1_read = half_boiler_temp
fdsa_calc = pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
fdsa_read = effekt_solpaneler
[plugin_OWFS]
# xxx_item = item name for the owfs sensor value
# xxx_path = [server:]path[:port], default server:port is localhost:4304
# optional:
# when the type is set to COUNTER the owfs path is polled cyclically and the item incremented on every 0->1 transition
# xxx_type = R|R/W|COUNTER, default is R
# xxx_latch = path, when using a ds2406 as input/counter, use this to make use of it's latch
# Data item name = owfs_path
# This two reads the value and type from the fake sensor available in the default owfs configuration
bottentekniktank_item = botten_tekniktank
bottentekniktank_path = 28.84E92F040000/temperature
mittentekniktank_item = mitten_tekniktank
mittentekniktank_path = 28.770795040000/temperature
toppentekniktank_item = toppen_tekniktank
toppentekniktank_path = 28.D2E82F040000/temperature
framledning_item = framledning
framledning_path = 28.80E92F040000/temperature
returledning_item = returledning
returledning_path = 28.41B42F040000/temperature
utemperatur_item = utemperatur
utemperatur_path = 28.86BD2F040000/temperature
innetemperatur_item = innetemperatur
innetemperatur_path = 28.51DB2F040000/temperature
vinkallare_item = vinkallare
vinkallare_path = 28.8BC32F040000/temperature
toppenslavtank_item = toppen_slavtank
toppenslavtank_path = 28.F4AC2F040000/temperature
bottenslavtank_item = botten_slavtank
bottenslavtank_path = 28.FEDE2F040000/temperature
panna_item = panna
panna_path = 28.22CB2F040000/temperature
solpaneler_item = solpaneler
solpaneler_path = 28.DAC22F040000/temperature
fallrorpellets_item = fallror_pellets
fallrorpellets_path = 28CB9995040000/temperature
sdfsd_item = soltemp_fram
sdfsd_path = 28.531195040000/temperature
dffsd_item = soltemp_retur
dffsd_path = 28.674495040000/temperature
gdfs_item = pump_running
gdfs_path = 12.EC0595000000/sensed.B
#use a ds2460 as counter with support for the input latch
owfs2_item = ds2460count
owfs2_path = uncached/12.EC0595000000/sensed.A
owfs2_type = COUNTER
owfs2_latch = uncached/12.EC0595000000/latch.A
[plugin_PelletCalc]
# counter = item name to read feeder auger rev count from
counter = ds2460count
############################################################################################
[conf]
# Full path to the rrd database, if it does not exist it is created
# Remove if you do not want data polling
database = /usr/local/var/lib/pellmon/rrd.db
# Full path to the optional persistent rrd database. It is copied
# over the database file at startup, and on shutdown the database
# is copied to the persistent_db file. Useful if the database
# is in a ramdisk
#persistent_db = /usr/local/var/lib/pellmon/nvrrd.db
# If persistent_db is in use the database is copied to
# persistent_db every db_store_interval seconds
db_store_interval = 7200
# Full path to the logfile
logfile = /usr/local/var/log/pellmon/pellmon.log
# logging level = info/debug
loglevel = info
# Port number for the webserver
port = 8081
# rrd database update interval in seconds
pollinterval = 30
[authentication]
# username = password, for webinterface
**** = ****
[rrd_ds_names]
# These are the datasource names used when creating the rrd database,
# "dxx = datasource name". The left value (dxx) is used to match the
# datasource names to the actual data to write to it, in the
# pollvalues section. The datasource names can be anything, but
# the defaults are the same as the data item names in the pollvalues section
# The rrd database is created with the datasources in the order they appear here.
# Delete or rename the rrd database file after adding/removing ds-names
# or use some other method to add the new ds-name to the existing rrd database
d01 = botten_tekniktank
d02 = mitten_tekniktank
d03 = toppen_tekniktank
d04 = framledning
d05 = utemperatur
d06 = returledning
d07 = innetemperatur
d08 = vinkallare
d09 = feeder_time
d10 = feeder_capacity
d11 = _logtick
d12 = toppen_slavtank
d13 = botten_slavtank
d14 = panna
d15 = solpaneler
d16 = fallror_pellets
d17 = soltemp_fram
d18 = soltemp_retur
d19 = _extra8
d20 = extra9
[rrd_ds_types]
# Optional rrd data source type definitions for the datasource names in the
# rrd_ds-names section. If no type is defined for a datasource name the
# default type is used, "DS:%s:GAUGE:%u:U:U", where %s is replaced with the
# datasource name and %u is replaced with 4*pollinterval
d09 = DS:%s:COUNTER:%u:U:U
d11 = DS:%s:COUNTER:%u:U:U
[pollvalues]
# Data values to write to the rrd database.
# "dxx = parameter/data name"
# The data names are read from the protocol plugins with the getItem method
# and written to the rrd database ds-name that has a matching "dxx".
# Data names starting with an underscore are handled by special cases in the code,
# eg. _logtick is updated whenever a protocol reports that an "event" has occured.
# In general underscored names are written as undefined, so they can be used to
# write "spare" ds-names in an rrd database, to avoid having to recreate the rrd
# when more sensors are added.
d01 = botten_tekniktank
d02 = mitten_tekniktank
d03 = toppen_tekniktank
d04 = framledning
d05 = utemperatur
d06 = returledning
d07 = innetemperatur
d08 = vinkallare
d09 = feeder_time
d10 = feeder_capacity
# Whenever something is written to the log, _logtick is also increased.
# It is used to draw a tickmark in the graph
d11 = _logtick
d12 = toppen_slavtank
d13 = botten_slavtank
d14 = panna
d15 = solpaneler
d16 = fallror_pellets
d17 = soltemp_fram
d18 = soltemp_retur
d19 = _extra8
d20 = effekt_solpaneler
[graphcolors]
# To add a ds-name from the rrd-database to the graph, set
# dxx = #hexcolorvalue
d01 = #FF0000
d02 = #00FF00
d03 = #0000FF
d04 = #CC9999
d05 = #FF05FF
d06 = #222222
d07 = #207F20
d08 = #2F2FFF
d12 = #CCFF00
d13 = #99FF00
d14 = #770000
d15 = #FF9933
d16 = #900300
d17 = #FF9933
d18 = #900300
d20 = #FF05FF
############################################################################################
[email]
# Uncomment and set these for email on mode/alarm status changes
# Uses TLS, this works for gmail:
server=smtp.gmail.com:587
username=*****
password=*****
from=****
to=****
subject=PellMon status
#Send email when any of these change
conditions=alarm
#conditions=alarm,mode,parameter
[scaling]
# add optional scaling to the plotlines before drawing the graph
# The right axis will scale to match the scaled data, when there are
# several different scales in use it will match the first selected
# line in the order they appear here
#the offset is first subracted and the result is divided by the divisor
#dxx = offset:divisor#
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Jag antar att det är effekt_solpaneler som returnerar 'error'. Börja med att sätta fdsa_calc till någon siffra bara för att kolla att felet försvinner.
"pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF" fungerar då jag testar det, men jag märkte just att det räcker med att få in ett extra mellanslag på början eller slutet så fungerar inte uttrycket, så här finns plats för förbättringar. Ta sedan ett steg åt gången, först bara "pump_running;GET", och kolla att effekt_solpaneler läser ger 1 el 0 och inte 'error' och så vidare tills hela uttrycket fungerar
"pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF" fungerar då jag testar det, men jag märkte just att det räcker med att få in ett extra mellanslag på början eller slutet så fungerar inte uttrycket, så här finns plats för förbättringar. Ta sedan ett steg åt gången, först bara "pump_running;GET", och kolla att effekt_solpaneler läser ger 1 el 0 och inte 'error' och så vidare tills hela uttrycket fungerar
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Japp, sannolikt något extra mellanslag, nu fungerar uträkningen!
Nu till nya frågor...
Jag missade dessvärre lektionen med rpm miniräknare,
min pump är i drift när pump_running = 0
Och om jag vill få den att presentera ett resultat när pump_running = 0
och inte när pump_running = 1
hur inverterar jag då ovanstående för att passa in i förutsättningen?
en annan sak som jag upptäckte precis, när skruven stannar precis när brytaren är intryckt, alltså 0 så räknar den något enstaka varv, trots att latch A är 0
(5 varv på 10 min, just nu)
kanske inte någon skillnad över årsbasis men kan ju vara bra att veta.
Då ska jag bara försöka få igång silolevel, den vill inte fylla i datum automatiskt när jag fyller i mängd trots att jag deletade "values.conf" filen för silolevel. (provade även att fylla i manuellt)
vilket får till resultat att grafiken för silolevel inte startar, den var dock igång igår.
Nu till nya frågor...
Jag missade dessvärre lektionen med rpm miniräknare,
min pump är i drift när pump_running = 0
Och om jag vill få den att presentera ett resultat när pump_running = 0
och inte när pump_running = 1
hur inverterar jag då ovanstående för att passa in i förutsättningen?
en annan sak som jag upptäckte precis, när skruven stannar precis när brytaren är intryckt, alltså 0 så räknar den något enstaka varv, trots att latch A är 0
(5 varv på 10 min, just nu)
kanske inte någon skillnad över årsbasis men kan ju vara bra att veta.
Då ska jag bara försöka få igång silolevel, den vill inte fylla i datum automatiskt när jag fyller i mängd trots att jag deletade "values.conf" filen för silolevel. (provade även att fylla i manuellt)
vilket får till resultat att grafiken för silolevel inte startar, den var dock igång igår.
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Ok, jag började fixa lite med calculate grejen igår så det ska nog bli mer robust i framtiden.
Förresten så bestämde jag mig för att byta till små bokstäver, ersätta ; med mellanslag och byta ADD MUL DIV SUB IF till + * / - ?. Du får förstås skriva om ditt 'script' om (då...) du uppgraderar PellMon men jag kom till att "1 2 + 3 *" ser bättre ut än "1;2;ADD;3;MUL". IF ersätts av ett frågetecken för att ge plats för en "riktig" if then [else] end sats. Lade till en min och max operator också och cyklisk körning av 'scriptet', men sedan får det nog räcka. Man kan ju alltid koda direkt i python om man behöver mera funktionalitet.
Konstigt om inte tiden fylls i automatiskt då du ställer in kg i 'silolevel', fungerar här... Men sidan refreshar inte automatiskt (ska väl fixa det också nån gång), så du får trycka på F5 efter att du ställt in kg, för att se att tiden är ifylld. Då du ändrar tiden måste den sedan vara i samma format "dd/mm/yy hh:mm". (Tänkte ändra tidsformatet till iso-standard YYYY-MM-DD nån gång...)
För att 'invertera pumpen' blir det från detta:
pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
till detta:
pump_running;GET;0;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;IF
Förresten så bestämde jag mig för att byta till små bokstäver, ersätta ; med mellanslag och byta ADD MUL DIV SUB IF till + * / - ?. Du får förstås skriva om ditt 'script' om (då...) du uppgraderar PellMon men jag kom till att "1 2 + 3 *" ser bättre ut än "1;2;ADD;3;MUL". IF ersätts av ett frågetecken för att ge plats för en "riktig" if then [else] end sats. Lade till en min och max operator också och cyklisk körning av 'scriptet', men sedan får det nog räcka. Man kan ju alltid koda direkt i python om man behöver mera funktionalitet.
Konstigt om inte tiden fylls i automatiskt då du ställer in kg i 'silolevel', fungerar här... Men sidan refreshar inte automatiskt (ska väl fixa det också nån gång), så du får trycka på F5 efter att du ställt in kg, för att se att tiden är ifylld. Då du ändrar tiden måste den sedan vara i samma format "dd/mm/yy hh:mm". (Tänkte ändra tidsformatet till iso-standard YYYY-MM-DD nån gång...)
För att 'invertera pumpen' blir det från detta:
pump_running;GET;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;0;IF
till detta:
pump_running;GET;0;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;IF
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Självklart kommer jag att uppgradera!
ett perfekt program för mina behov,
jo nu räknar den när solpumpen är igång och inte tvärtom, tvångskörde solpumpen igen en stund och nu ritar den och räknar på minussidan, vilket är korrekt eftersom jag kör baklänges.
- 180 visades efter en kort stund.
får försöka finna ut någon konstant också så att det blir kopplat till verkligheten.
och mycket riktigt, hade jag bara uppdaterat sidan efter att jag fyllt i silolevel fill up så hade jag inte behövt ställa min förra fråga, det rullar.
du undrade tidigare varför jag envisas med att köra som root, gjorde inte det förr, vilket skapade mer fel än att köra som root.
ett perfekt program för mina behov,
jo nu räknar den när solpumpen är igång och inte tvärtom, tvångskörde solpumpen igen en stund och nu ritar den och räknar på minussidan, vilket är korrekt eftersom jag kör baklänges.
- 180 visades efter en kort stund.
får försöka finna ut någon konstant också så att det blir kopplat till verkligheten.
och mycket riktigt, hade jag bara uppdaterat sidan efter att jag fyllt i silolevel fill up så hade jag inte behövt ställa min förra fråga, det rullar.
du undrade tidigare varför jag envisas med att köra som root, gjorde inte det förr, vilket skapade mer fel än att köra som root.
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Perfekt!
Man blir så lätt blind själv för vad som fungerar och inte fungerar så det är verkligt bra att få hjälp med testandet.
Man blir så lätt blind själv för vad som fungerar och inte fungerar så det är verkligt bra att få hjälp med testandet.
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Var i beräkningen lägger jag in min konstant som jag vill multiplicera med?
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.
Re: PellMon logger/setup-program för biocomfort/scotte/woody
Byt ut 'exempelkonstanten' 21.45 till vad det nu ska vara
Om man skriver om detta:
pump_running;GET;0;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;IF
till ett 'vanligt' uttryck istället för rpn så blir det så här
if get('spump_running') then return(0) else return( (get('soltemp_fram') - get('soltemp_retur')) * 21.45 )
Men det är lite jobbigare att skriva en parser för ett sådant uttryck så därför rpn...
Om man skriver om detta:
pump_running;GET;0;soltemp_fram;GET;soltemp_retur;GET;SUB;21.45;MUL;IF
till ett 'vanligt' uttryck istället för rpn så blir det så här
if get('spump_running') then return(0) else return( (get('soltemp_fram') - get('soltemp_retur')) * 21.45 )
Men det är lite jobbigare att skriva en parser för ett sådant uttryck så därför rpn...
Termax 25Cr med spaksotning, Bio Comfort + lambda + kompressorrengöring, 10m skorsten med 125mm insatsrör. 8t bulkförråd. Matene vertikalskruv. https://github.com/motoz/PellMon open source pelletlogger
Re: PellMon logger/setup-program för biocomfort/scotte/woody
feature request;
tänkte att jag skulle formulera denna något bättre när det gäller energi/effekt.
tänker mig att man kopierar "consumption" fliken i pellmonweb och kallar en ny "energy" eller liknande.
grafiken och uppställningarna kunde vara likvärdig som den under consumption fliken.
inputen får helt enkelt vara det svar som räknas ut i plugin_Calculate
"read"värdet används , i det värdet finns redan alla förutsättningar vad gäller konstant samt gångtid.
eller ser jag för enkelt på det hela?
denna funktion borde kunna användas till ett antal olika sysslor förutom solfångare,
energioptimering
energiförluster ( till eller från något, eller varför inte i kulvert)
pool
varmvatten
kyla
tänkte att jag skulle formulera denna något bättre när det gäller energi/effekt.
tänker mig att man kopierar "consumption" fliken i pellmonweb och kallar en ny "energy" eller liknande.
grafiken och uppställningarna kunde vara likvärdig som den under consumption fliken.
inputen får helt enkelt vara det svar som räknas ut i plugin_Calculate
"read"värdet används , i det värdet finns redan alla förutsättningar vad gäller konstant samt gångtid.
eller ser jag för enkelt på det hela?
denna funktion borde kunna användas till ett antal olika sysslor förutom solfångare,
energioptimering
energiförluster ( till eller från något, eller varför inte i kulvert)
pool
varmvatten
kyla
Viking bio 20 i en vedolux 40, ackumulatortankar och 15m2 solfångare.