24 456 läst · 74 svar
24k läst
74 svar
Tempövervakning med 1-wire
Såg att data.php inte kom med..
Den ser ut så här
-------------------------
<?php
require("/opt/owfs/share/php/OWNet/ownet.php");
$sensorConfig='/home/1wire/etc/sensors.conf';
$WebData = array();
# Read sensor config
$sensor = (array)json_decode(file_get_contents($sensorConfig));
$ow=new OWNet("tcp://127.0.0.1:3001");
foreach ($sensor as $key => $val) {
$data = round($ow->read("/$key$val->path"),1);
if($data == 0) {
$data = round($ow->read("/$key$val->path"),1);
}
$WebData[$key] = array(
#"data" => round(file_get_contents("/mnt/1wire/$key$val->path"),1),
"data" => $data,
"position" => $val->position,
"unit" => $val->unit,
"comment" => $val->comment
);
}
unset($ow);
echo json_encode($WebData);
?>
---------------
/home/1wire/etc/sensors.conf ser ut såhär
---------------
{
"28.79FD85030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_top_temp.rrd","position":"A","comment":""},
"10.456830020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_25_temp.rrd","position":"B","comment":""},
"10.E26630020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_50_temp.rrd","position":"C","comment":""},
"10.D2A630020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_75_temp.rrd","position":"D","comment":""},
"28.ACC085030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_bottom_temp.rrd","position":"E","comment":""},
"10.00A930020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_top_temp.rrd","position":"F","comment":""},
"10.70A130020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_25_temp.rrd","position":"G","comment":""},
"10.5DA130020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_50_temp.rrd","position":"H","comment":""},
"10.5D9F30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_75_temp.rrd","position":"I","comment":""},
"28.D50186030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_bottom_temp.rrd","position":"J","comment":""},
"28.251C86030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"expansion_temp.rrd","position":"K","comment":""},
"10.EB7230020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"laddomattopp_temp.rrd","position":"L","comment":""},
"28.444186030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tankretur_temp.rrd","position":"M","comment":""},
"28.46F085030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"rokgas_skorsten_temp.rrd","position":"N","comment":""},
"10.D46B30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"panntopp_temp.rrd","position":"O","comment":""},
"28.A3E785030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"pannbotten_temp.rrd","position":"P","comment":""},
"30.ED8DA1120000":{"unit":"\u00b0C","path":"/typeK/temperature","rrdfile":"rokgas_panna_temp.rrd","position":"Q","comment":""},
"20.6CF30F000000":{"unit":"v","path":"/volt.C","rrdfile":"panna_lamda.rrd","position":"Q","comment":""},
"10.A37C30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"outside_temp.rrd","position":"R","comment":"Utomhus"},
"28.09C785030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"inside_temp.rrd","position":"R","comment":"Inomhus"},
"10.267530020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"stigare_temp.rrd","position":"S","comment":""},
"30.CB8CA1120000":{"unit":"\u00b0C","path":"/typeK/temperature","rrdfile":"rokgas_eldstad_temp.rrd","position":"T","comment":""},
"10.D78B30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_1_temp.rrd","position":"U","comment":""},
"10.739A30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_2_temp.rrd","position":"V","comment":""},
"10.6F8230020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_3_temp.rrd","position":"W","comment":""},
"10.5B6C30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_4_temp.rrd","position":"X","comment":""}
}
---------------
Den ser ut så här
-------------------------
<?php
require("/opt/owfs/share/php/OWNet/ownet.php");
$sensorConfig='/home/1wire/etc/sensors.conf';
$WebData = array();
# Read sensor config
$sensor = (array)json_decode(file_get_contents($sensorConfig));
$ow=new OWNet("tcp://127.0.0.1:3001");
foreach ($sensor as $key => $val) {
$data = round($ow->read("/$key$val->path"),1);
if($data == 0) {
$data = round($ow->read("/$key$val->path"),1);
}
$WebData[$key] = array(
#"data" => round(file_get_contents("/mnt/1wire/$key$val->path"),1),
"data" => $data,
"position" => $val->position,
"unit" => $val->unit,
"comment" => $val->comment
);
}
unset($ow);
echo json_encode($WebData);
?>
---------------
/home/1wire/etc/sensors.conf ser ut såhär
---------------
{
"28.79FD85030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_top_temp.rrd","position":"A","comment":""},
"10.456830020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_25_temp.rrd","position":"B","comment":""},
"10.E26630020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_50_temp.rrd","position":"C","comment":""},
"10.D2A630020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_75_temp.rrd","position":"D","comment":""},
"28.ACC085030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_1_bottom_temp.rrd","position":"E","comment":""},
"10.00A930020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_top_temp.rrd","position":"F","comment":""},
"10.70A130020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_25_temp.rrd","position":"G","comment":""},
"10.5DA130020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_50_temp.rrd","position":"H","comment":""},
"10.5D9F30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_75_temp.rrd","position":"I","comment":""},
"28.D50186030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tank_2_bottom_temp.rrd","position":"J","comment":""},
"28.251C86030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"expansion_temp.rrd","position":"K","comment":""},
"10.EB7230020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"laddomattopp_temp.rrd","position":"L","comment":""},
"28.444186030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"tankretur_temp.rrd","position":"M","comment":""},
"28.46F085030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"rokgas_skorsten_temp.rrd","position":"N","comment":""},
"10.D46B30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"panntopp_temp.rrd","position":"O","comment":""},
"28.A3E785030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"pannbotten_temp.rrd","position":"P","comment":""},
"30.ED8DA1120000":{"unit":"\u00b0C","path":"/typeK/temperature","rrdfile":"rokgas_panna_temp.rrd","position":"Q","comment":""},
"20.6CF30F000000":{"unit":"v","path":"/volt.C","rrdfile":"panna_lamda.rrd","position":"Q","comment":""},
"10.A37C30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"outside_temp.rrd","position":"R","comment":"Utomhus"},
"28.09C785030000":{"unit":"\u00b0C","path":"/temperature","rrdfile":"inside_temp.rrd","position":"R","comment":"Inomhus"},
"10.267530020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"stigare_temp.rrd","position":"S","comment":""},
"30.CB8CA1120000":{"unit":"\u00b0C","path":"/typeK/temperature","rrdfile":"rokgas_eldstad_temp.rrd","position":"T","comment":""},
"10.D78B30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_1_temp.rrd","position":"U","comment":""},
"10.739A30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_2_temp.rrd","position":"V","comment":""},
"10.6F8230020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_3_temp.rrd","position":"W","comment":""},
"10.5B6C30020800":{"unit":"\u00b0C","path":"/temperature","rrdfile":"retur_4_temp.rrd","position":"X","comment":""}
}
---------------
Liten update från min sida...
Efter en massa googlande på smurfens kod så sprang jag på nåt som heter imagemagick och efter lite klurande lyckade jag lösa hur man får imagemagick att slänga in 1-wire värden på en bild vilket var första målet...
Tanken med bilden är inte att vinna en skönhetstävling, utan mer ett test till att börja med.
Scriptet som jag kör att för att få in värdet i bilden ser ut som följer
Efter en massa googlande på smurfens kod så sprang jag på nåt som heter imagemagick och efter lite klurande lyckade jag lösa hur man får imagemagick att slänga in 1-wire värden på en bild vilket var första målet...
Tanken med bilden är inte att vinna en skönhetstävling, utan mer ett test till att börja med.
Scriptet som jag kör att för att få in värdet i bilden ser ut som följer
Och ja, jag är förpassad till ett litet skyffe under trappan för mina tester... :blushing:
Finns ju olika sätt att lösa det på. Min variant är att istället för att lägga in siffror i själva bilden med imagemagick eller liknande så kör jag en ren CSS-lösning. Bilden är en png som jag ritat upp, och med hjälp av CSS styr jag så att siffrorna hamnar på rätt plats i bilden. Gradienten som visar temperaturfördelningen i acktanken är även det gjort med CSS, och gradienten beräknas baserat på de olika värden som tanken har på olika nivåer. Tyvärr så är siffrorna på acktanken bara fake än så länge, måste gräva fram tanken från all isolering innan jag kan sätta dit riktiga sensorer så det dröjer ett tag innan det är gjort men när det väl är klart så hoppas jag att det kommer bli lätt att se hur "laddad" tanken är bara med hjälp av färgen.
Med tanke på hur olika CSS brukar hanteras av olika browsers så funkar det förvånansvärt bra, ser faktiskt lika bra ut på mobilen som på datorn.
Med tanke på hur olika CSS brukar hanteras av olika browsers så funkar det förvånansvärt bra, ser faktiskt lika bra ut på mobilen som på datorn.
Tanken som slog mig är väl att imagemagick kan vara lite processor tungt att uppdatera en bild varje gång. Med CSS så läggs väl detta på browsern istället?Taken skrev:
Du har inte nån länk eller exempel på kod hur man löser det?
Gärna då hur man läser av själva temperaturen i CSS...
Redigerat:
För dom som inte vill använda Linux så har jag skrivit en com+ applikation som använder
SQL-server eller liknande databas för lagring...
Lägger med hjälpfilen här som förklarar lite om systemet om nån har intresse...
Hum... filen kom inte med... är det nån som vet om man bara kan länka bilder..
nu såg jag att det är bara vissa filendelser som är ok...
SQL-server eller liknande databas för lagring...
Lägger med hjälpfilen här som förklarar lite om systemet om nån har intresse...
Hum... filen kom inte med... är det nån som vet om man bara kan länka bilder..
nu såg jag att det är bara vissa filendelser som är ok...
Redigerat:
Jo exakt, det blir ju mycket lätt för servern och det blir upp till browsern att hantera det istället vilket kan vara ett plus. Tror också det kan vara lite mer flexibelt att göra som jag gör med CSS. Något som inte syns i bilden är att jag också ändrar färg på rutan bakom temperaturerna om de överskrider vissa värden, så om utloppen från pannan till exempel börjar närma sig kokpunkten så blir det först gult, sedan orange och till sist rött (och larmnivåerna är kopplade till att också skicka notifikationer till mig, för tillfället via mail men tänker fixa en android-klient som sköter det via push också men det är en annan sak).
Exempelkod var det ja, den HTML som genereras av PHP ser ut såhär ungefär (bara relevanta delar):
Exempelkod var det ja, den HTML som genereras av PHP ser ut såhär ungefär (bara relevanta delar):
Där ser du magin som används för gradienten, vilken färg jag väljer vid de olika punkterna är som sagt baserat på vad temperaturen är där (eller kommer att vara när jag väl har sensorerna på plats). Siffrorna läggs in i de olika burner_value div-taggarna, och de har en position som du ser i deras style. Utöver den style som är i själva taggen så är det också en del i css-filen, tror detta ska vara allt som är relevant:<div id="burner_wrapper">
<div id="burner_image">
<img src="images/Panna2.png" />
</div><div id="tank"
style="
background: #ff3236; /* Old browsers */
background: -moz-linear-gradient(top, #ffaa33 5%, #ffaa33 30%, #ffd533 50%, #ffff33 70%, #ccff33 95%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(5%,#ffaa33), color-stop(30%,#ffaa33), color-stop(50%,#ffd533), color-stop(70%,#ffff33), color-stop(95%,#ccff33)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #ffaa33 5%, #ffaa33 30%, #ffd533 50%, #ffff33 70%, #ccff33 95%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #ffaa33 5%, #ffaa33 30%, #ffd533 50%, #ffff33 70%, #ccff33 95%); /* Opera11.10+ */
background: -ms-linear-gradient(top, #ffaa33 5%, #ffaa33 30%, #ffd533 50%, #ffff33 70%, #ccff33 95%); /* IE10+ */
/*filter: progidXImageTransform.Microsoft.gradient( startColorstr='#ff3236', endColorstr='#0000ff',GradientType=0 );*/ /* IE6-9 */
background: linear-gradient(top, #ffaa33 5%, #ffaa33 30%, #ffd533 50%, #ffff33 70%, #ccff33 95%); /* W3C */
"></div><div class="burner_value " style="left: 77px; top: 70px">24.5</div>
<div class="burner_value " style="left: 172px; top: 437px">23.5</div>
<div class="burner_value " style="left: 342px; top: 418px">22.5</div>
<div class="burner_value " style="left: 16px; top: 316px">16.5</div>
<div class="burner_value " style="left: 875px; top: 14px">80</div>
<div class="burner_value " style="left: 875px; top: 106px">78</div>
<div class="burner_value " style="left: 875px; top: 198px">70</div>
<div class="burner_value " style="left: 875px; top: 291px">65</div>
<div class="burner_value " style="left: 875px; top: 384px">60</div>
</div>
<div id="temperature_legend">
<ul>
<li class="first">0°C</li>
<li>10°C</li>
<li>20°C</li>
<li>30°C</li>
<li>40°C</li>
<li>50°C</li>
<li>60°C</li>
<li>70°C</li>
<li>80°C</li>
<li>90°C</li>
<li class="last">100°C</li>
</ul>
<div id="temperature_legend_image"></div>
</div>
Nä den HTML som jag gav dig genereras ju alltså dynamiskt av php, så där temperaturen står (24.5, 23.5, 22,5, 16,5 osv) så har det värdet ju skrivits dit av php. php-koden för att skriva ut just själva div-taggen där tempvärdena står är i mitt fall denna:
Är inte så nöjd med min kod att jag vill lämna ut all källkod, det är ju trots allt ett hemmahack som är anpassat efter just mina specifika behov, men kodsnuttarna borde ju i alla fall ge lite tips om vad som går att göra...function print_sensor($bus, $id, $type, $value, $posx, $posy) {
global $mysqli;
$result = do_query($mysqli,
"SELECT * FROM alarm WHERE bus='$bus' AND id='$id' AND type='$type' and state='RAISED'");
if ($result === FALSE) {
die("Select failed when loading alarms: ".$mysqli->error."\n");;
}
$alarms = array();
$alarm_notification = false;
$alarm_warning = false;
$alarm_critical = false;
while ($row = $result->fetch_assoc()) {
$alarms[] = $row;
switch ($row['level']) {
case 'NOTIFICATION':
$alarm_notification = true;
break;
case 'WARNING':
$alarm_warning = true;
break;
case 'CRITICAL':
$alarm_critical = true;
break;
default:
die("Unknown alarm level {$row['level']}");
break;
}
}
$alarm_class = $alarm_critical ? 'critical' : ($alarm_warning ? 'warning' : ($alarm_notification ? 'notification' : ''));
print "<div class=\"burner_value $alarm_class\" style=\"left: $posx; top: $posy\">$value</div>\n";
}
Nu är äntligen 1-wire räknarna installerade och tickar på. Den jag köpte har två räknare vilket passa utmärkt då man har två mätare i skåpet.
Men... :blushing: (Pinsamt ja)
När jag skalade kablarna så skalade jag även bort markeringen på vilken räknare som går till vilken elmätare, men så här ser graferna ut.
Jag har två grupper, en för hushåll och en för värmen (eluppvärmt hus). Mätaren för hushållselen omfattar även VVB. Då det inte hunnit bli riktigt kallt så går inte elementen på fullt ös ännu. Så jag tolkar den högra bilden som värmen (ett element som ligger slår av o på) och den vänstra som hushållselen (VVB som slår till lite då o då och kokplattor samt ugn när vi lagade mat igår runt 18).
Delar ni min tolkning?
Men... :blushing: (Pinsamt ja)
När jag skalade kablarna så skalade jag även bort markeringen på vilken räknare som går till vilken elmätare, men så här ser graferna ut.
Jag har två grupper, en för hushåll och en för värmen (eluppvärmt hus). Mätaren för hushållselen omfattar även VVB. Då det inte hunnit bli riktigt kallt så går inte elementen på fullt ös ännu. Så jag tolkar den högra bilden som värmen (ett element som ligger slår av o på) och den vänstra som hushållselen (VVB som slår till lite då o då och kokplattor samt ugn när vi lagade mat igår runt 18).
Delar ni min tolkning?
"problem" solved...gadu^ skrev:Nu är äntligen 1-wire räknarna installerade och tickar på. Den jag köpte har två räknare vilket passa utmärkt då man har två mätare i skåpet.
Men... :blushing: (Pinsamt ja)
När jag skalade kablarna så skalade jag även bort markeringen på vilken räknare som går till vilken elmätare, men så här ser graferna ut.
Jag har två grupper, en för hushåll och en för värmen (eluppvärmt hus). Mätaren för hushållselen omfattar även VVB. Då det inte hunnit bli riktigt kallt så går inte elementen på fullt ös ännu. Så jag tolkar den högra bilden som värmen (ett element som ligger slår av o på) och den vänstra som hushållselen (VVB som slår till lite då o då och kokplattor samt ugn när vi lagade mat igår runt 18).
Delar ni min tolkning?
Har lite svårigheter med att använda libraryt. HAr du tips på hur själva anropen till dina library borde se ut? (Lite dålig på C-programmering..)menygards skrev:Jag har gjort ett enkelt "library" baserat på koden i ett inlägg på Arduino Forum ([länk]) - se bifogade Word-fil.
Observera att koden i nuvarande utformning förutsätter att termoelementinterfacet sitter på en egen 1-wire-pinne (kommandot write(SKIP)). Om man har flera givare på bussen, får man komplettera med kod för adressering av den aktuella givaren.
Mvh Jens
Här är ett Arduino-program (Visa bilaga OWtest_pde.doc) som jag använt för att testa temperaturavläsning från termoelement ("sensor 1") och "vanlig" temperaturgivare ("sensor 2"). Hoppas det kan vara till någon hjälp.
/M-E
/M-E
Tack så mycket för koden! Tyvärr så kommer jag inte längre med detta exempel. Jag får resultatet "ovf" enligt nedan:
Requesting temperature from Device 2...DONE
Temperature for Device 1 is: ovf
Temperature for Device 2 is: 0.00
Så långt kom jag med ditt library igår också. Trodde dock att jag hade kodat något fel då. Jag har en DS2762B från m.nu som jag försöker läsa av. Med OneWire-libraryt till Arduino kan jag läsa av sensorn men tänkte nyttja dina rutiner för ColdJunction kompensation och temperaturkonvertering... Jag jobbar vidare men tar gärna emot tips...
Requesting temperature from Device 2...DONE
Temperature for Device 1 is: ovf
Temperature for Device 2 is: 0.00
Så långt kom jag med ditt library igår också. Trodde dock att jag hade kodat något fel då. Jag har en DS2762B från m.nu som jag försöker läsa av. Med OneWire-libraryt till Arduino kan jag läsa av sensorn men tänkte nyttja dina rutiner för ColdJunction kompensation och temperaturkonvertering... Jag jobbar vidare men tar gärna emot tips...