Liebe alle!
Vielleicht is es eh keine Anfängerfrage, wenn nicht, bitte schubst mich in die richtige Richtung.
Ich habe einen Feinstaubsensor bei dem ich plötzliche Anstiege der Feinstaubkonzentration von der Baseline unterscheiden will. Da die Baseline sich aber durch Pollenflug und Saharastaub über das Jahr verschiebt, dachte ich eine 24h Median wäre als Baseline ausreichend robust. Das würde ich gerne mittel SQL Abfrage lösen. Der Part funktioniert soweit. Woran ich scheitere ist das eigentlich Triviale: wie bekomme ich den Wert aus meiner Subroutine raus? Ich wollte das mit einer Variabel und setreading lösen, aber FHEM schmeißt mir bei einem für mich erstmal korrekt wirkenden Code Fehlermeldungen.
define particulatematter_average DOIF (ReadingsAge("ParticulateMatter", "PM25.average", 0) > 86400) { \
my $result = fhem("set ParticulateMatter PM25.average " . fhem("SELECT AVG(m.value) FROM (SELECT \@rownum:=\@rownum+1 as `row_number`, m.value FROM (SELECT \@rownum:=0) r, (SELECT value FROM history WHERE device = 'ParticulateMatter' AND reading = 'PM25' AND eventTime > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 24 HOUR)) ORDER BY value) m) as `median_calc` WHERE `row_number` IN (FLOOR((\@rownum+1)/2), FLOOR((\@rownum+2)/2))"));;\
fhem("setreading ParticulateMatter PM25.average $result");;\
}
Fehlermeldung:
fhem("setreading ParticulateMatter PM25.average $result"); }: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
Weiß jemand Rat?
Danke, lg,
Matthias
Zitat von: Mad-at am 28 Februar 2023, 17:43:02
Liebe alle!
Vielleicht is es eh keine Anfängerfrage, wenn nicht, bitte schubst mich in die richtige Richtung.
Ich habe einen Feinstaubsensor bei dem ich plötzliche Anstiege der Feinstaubkonzentration von der Baseline unterscheiden will. Da die Baseline sich aber durch Pollenflug und Saharastaub über das Jahr verschiebt, dachte ich eine 24h Median wäre als Baseline ausreichend robust. Das würde ich gerne mittel SQL Abfrage lösen. Der Part funktioniert soweit. Woran ich scheitere ist das eigentlich Triviale: wie bekomme ich den Wert aus meiner Subroutine raus? Ich wollte das mit einer Variabel und setreading lösen, aber FHEM schmeißt mir bei einem für mich erstmal korrekt wirkenden Code Fehlermeldungen.
define particulatematter_average DOIF (ReadingsAge("ParticulateMatter", "PM25.average", 0) > 86400) { \
my $result = fhem("set ParticulateMatter PM25.average " . fhem("SELECT AVG(m.value) FROM (SELECT \@rownum:=\@rownum+1 as `row_number`, m.value FROM (SELECT \@rownum:=0) r, (SELECT value FROM history WHERE device = 'ParticulateMatter' AND reading = 'PM25' AND eventTime > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 24 HOUR)) ORDER BY value) m) as `median_calc` WHERE `row_number` IN (FLOOR((\@rownum+1)/2), FLOOR((\@rownum+2)/2))"));;\
fhem("setreading ParticulateMatter PM25.average $result");;\
}
Fehlermeldung:
fhem("setreading ParticulateMatter PM25.average $result"); }: Usage: setreading <name> [YYYY-MM-DD HH:MM:SS] <reading> <value>
where <name> is a single device name, a list separated by comma (,) or a regexp. See the devspec section in the commandref.html for details.
Weiß jemand Rat?
Danke, lg,
Matthias
logge $result, dann wirst du vielleicht das Problem sehen
Danke! Hmmm er sagt dass $result nicht initialisiert ist... aber es ist doch initialisiert? ???
Es hängt davon ab, was dein fhem-Befehl zurückliefert, undef ist z. B. nicht initialisiert.