Kann man das eleganter intern in Fhem lösen

Begonnen von horni, 19 Februar 2023, 15:40:19

Vorheriges Thema - Nächstes Thema

horni

Habe an einem Funkthermostat einen digitalen Poti angelötet da mir das entschlüsseln des Funkprotokolls zu blöd war.
Jetzt habe ich das per Shell Skript gelöst und zwar so

Zitat
#!/bin/bash

# List Temps
pins=(0.0 -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 -1.7 -1.8 -1.9 -2.0 -2.1 -2.2   -2.3 -2.4 -2.5 -2.6 -2.7 -2.8   -2.9 -3.0 -3.1 -3.2 -3.3 -3.4   -3.5 -3.6 -3.7 -3.8 -3.9 -4.0   -4.1 -4.2 -4.3 -4.4 -4.5 -4.6 -4.7 -4.8 -4.9 -5.0 -5.1 -5.2 -5.3 -5.4 -5.5 -5.6 -5.7 -5.8 -5.9 -6.0 -6.1 -6.2 -6.3 -6.4 -6.5 -6.6 -6.7 -6.8 -6.9 -7.0 -7.1 -7.2 -7.3 -7.4 -7.5 -7.6 -7.7 -7.8 -7.9 -8.0 -8.1 -8.2   -8.3 -8.4 -8.5 -8.6 -8.7 -8.8   -8.9 -9.0 -9.1 -9.2 -9.3 -9.4 -9.5 -9.6 -9.7 -9.8 -9.9 -10.0 -10.1 -10.2 -10.3 -10.4 -10.5 -10.6 -10.7 -10.8 -10.9 -11.0 -11.1 -11.2 -11.3 -11.4 -11.5 -11.6 -11.7 -11.8 -11.9 -12.0 -12.1 -12.2 -12.3 -12.4 -12.5 -12.6 -12.7 -12.8 -12.9 -13.0 -13.1 -13.2 -13.3 -13.4 -13.5 -13.6 -13.7 -13.8 -13.9 -14.0 -14.1 -14.2 -14.3 -14.4 -14.5 -14.6 -14.7 -14.8 -14.9 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 55.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10.0 10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 11.0 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 12.0 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 13.0 13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 14.0 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 15.0 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 16.0 16.1 16.2 16.3 16.4 16.5 16.6 16.7 16.8 16.9 17.0 17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 18.0 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 18.9 19.0 19.1 19.2 19.3 19.4 19.5 19.6 19.7 19.8 19.9 20.0 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0 21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.9 22.0 22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 23.0 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 24.0 24.1 24.2 24.3 24.4 24.5 24.6 24.7 24.8 24.9 25.0 25.1 25.2 25.3 25.4 25.5 25.6 25.7 25.8 25.9 26.00 26.1 26.2 26.3 26.4 26.5 26.6 26.7 26.8 26.9 27.0 27.1 27.2 27.3 27.4 27.5 27.6 27.7 27.8 27.9 28.0 28.1 28.2 28.3 28.4 28.5 28.6 28.7 28.8 28.9 29.0 29.1 29.2 29.3 29.4 29.5 29.6 29.7 29.8 29.9 30.0 30.1 30.2 30.3 30.4 30.5 30.6 30.7 30.8 30.9 31.0 31.1 31.2 31.3 31.4 31.5 31.6 31.7 31.8 31.9 32.0 32.1 32.2 32.3 32.4 32.5 32.6 32.7 32.8 32.9 33.0 33.1 33.2 33.3 33.4 33.5 33.6 33.7 33.8 33.9 34.0 34.1 34.2 34.3 34.4 34.5 34.6 34.7 34.8 34.9 35.0 35.1 35.2 35.3 35.4 35.5 35.6 35.7 35.8 35.9 36.0 36.1 36.2 36.3 36.4 36.5 36.6 36.7 36.8 36.9 37.0 37.1 37.2 37.3 37.4 37.5 37.6 37.7 37.8 37.9 38.0 38.1 38.2 38.3 38.4 38.5 38.6 38.7 38.8 38.9 39.0 39.1 39.2 39.3 39.4 39.5 39.6 39.7 39.8 39.9 40.0 40.1 40.2 40.3 40.4 40.5 40.6 40.7 40.8 40.9)

