Hi Heiko,
ich bekomme seit dem letzten DbRep update eine Division durch null, die ich mir nicht erklären kann.
Das ist das innere SELECT, was ein richtiges Ergebnis liefert und ohne Fehler läuft.
Internals:
DATABASE fhem
DEF LogDB
FUUID 5f3a5796-f33f-61a8-e1ac-2438b1322f15e59a
FVERSION 93_DbRep.pm:v8.46.12-s25411/2022-01-02
LASTCMD sqlCmd SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP, t2.DEVICE, @readingname AS READING, cast(if(avg(t2.FACTOR) > 1.6, 1.6, avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP, t1.HOUR, t1.DEVICE, t1.READING, t1.VALUE, if(@diff = 0,NULL, @temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF, cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR, @diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP, date(h.TIMESTAMP) AS DATE, hour(h.TIMESTAMP) AS HOUR, h.DEVICE, h.READING, h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0;
MODEL Client
NAME LogDBRep_PV_Forecast_SQL
NOTIFYDEV global,LogDBRep_PV_Forecast_SQL
NR 432
NTFY_ORDER 50-LogDBRep_PV_Forecast_SQL
ROLE Client
STATE done
TYPE DbRep
UTF8 1
HELPER:
DBLOGDEVICE LogDB
GRANTS USAGE,ALL PRIVILEGES
IDRETRIES 2
MINTS 2019-04-03 00:23:42
PACKAGE main
SQLHIST SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0 order by TIMESTAMP;,SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0;,SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0 ;,select * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE FROM history WHERE DEVICE=@device AND READING LIKE 'Statistic_%Year' AND READING NOT LIKE '%Autarky%' and READING NOT LIKE '%Rate%' AND TIMESTAMP>STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'-12-31'),'%Y-%m-%d') AND TIMESTAMP<STR_TO_DATE(CONCAT(YEAR(CURDATE()),'-01-01'),'%Y-%m-%d') order by TIMESTAMP desc limit 15 ) AS x1 GROUP BY x1.READING ;,DELETE FROM history WHERE DEVICE='PV_1' AND READING='Solar_Calculation_fc0' AND TIMESTAMP>='2021-02-28 07:00:00'
VERSION 8.46.12
DBREPCOL:
COLSET 1
DEVICE 64
EVENT 0
READING 64
TYPE 64
UNIT 32
VALUE 128
OLDREADINGS:
READINGS:
2022-01-27 20:01:59 SqlResultRow_01 TIMESTAMP|DEVICE|READING|VALUE
2022-01-27 20:01:59 SqlResultRow_02 2022-01-27 09:00:00|WR_1|Solar_Correction_Faktor_auto|1.6
2022-01-27 20:01:59 SqlResultRow_03 2022-01-27 10:00:00|WR_1|Solar_Correction_Faktor_auto|1.6
2022-01-27 20:01:59 SqlResultRow_04 2022-01-27 11:00:00|WR_1|Solar_Correction_Faktor_auto|1.4
2022-01-27 20:01:59 SqlResultRow_05 2022-01-27 12:00:00|WR_1|Solar_Correction_Faktor_auto|0.9
2022-01-27 20:01:59 SqlResultRow_06 2022-01-27 13:00:00|WR_1|Solar_Correction_Faktor_auto|0.8
2022-01-27 20:01:59 SqlResultRow_07 2022-01-27 14:00:00|WR_1|Solar_Correction_Faktor_auto|0.7
2022-01-27 20:01:59 SqlResultRow_08 2022-01-27 15:00:00|WR_1|Solar_Correction_Faktor_auto|0.6
2022-01-27 20:01:59 SqlResultRow_09 2022-01-27 16:00:00|WR_1|Solar_Correction_Faktor_auto|0.3
2022-01-27 20:01:59 SqlResultRow_10 2022-01-27 17:00:00|WR_1|Solar_Correction_Faktor_auto|0.1
2022-01-27 20:01:59 SqlResultRow_11 2022-01-27 08:00:00|WR_1|Solar_Correction_Faktor_auto|0.2
2022-01-27 20:01:59 sqlCmd SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP, t2.DEVICE, @readingname AS READING, cast(if(avg(t2.FACTOR) > 1.6, 1.6, avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP, t1.HOUR, t1.DEVICE, t1.READING, t1.VALUE, if(@diff = 0,NULL, @temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF, cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR, @diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP, date(h.TIMESTAMP) AS DATE, hour(h.TIMESTAMP) AS HOUR, h.DEVICE, h.READING, h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0;
2022-01-27 20:01:59 sqlResultNumRows 10
2022-01-27 20:01:59 state done
Attributes:
DbLogExclude .*
allowDeletion 1
room System
sqlCmdHistoryLength 5
sqlCmdVars SET @days:=30, @corr:=0.7, @diff:=0, @temp:=0, @device:='WR_1', @reading1:='SW_Total_DC_P_sumOfAllPVInputs', @reading2:='Solar_Calculation_fc0', @readingname:='Solar_Correction_Faktor_auto' ;
Jetzt kommt noch ein INSERT drum herum und der Fehler tritt auf.
Internals:
DATABASE fhem
DEF LogDB
FUUID 5f3a5796-f33f-61a8-e1ac-2438b1322f15e59a
FVERSION 93_DbRep.pm:v8.46.12-s25411/2022-01-02
LASTCMD sqlCmd INSERT INTO history (TIMESTAMP,DEVICE,READING,VALUE) SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP, t2.DEVICE, @readingname AS READING, cast(if(avg(t2.FACTOR) > 1.6, 1.6, avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP, t1.HOUR, t1.DEVICE, t1.READING, t1.VALUE, if(@diff = 0,NULL, @temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF, cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR, @diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP, date(h.TIMESTAMP) AS DATE, hour(h.TIMESTAMP) AS HOUR, h.DEVICE, h.READING, h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0 ON DUPLICATE KEY UPDATE VALUE=t3.VALUE;
MODEL Client
NAME LogDBRep_PV_Forecast_SQL
NOTIFYDEV global,LogDBRep_PV_Forecast_SQL
NR 432
NTFY_ORDER 50-LogDBRep_PV_Forecast_SQL
ROLE Client
STATE error
TYPE DbRep
UTF8 1
HELPER:
DBLOGDEVICE LogDB
GRANTS USAGE,ALL PRIVILEGES
IDRETRIES 2
MINTS 2019-04-03 00:23:42
PACKAGE main
SQLHIST SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0 order by TIMESTAMP;,SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0;,SELECT TIMESTAMP,DEVICE,READING,VALUE FROM ( SELECT DATE_ADD(CURDATE(),INTERVAL t2.HOUR HOUR) AS TIMESTAMP,t2.DEVICE,@readingname AS READING,cast(if(avg(t2.FACTOR) > 1.6,1.6,avg(t2.FACTOR) ) AS DECIMAL(2,1)) AS VALUE FROM ( SELECT * FROM ( SELECT t1.TIMESTAMP,t1.HOUR,t1.DEVICE,t1.READING,t1.VALUE,if(@diff = 0,NULL,@temp:=cast((t1.VALUE-@diff) AS DECIMAL(6,2))) AS DIFF,cast((t1.VALUE/(t1.VALUE+(-1*@temp))*@corr) AS DECIMAL(4,1)) AS FACTOR,@diff:=t1.VALUE AS curr_V FROM ( SELECT h.TIMESTAMP,date(h.TIMESTAMP) AS DATE,hour(h.TIMESTAMP) AS HOUR,h.DEVICE,h.READING,h.VALUE FROM history AS h WHERE h.DEVICE = @device AND (h.READING = @reading1 OR h.READING = @reading2) AND h.TIMESTAMP >= DATE_SUB(DATE(now()),INTERVAL @days DAY) AND h.TIMESTAMP <= CURDATE() AND MINUTE(h.TIMESTAMP) = 0 AND h.VALUE >= 0 GROUP BY DATE,HOUR,h.READING,h.DEVICE,h.TIMESTAMP )t1 )tx WHERE READING != @reading2 AND HOUR > 6 )t2 GROUP BY t2.HOUR,t2.DEVICE )t3 WHERE t3.VALUE != 0 ;,select * FROM (SELECT TIMESTAMP,READING,cast(VALUE/1000 AS decimal(6)) AS VALUE FROM history WHERE DEVICE=@device AND READING LIKE 'Statistic_%Year' AND READING NOT LIKE '%Autarky%' and READING NOT LIKE '%Rate%' AND TIMESTAMP>STR_TO_DATE(CONCAT(YEAR(CURDATE())-1,'-12-31'),'%Y-%m-%d') AND TIMESTAMP<STR_TO_DATE(CONCAT(YEAR(CURDATE()),'-01-01'),'%Y-%m-%d') order by TIMESTAMP desc limit 15 ) AS x1 GROUP BY x1.READING ;,DELETE FROM history WHERE DEVICE='PV_1' AND READING='Solar_Calculation_fc0' AND TIMESTAMP>='2021-02-28 07:00:00'
VERSION 8.46.12
DBREPCOL:
COLSET 1
DEVICE 64
EVENT 0
READING 64
TYPE 64
UNIT 32
VALUE 128
OLDREADINGS:
READINGS:
2022-01-27 20:06:24 errortext DBD::mysql::st execute failed: Division by 0 at ./FHEM/93_DbRep.pm line 10576.
2022-01-27 20:06:24 state error
Attributes:
DbLogExclude .*
allowDeletion 1
room System
sqlCmdHistoryLength 5
sqlCmdVars SET @days:=30, @corr:=0.7, @diff:=0, @temp:=0, @device:='WR_1', @reading1:='SW_Total_DC_P_sumOfAllPVInputs', @reading2:='Solar_Calculation_fc0', @readingname:='Solar_Correction_Faktor_auto' ;
Kann das mit dem Aufräumen zu tun haben?
VG
Christian