# List Poti
files=(123 122 121 120 120 120 120 119 119 118 117 117 116 116 115 115 114 114 113 113 113 112 111 111 110 109 108 108 107 107 106 106 105 105 104 103 103 102 101 100 100 99 99 99 98 97 96 96 95 95 94 93 92 92 91 90 89 89 88 87 86 86 85 85 84 83 82 81 81 80 79 78 77 76 76 75 74 73 72 71 70 70 69 68 67 66 65 64 63 62 61 60 58 58 57 55 55 54 53 51 50 50 49 49 48 46 46 45 45 44 43 42 42 41 40 39 38 38 37 35 34 34 33 33 32 30 30 29 28 26 25 25 24 23 22 20 19 18 17 15 15 14 13 13 11 10 9 7 6 5 123 124 124 125 126 126 127 128 129 129 129 130 130 131 132 133 133 134 135 135 136 136 137 137 138 138 139 140 140 140 141 142 142 143 143 144 144 144 145 145 146 147 147 148 148 148 149 149 150 151 151 152 152 152 152 153 153 153 154 154 155 155 155 156 156 157 157 157 157 157 158 159 159 160 160 160 161 161 161 162 162 162 163 163 163 164 164 165 165 166 166 166 166 166 167 167 167 168 168 168 169 169 169 170 170 171 171 172 172 173 173 173 174 174 174 175 175 175 175 176 176 177 177 178 178 179 179 179 179 179 180 180 181 181 182 182 182 183 183 183 183 183 184 184 184 184 184 185 185 186 186 186 187 187 187 187 187 187 188 188 188 189 189 190 190 190 190 190 191 191 191 191 191 192 192 192 193 193 193 193 193 193 194 194 194 194 195 195 195 196 196 196 196 196 196 196 196 197 197 197 197 198 198 198 199 199 199 199 200 200 200 200 201 201 201 201 202 202 202 202 202 202 203 203 203 203 204 204 204 204 205 205 205 205 206 206 206 206 207 207 207 207 208 208 208 208 208 208 208 208 209 209 209 209 209 210 210 210 210 210 211 211 211 212 212 212 212 212 212 212 212 212 213 213 213 213 213 213 213 213 213 213 213 213 214 214 214 214 214 214 215 215 215 215 216 216 216 216 216 216 216 216 216 216 216 217 217 217 217 217 218 218 218 218 218 218 219 219 219 219 219 219 220 220 220 220 220 220 220 221 221 221 221 221 221 221 221 222 222 222 222 222 222 222 223 223 223 223 223 223 223 223 223   223 224 224 224 224 224 224 225 225 225 225 225 225 225 225 225 225 225 225 225 225 226 226 226 226 226 226 226 227 227 227 227 227 227 227 227 227 227 227 228 228 228 228 228 228 228 229 229 229 229 229 229 229 229 229 229)

# vergleich
for i in ${!pins
  • }
    do
        if [ "$1" == "${pins[$i]}" ]
      then
        /usr/bin/perl /opt/fhem/fhem.pl 7072 "set arschloch ${files[$i]}"
      fi

    done
Also der Poti hat 255 Schritte. Das Skript macht jetzt nichts anderes als einer Temperatur einen diesen 255 Werte zuzuweisen. Dieser wird dann wieder nach fhem geschickt und da dann zu einem ESP8266
Geht sowas irgendwie in DOIF oder notify einfacher ?
Denke auch das Shell Skript nicht gerade sehr Ressourcen schonend ist.
Habe jetzt auch schon wieder ein Projekt wo ich wieder das selbe Szenario habe.

betateilchen

Kannst Du den Potiwert irgendwo aus FHEM heraus auslesen?
Gibt es keine Funktion, mit der man aus dem Temperaturwert den Potiwert errechnen kann?

Das mit den zwei Arrays funktioniert zwar, aber es ist halt mühselig.
Wegen der Performance beim Shell Skript brauchst Du Dir aber keine Gedanken machen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

stefan-dd

Warum machst Du das nicht alles auf dem ESP und schickst saubere Werte an Fhem?

Damian

Es sollte zuerst die Werte plotten, um zu schauen, welchen Zusammenhang es zwischen den Werten gibt, vielleicht kommt er mit einer linearen Funktionsabbildungen schon aus. Ggf. kann er mit Hilfe einer Regression eine Funktion x-ter Ordnung bestimmen, dafür gibt es Rechner, die man mit Daten füllt, die das machen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

pink99panther

Habe das mit einer CSV-Datei gelöst.
Reihe 1 Azimut
Reihe 2 Elevation der ,,Skyline"

Damit berechnet mein fhem in einer ausgelagerten Funktion mit Text::CSV::Slurp und einem DOIF,
ob die Sonne ins Fenster scheint, oder von irgend etwas verdeckt wird.


horni

#5
Also das mit CSV sieht glaube ich ganz gut aus. Genau das was ich gesucht habe. Hast du da gleich einen Perl Code zu Hand oder soll ich mir selber was zusammen basteln ?

Also gleich in Esp  machen ist gut. Ich habe mal spaßhalber die Formel für die Wiederstandsberechnung mit rein genommen. Damit kann man ja dann ausrechnen welche Temperatur dann welchen Wiederstand haben muss. Problem: Der digitale Poti verhält sich nicht Linear. Das heißt ein Schritt sind nicht gleich immer Plus 2 KOhm . Damit hast du dann auch wieder das Problem das du sagen musst wenn jetzt du 13,2 KOHm brauchst da auch wieder vergleichen musst . Also das selbe in grün


pink99panther

Hallo horni,

hier die Funktion in der 99_readCSVUtils.pm
##################### Routine zum Einlesen einer CSV-Datei
#Module Install Instructions
#
#To install Text::CSV::Slurp, copy and paste the appropriate command in to your #terminal.
#
#cpanm
###########################
#cpanm Text::CSV::Slurp   #
###########################
#
#CPAN shell
###########################
#perl -MCPAN -e shell     #
#install Text::CSV::Slurp #
###########################
#For more information on module installation, please visit the detailed CPAN #module installation guide.

#!/usr/bin/perlpackage main;
use strict;
use warnings;
use POSIX;
use strict;
use warnings;
use Text::CSV::Slurp;
sub readCSVUtils_Initialize($$)
{
my ($hash) = @_;
}
####################################################################
sub
readCSV ($$){
my ($csvDatei, $Spalte) = @_;
my $slurp = Text::CSV::Slurp->new();
my $Wert;my $Datum;
# CSV Options - see Text::CSV
my %csv_options = (
sep_char => ';',
binary => '1',
);
# Reference to an array of hashes
my $data = $slurp->load( file => $csvDatei, %csv_options );
foreach my $row (@$data) {
$Wert = $row->{$Spalte};}
return $Wert
}
1;


Und hier das zugehörige DOIF
defmod di_Kue2 DOIF ([Twilight:azimuth] and [TempDiff:Sonne] eq "on" and [$SELF:shad_ele] < [Twilight:elevation])\
(set du_SSW Kue2br 36000)\
DOELSEIF\
([Twilight:azimuth] and [LaCrosse_16:temperature] > [du_SSW:ShadTemp] and [$SELF:shad_ele] < [Twilight:elevation])\
(set du_SSW Kue2br 36000)\
DOELSE\
(set du_SSW Kue2br [SonnenSensor:Lux_av])
attr di_Kue2 checkall event
attr di_Kue2 comment Rollladen soll, wenn Temperatur über [du_SSW:ShadTemp] auch ohne Sonne on beschatten.
attr di_Kue2 do always
attr di_Kue2 room Rollläden
attr di_Kue2 userReadings shad_ele {readCSV("/opt/fhem/Kue2.csv",int(ReadingsVal("Twilight","azimuth",0)+.5))}

setstate di_Kue2 cmd_3
setstate di_Kue2 2023-02-27 17:20:38 Device LaCrosse_16
setstate di_Kue2 2023-02-27 17:20:38 cmd 3
setstate di_Kue2 2023-02-27 17:20:38 cmd_event LaCrosse_16
setstate di_Kue2 2023-02-27 17:20:38 cmd_nr 3
setstate di_Kue2 2023-02-27 17:20:38 e_LaCrosse_16_temperature 4.6
setstate di_Kue2 2023-02-27 17:17:14 e_TempDiff_Sonne off
setstate di_Kue2 2023-02-27 17:20:26 e_Twilight_azimuth 249.83
setstate di_Kue2 2023-02-27 17:20:26 e_Twilight_elevation 6.56
setstate di_Kue2 2022-08-04 17:11:07 e_du_SSW_ShadTemp 25
setstate di_Kue2 2022-08-04 17:07:15 mode enabled
setstate di_Kue2 2023-02-27 17:20:38 shad_ele 18
setstate di_Kue2 2023-02-27 17:20:38 state cmd_3


P.S. Gibt es keine linearen Digitalpotis, wie bei den analogben?

Damian

Du kannst es per Funktion lösen - wie von mir bereits vorgeschlagen:

$temp = 6.62296e-8*$poti**4-0.000025*$poti**3+0.003577*$poti**2-0.075667*$poti-13.2812;

Im Randbereich gibt es eine Abweichung von ca. 1 Grad, sonst ca. 0,1 Grad
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

horni

Also erst mal besten Dank. Hilft mir echt sehr weiter

Damian also auch da Respekt. Ich wäre niemals auf so eine Formel gekommen. Gut.... Mathe war noch nie meine stärke. Aber echt super das es Leute wie euch gibt

Mit besten Dank

horni

Damian

#9
Zitat von: horni am 01 März 2023, 17:59:00
Ich wäre niemals auf so eine Formel gekommen.

Ich auch nicht, wenn es dafür nicht Programme gäbe :)

PS: Nennt sich: Regression vierter Ordnung.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF